LyoKICogQ29weXJpZ2h0IChjKSAyMDE5IEFybSBMaW1pdGVkCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyoqCiAqIFxmaWxlIHN5c2NvdW50ZXJfYXJtdjgtbV9jbnRybF9kcnYuYwogKgogKiBcYnJpZWYgRHJpdmVyIGZvciBBcm12OC1NIFN5c3RlbSBDb3VudGVyIENvbnRyb2wsIGNvdmVyaW5nIENOVENvbnRyb2xCYXNlCiAqICAgICAgICBGcmFtZQogKgogKiBUaGlzIFN5c3RlbSBDb3VudGVyIGlzIGEgNjQtYml0IHVwLWNvdW50ZXIsIGdlbmVyYXRpbmcgdGhlIHBoeXNpY2FsCiAqIGNvdW50IGZvciBTeXN0ZW0gVGltZXIuCiAqCiAqIE1haW4gZmVhdHVyZXM6CiAqICAgLSBFbmFibGVkL2Rpc2FibGUgYW5kIFNldC9HZXQgdGhlIDY0LWJpdCB1cGNvdW50ZXIKICogICAtIDIgc2NhbGluZyByZWdpc3RlciBmb3IgdGhlIDIgY2xvY2sgc291cmNlcwogKiAgICAgICAtIFRoZXNlIHJlZ2lzdGVycyBhcmUgdXNlZCB0byBwcmUtcHJvZ3JhbSB0aGUgc2NhbGluZyB2YWx1ZXMgc28KICogICAgICAgICAgdGhhdCB3aGVuIGhhcmR3YXJlIGJhc2VkIGNsb2NrIHN3aXRjaGluZyBpcyBpbXBsZW1lbnRlZCB0aGVyZSBpcyBubwogKiAgICAgICAgICBuZWVkIHRvIHByb2dyYW0gdGhlIHNjYWxpbmcgaW5jcmVtZW50IHZhbHVlIGVhY2ggdGltZSB3aGVuIGNsb2NrIGlzCiAqICAgICAgICAgIHN3aXRjaGVkLgogKiAgICAgICAgLSBXaGVuIGNvdW50ZXIgc2NhbGluZyBpcyBlbmFibGVkLCBTY2FsZVZhbCBpcyB0aGUgYW1vdW50IGFkZGVkIHRvIHRoZQogKiAgICAgICAgICBDb3VudGVyIENvdW50IFZhbHVlIGZvciBldmVyeSBwZXJpb2Qgb2YgdGhlIGNvdW50ZXIgYXMgZGV0ZXJtaW5lZAogKiAgICAgICAgICBieSAxL0ZyZXF1ZW5jeSBmcm9tIHRoZSBjdXJyZW50IG9wZXJhdGluZyBmcmVxdWVuY3kgb2YgdGhlIHN5c3RlbQogKiAgICAgICAgICBjb3VudGVyICh0aGUgk2NvdW50ZXIgdGlja5QpLgogKiAgICAgICAgLSBTY2FsZVZhbCBpcyBleHByZXNzZWQgYXMgYW4gdW5zaWduZWQgZml4ZWQtcG9pbnQgbnVtYmVyIHdpdGgKICogICAgICAgICAgYSA4IGJpdCBpbnRlZ2VyIHZhbHVlIGFuZCBhIDI0LWJpdCBmcmFjdGlvbmFsIHZhbHVlCiAqICAgLSBJbnRlcnJ1cHQgZm9yIGVycm9yIGRldGVjdGlvbgogKiAgICAgICBUaGVyZSBhcmUgMiBwb3NzaWJsZSByZWFzb25zIGZvciBlcnJvciBub3RpZmljYXRpb24gZ2VuZXJhdGlvbiBmcm9tCiAqICAgICAgIHRoZSBDb3VudGVyOgogKiAgICAgICAgIDEuIFNlY3VyaXR5IGF0dHJpYnV0ZSBtaXNtYXRjaCBiZXR3ZWVuIHJlZ2lzdGVyIGFjY2VzcyBhbmQgc2VjdXJpdHkKICogICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlIENPTlRST0wgZnJhbWUKICogICAgICAgICAyLiBBZGRyZXNzIGRlY29kZSBlcnJvciB3aXRoaW4gYSBnaXZlbiBmcmFtZQogKgogKi8KCiNpbmNsdWRlICJzeXNjb3VudGVyX2FybXY4LW1fY250cmxfZHJ2LmgiCgovKiogU2V0dGVyIGJpdCBtYW5pcHVsYXRpb24gbWFjcm8gKi8KI2RlZmluZSBTRVRfQklUKFdPUkQsIEJJVF9JTkRFWCkgKChXT1JEKSB8PSAoMVUgPDwgKEJJVF9JTkRFWCkpKQovKiogQ2xlYXJpbmcgYml0IG1hbmlwdWxhdGlvbiBtYWNybyAqLwojZGVmaW5lIENMUl9CSVQoV09SRCwgQklUX0lOREVYKSAoKFdPUkQpICY9IH4oMVUgPDwgKEJJVF9JTkRFWCkpKQovKiogR2V0dGVyIGJpdCBtYW5pcHVsYXRpb24gbWFjcm8gKi8KI2RlZmluZSBHRVRfQklUKFdPUkQsIEJJVF9JTkRFWCkgKGJvb2wpICgoKFdPUkQpICYgKDFVIDw8IChCSVRfSU5ERVgpKSkpCi8qKiBDbGVhci1hbmQtU2V0IGJpdCBtYW5pcHVsYXRpb24gbWFjcm8gKi8KI2RlZmluZSBBU1NJR05fQklUKFdPUkQsIEJJVF9JTkRFWCwgVkFMVUUpIChXT1JEID0gKChXT1JEICYgfigxVSA8PCAoQklUX0lOREVYKSkpIHwgKFZBTFVFIDw8IChCSVRfSU5ERVgpKSkpCi8qKiBHZXR0ZXIgYml0LWZpZWxkIG1hbmlwdWxhdGlvbiBtYWNybyAqLwojZGVmaW5lIEdFVF9CSVRfRklFTEQoV09SRCwgQklUX01BU0ssIEJJVF9PRkZTRVQpICgoV09SRCAmIEJJVF9NQVNLKSA+PiBCSVRfT0ZGU0VUKQovKiogQml0IG1hc2sgZm9yIGdpdmVuIHdpZHRoIGJpdC1maWVsZCBtYW5pcHVsYXRpb24gbWFjcm8gKi8KI2RlZmluZSBCSVRNQVNLKHdpZHRoKSAoKDF1IDw8ICh3aWR0aCkpIC0gMSkKCi8qKgogKiBcYnJpZWYgQ05UQ29udHJvbEJhc2UgUmVnaXN0ZXIgbWFwIHN0cnVjdHVyZQogKi8Kc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90CnsKICAgIHZvbGF0aWxlIHVpbnQzMl90IGNudGNyOwogICAgLyohPCBPZmZzZXQ6IDB4MDAwIChSL1cpIENvdW50ZXIgQ29udHJvbCBSZWdpc3RlciAqLwogICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgY250c3I7CiAgICAvKiE8IE9mZnNldDogMHgwMDQgKFJPKSBDb3VudGVyIFN0YXR1cyBSZWdpc3RlciAqLwogICAgdm9sYXRpbGUgdWludDMyX3QgY250Y3ZfbG93OwogICAgLyohPCBPZmZzZXQ6IDB4MDA4IChSL1cpIENvdW50ZXIgQ291bnQgVmFsdWUgWzMxOjBdIFJlZ2lzdGVyICovCiAgICB2b2xhdGlsZSB1aW50MzJfdCBjbnRjdl9oaWdoOwogICAgLyohPCBPZmZzZXQ6IDB4MDBDIChSL1cpIENvdW50ZXIgQ291bnQgVmFsdWUgWzYzOjMyXSBSZWdpc3RlciAqLwogICAgdm9sYXRpbGUgdWludDMyX3QgY250c2NyOwogICAgLyohPCBPZmZzZXQ6IDB4MDEwIChSL1cpIENvdW50ZXIgU2NhbGUgUmVnaXN0ZXIKICAgICAqICAgQWxpYXNlZCB3aXRoIENOVFNDUjAsIG1lYW5pbmcgdGhhdCBlaXRoZXIgYWRkcmVzc2VzIG9mIENOVFNDUiBhbmQKICAgICAqICAgQ05UU0NSMCB3aWxsIHBoeXNpY2FsbHkgYWNjZXNzIGEgc2luZ2xlIHJlZ2lzdGVyCiAgICAgKi8KICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IHJlc2VydmVkMFsyXTsKICAgIC8qITwgT2Zmc2V0OiAweDAxNC0weDAxOCBSZXNlcnZlZCAoUkFaV0kpICovCiAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCBjbnRpZDsKICAgIC8qITwgT2Zmc2V0OiAweDAxQyAoUk8pIENvdW50ZXIgSUQgUmVnaXN0ZXIgKi8KICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IHJlc2VydmVkMVs0MF07CiAgICAvKiE8IE9mZnNldDogMHgwMjAtMHgwQkMgUmVzZXJ2ZWQgKFJBWldJKSAqLwogICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgcmVzZXJ2ZWQyWzRdOwogICAgLyohPCBPZmZzZXQ6IDB4MEMwLTB4MENDIFJlc2VydmVkIChSQVpXSSkgKi8KICAgIHZvbGF0aWxlIHVpbnQzMl90IGNudHNjcjA7CiAgICAvKiE8IE9mZnNldDogMHgwRDAgKFIvVykgQ291bnRlciBTY2FsZSBSZWdpc3RlciAwICovCiAgICB2b2xhdGlsZSB1aW50MzJfdCBjbnRzY3IxOwogICAgLyohPCBPZmZzZXQ6IDB4MEQ0IChSL1cpIENvdW50ZXIgU2NhbGUgUmVnaXN0ZXIgMSAqLwogICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgcmVzZXJ2ZWQzWzk1OF07CiAgICAvKiE8IE9mZnNldDogMHgwRDgtMHhGQ0MgUmVzZXJ2ZWQgKFJBWldJKSAqLwogICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgY250cGlkcjQ7CiAgICAvKiE8IE9mZnNldDogMHhGRDAgKFJPKSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyICovCiAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCByZXNlcnZlZDRbM107CiAgICAvKiE8IE9mZnNldDogMHhGRDQtMHhGREMgUmVzZXJ2ZWQgKFJBWldJKSAqLwogICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgY250cGlkcjA7CiAgICAvKiE8IE9mZnNldDogMHhGRTAgKFJPKSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyICovCiAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCBjbnRwaWRyMTsKICAgIC8qITwgT2Zmc2V0OiAweEZFNCAoUk8pIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgKi8KICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBpZHIyOwogICAgLyohPCBPZmZzZXQ6IDB4RkU4IChSTykgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAqLwogICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgY250cGlkcjM7CiAgICAvKiE8IE9mZnNldDogMHhGRUMgKFJPKSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyICovCiAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCBjbnRjaWRyMDsKICAgIC8qITwgT2Zmc2V0OiAweEZGMCAoUk8pIENvbXBvbmVudCBJRCBSZWdpc3RlciAqLwogICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgY250Y2lkcjE7CiAgICAvKiE8IE9mZnNldDogMHhGRjQgKFJPKSBDb21wb25lbnQgSUQgUmVnaXN0ZXIgKi8KICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudGNpZHIyOwogICAgLyohPCBPZmZzZXQ6IDB4RkY4IChSTykgQ29tcG9uZW50IElEIFJlZ2lzdGVyICovCiAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCBjbnRjaWRyMzsKICAgIC8qITwgT2Zmc2V0OiAweEZGQyAoUk8pIENvbXBvbmVudCBJRCBSZWdpc3RlciAqLwp9OwoKLyoqCiAqIFxicmllZiBDb3VudGVyIENvbnRyb2wgUmVnaXN0ZXIgYml0IGZpZWxkcwogKi8KI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9FTl9PRkYgMHUKLyohPCBDb3VudGVyIENvbnRyb2wgUmVnaXN0ZXIgRW5hYmxlIENvdW50ZXIgYml0IGZpZWxkIG9mZnNldCAqLwojZGVmaW5lIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX0hEQkdfT0ZGIDF1Ci8qITwgQ291bnRlciBDb250cm9sIFJlZ2lzdGVyIEhhbHQgT24gRGVidWcgYml0IGZpZWxkIG9mZnNldCAqLwojZGVmaW5lIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX1NDRU5fT0ZGIDJ1Ci8qITwgQ291bnRlciBDb250cm9sIFJlZ2lzdGVyIFNjYWxlIGVuYWJsZSBiaXQgZmllbGQgb2Zmc2V0ICovCiNkZWZpbmUgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfSU5UUk1BU0tfT0ZGIDN1Ci8qITwgQ291bnRlciBDb250cm9sIFJlZ2lzdGVyIEludGVycnVwdCBtYXNrIGJpdCBmaWVsZCBvZmZzZXQgKi8KI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9QU0xWRVJSRElTX09GRiA0dQovKiE8IENvdW50ZXIgQ29udHJvbCBSZWdpc3RlciBQU0xWRVJSIGRpc2FibGUgYml0IGZpZWxkIG9mZnNldCAqLwojZGVmaW5lIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX0lOVFJDTFJfT0ZGIDV1Ci8qITwgQ291bnRlciBDb250cm9sIFJlZ2lzdGVyIEludGVycnVwdCBDbGVhciBiaXQgZmllbGQgb2Zmc2V0ICovCgovKioKICogXGJyaWVmIENvdW50ZXIgU3RhdHVzIFJlZ2lzdGVyIGJpdCBmaWVsZHMKICovCiNkZWZpbmUgU1lTQ09VTlRFUl9BUk1WOE1fQ05UU1JfREJHSF9PRkYgMXUKLyohPCBDb3VudGVyIFN0YXR1cyBSZWdpc3RlciBIYWx0LW9uLURlYnVnIGJpdCBmaWVsZCBvZmZzZXQgKi8KCi8qKgogKiBcYnJpZWYgQ291bnRlciBJRCBSZWdpc3RlciBiaXQgZmllbGRzCiAqLwojZGVmaW5lIFNZU0NPVU5URVJfQVJNVjhNX0NOVElEX0NOVFNDX09GRiAwdQovKiE8IENvdW50ZXIgSUQgUmVnaXN0ZXIgQ291bnRlciBTY2FsaW5nIGlzIGltcGxlbWVudGVkIGJpdCBmaWVsZCBvZmZzZXQgKi8KI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRJRF9DTlRDU19PRkYgMTZ1Ci8qITwgQ291bnRlciBJRCBSZWdpc3RlciBDbG9jayBzd2l0Y2hpbmcgaXMgaW1wbGVtZW50ZWQgYml0IGZpZWxkIG9mZnNldCAqLwoKLyohIENvdW50ZXIgSUQgUmVnaXN0ZXIgQ2xvY2sgc291cmNlICovCiNkZWZpbmUgU1lTQ09VTlRFUl9BUk1WOE1fQ05USURfQ05UU0VMQ0xLX09GRiAxN3UKI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRJRF9DTlRTRUxDTEtfV0lEVEggMnUKI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRJRF9DTlRTRUxDTEtfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAoQklUTUFTSyhTWVNDT1VOVEVSX0FSTVY4TV9DTlRJRF9DTlRTRUxDTEtfV0lEVEgpIDw8IFNZU0NPVU5URVJfQVJNVjhNX0NOVElEX0NOVFNFTENMS19PRkYpCgojZGVmaW5lIFNZU0NPVU5URVJfQVJNVjhNX0NOVElEX0NOVFNDUl9PVlJfT0ZGIDE5dQovKiE8IENvdW50ZXIgSUQgUmVnaXN0ZXIgT3ZlcnJpZGUgY291bnRlciBlbmFibGUgY29uZGl0aW9uIGZvcgogKiAgIHdyaXRpbmcgdG8gQ05UU0NSIHJlZ2lzdGVycyBiaXQgb2Zmc2V0CiAqLwoKZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZXJyb3JfdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaW5pdChzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90ICogZGV2KQp7CiAgICBlbnVtIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lcnJvcl90IHJlc3VsdCA9IFNZU0NPVU5URVJfQVJNVjhfTV9FUlJfTk9ORTsKCiAgICBpZiAoZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCA9PSBmYWxzZSkKICAgIHsKICAgICAgICBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGlzYWJsZV9jb3VudGVyKGRldik7CiAgICAgICAgaWYgKHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9pc19jb3VudGVyX3NjYWxpbmdfaW1wbGVtZW50ZWQoZGV2KSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdCA9IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9zZXRfY291bnRlcl9zY2FsZV92YWx1ZShkZXYsIFNZU0NPVU5URVJfQVJNVjhfTV9TQ0FMRV9OUl8wLCBkZXYtPmNmZy0+c2NhbGUwKTsKICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBTWVNDT1VOVEVSX0FSTVY4X01fRVJSX05PTkUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NldF9jb3VudGVyX3NjYWxlX3ZhbHVlKGRldiwgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX05SXzEsIGRldi0+Y2ZnLT5zY2FsZTEpOwogICAgICAgICAgICBpZiAocmVzdWx0ICE9IFNZU0NPVU5URVJfQVJNVjhfTV9FUlJfTk9ORSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2V0X2NvdW50ZXJfdmFsdWUoZGV2LCBTWVNDT1VOVEVSX0FSTVY4X01fREVGQVVMVF9JTklUX0NOVF9WQUwpOwogICAgICAgIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kaXNhYmxlX2ludGVycnVwdChkZXYpOwogICAgICAgIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kaXNhYmxlX3NjYWxlKGRldik7CgogICAgICAgIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lbmFibGVfY291bnRlcihkZXYpOwogICAgICAgIGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIFNZU0NPVU5URVJfQVJNVjhfTV9FUlJfTk9ORTsKfQoKdm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfdW5pbml0KHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QgKiBkZXYpCnsKICAgIGlmIChkZXYtPmRhdGEtPmlzX2luaXRpYWxpemVkID09IHRydWUpCiAgICB7CiAgICAgICAgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rpc2FibGVfY291bnRlcihkZXYpOwogICAgICAgIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kaXNhYmxlX2ludGVycnVwdChkZXYpOwogICAgICAgIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9zZXRfY291bnRlcl92YWx1ZShkZXYsIFNZU0NPVU5URVJfQVJNVjhfTV9ERUZBVUxUX0lOSVRfQ05UX1ZBTCk7CiAgICAgICAgZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCA9IGZhbHNlOwogICAgfQp9Cgp2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lbmFibGVfY291bnRlcihzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90ICogZGV2KQp7CiAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKiBwX2NudCA9IChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKikgZGV2LT5jZmctPmJhc2U7CiAgICBTRVRfQklUKHBfY250LT5jbnRjciwgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfRU5fT0ZGKTsKfQoKdm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGlzYWJsZV9jb3VudGVyKHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QgKiBkZXYpCnsKICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqIHBfY250ID0gKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqKSBkZXYtPmNmZy0+YmFzZTsKICAgIENMUl9CSVQocF9jbnQtPmNudGNyLCBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9FTl9PRkYpOwp9Cgpib29sIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9pc19jb3VudGVyX2VuYWJsZWQoc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCAqIGRldikKewogICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICogcF9jbnQgPSAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICopIGRldi0+Y2ZnLT5iYXNlOwogICAgcmV0dXJuIEdFVF9CSVQocF9jbnQtPmNudGNyLCBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9FTl9PRkYpOwp9Cgp2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lbmFibGVfaGFsdF9vbl9kZWJ1ZyhzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90ICogZGV2KQp7CiAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKiBwX2NudCA9IChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKikgZGV2LT5jZmctPmJhc2U7CiAgICBTRVRfQklUKHBfY250LT5jbnRjciwgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfSERCR19PRkYpOwp9Cgp2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kaXNhYmxlX2hhbHRfb25fZGVidWcoc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCAqIGRldikKewogICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICogcF9jbnQgPSAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICopIGRldi0+Y2ZnLT5iYXNlOwogICAgQ0xSX0JJVChwX2NudC0+Y250Y3IsIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX0hEQkdfT0ZGKTsKfQoKYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfaGFsdF9vbl9kZWJ1Z19lbmFibGVkKHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QgKiBkZXYpCnsKICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqIHBfY250ID0gKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqKSBkZXYtPmNmZy0+YmFzZTsKICAgIHJldHVybiBHRVRfQklUKHBfY250LT5jbnRjciwgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfSERCR19PRkYpOwp9Cgp2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lbmFibGVfc2NhbGUoc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCAqIGRldikKewogICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICogcF9jbnQgPSAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICopIGRldi0+Y2ZnLT5iYXNlOwogICAgU0VUX0JJVChwX2NudC0+Y250Y3IsIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX1NDRU5fT0ZGKTsKfQoKdm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGlzYWJsZV9zY2FsZShzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90ICogZGV2KQp7CiAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKiBwX2NudCA9IChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKikgZGV2LT5jZmctPmJhc2U7CiAgICBDTFJfQklUKHBfY250LT5jbnRjciwgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfU0NFTl9PRkYpOwp9Cgpib29sIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9pc19zY2FsZV9lbmFibGVkKHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QgKiBkZXYpCnsKICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqIHBfY250ID0gKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqKSBkZXYtPmNmZy0+YmFzZTsKICAgIHJldHVybiBHRVRfQklUKHBfY250LT5jbnRjciwgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfU0NFTl9PRkYpOwp9Cgp2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lbmFibGVfaW50ZXJydXB0KHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QgKiBkZXYpCnsKICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqIHBfY250ID0gKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqKSBkZXYtPmNmZy0+YmFzZTsKICAgIFNFVF9CSVQocF9jbnQtPmNudGNyLCBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9JTlRSTUFTS19PRkYpOwp9Cgp2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90ICogZGV2KQp7CiAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKiBwX2NudCA9IChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKikgZGV2LT5jZmctPmJhc2U7CiAgICBDTFJfQklUKHBfY250LT5jbnRjciwgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfSU5UUk1BU0tfT0ZGKTsKfQoKYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfaW50ZXJydXB0X2VuYWJsZWQoc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCAqIGRldikKewogICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICogcF9jbnQgPSAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICopIGRldi0+Y2ZnLT5iYXNlOwogICAgcmV0dXJuIEdFVF9CSVQocF9jbnQtPmNudGNyLCBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9JTlRSTUFTS19PRkYpOwp9Cgp2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lbmFibGVfcHNsdmVycihzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90ICogZGV2KQp7CiAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKiBwX2NudCA9IChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKikgZGV2LT5jZmctPmJhc2U7CiAgICBTRVRfQklUKHBfY250LT5jbnRjciwgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfUFNMVkVSUkRJU19PRkYpOwp9Cgp2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kaXNhYmxlX3BzbHZlcnIoc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCAqIGRldikKewogICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICogcF9jbnQgPSAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICopIGRldi0+Y2ZnLT5iYXNlOwogICAgQ0xSX0JJVChwX2NudC0+Y250Y3IsIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX1BTTFZFUlJESVNfT0ZGKTsKfQoKYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfcHNsdmVycl9lbmFibGVkKHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QgKiBkZXYpCnsKICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqIHBfY250ID0gKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqKSBkZXYtPmNmZy0+YmFzZTsKICAgIHJldHVybiBHRVRfQklUKHBfY250LT5jbnRjciwgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfUFNMVkVSUkRJU19PRkYpOwp9Cgp2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9jbGVhcl9pbnRlcnJ1cHQoc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCAqIGRldikKewogICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICogcF9jbnQgPSAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICopIGRldi0+Y2ZnLT5iYXNlOwogICAgQ0xSX0JJVChwX2NudC0+Y250Y3IsIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX0lOVFJDTFJfT0ZGKTsKfQoKYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfY291bnRlcl9oYWx0ZWRfb25fZGVidWcoc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCAqIGRldikKewogICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICogcF9jbnQgPSAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICopIGRldi0+Y2ZnLT5iYXNlOwogICAgcmV0dXJuIEdFVF9CSVQocF9jbnQtPmNudHNyLCBTWVNDT1VOVEVSX0FSTVY4TV9DTlRTUl9EQkdIX09GRik7Cn0KCnVpbnQ2NF90IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9nZXRfY291bnRlcl92YWx1ZShzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90ICogZGV2KQp7CiAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKiBwX2NudCA9IChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKikgZGV2LT5jZmctPmJhc2U7CiAgICB1aW50MzJfdCBoaWdoICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CiAgICB1aW50MzJfdCBsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CiAgICB1aW50MzJfdCBoaWdoX3ByZXYgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CiAgICB1aW50NjRfdCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CgogICAgLyogTWFrZSBzdXJlIHRoZSA2NC1iaXQgcmVhZCB3aWxsIGJlIGF0b21pYyB0byBhdm9pZCBvdmVyZmxvdyBiZXR3ZWVuCiAgICAgKiB0aGUgbG93IGFuZCBoaWdoIHJlZ2lzdGVycyByZWFkCiAgICAgKi8KICAgIGhpZ2ggPSBwX2NudC0+Y250Y3ZfaGlnaDsKICAgIGRvCiAgICB7CiAgICAgICAgaGlnaF9wcmV2ID0gaGlnaDsKICAgICAgICBsb3cgICAgICAgPSBwX2NudC0+Y250Y3ZfbG93OwogICAgICAgIGhpZ2ggICAgICA9IHBfY250LT5jbnRjdl9oaWdoOwogICAgfSB3aGlsZSAoaGlnaCAhPSBoaWdoX3ByZXYpOwoKICAgIHZhbHVlID0gbG93IHwgKCgodWludDY0X3QpIGhpZ2gpIDw8IFNZU0NPVU5URVJfQVJNVjhfTV9DTlRSTF9SRUdJU1RFUl9CSVRfV0lEVEgpOwogICAgcmV0dXJuIHZhbHVlOwp9Cgp2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9zZXRfY291bnRlcl92YWx1ZShzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90ICogZGV2LCB1aW50NjRfdCB2YWx1ZSkKewogICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICogcF9jbnQgPSAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICopIGRldi0+Y2ZnLT5iYXNlOwogICAgcF9jbnQtPmNudGN2X2xvdyAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2YWx1ZSAmIFVJTlQzMl9NQVg7CiAgICBwX2NudC0+Y250Y3ZfaGlnaCAgICAgICAgICAgICAgICAgICAgICAgICA9IHZhbHVlID4+IFNZU0NPVU5URVJfQVJNVjhfTV9DTlRSTF9SRUdJU1RFUl9CSVRfV0lEVEg7Cn0KCmJvb2wgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2lzX2NvdW50ZXJfc2NhbGluZ19pbXBsZW1lbnRlZChzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90ICogZGV2KQp7CiAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKiBwX2NudCA9IChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKikgZGV2LT5jZmctPmJhc2U7CiAgICByZXR1cm4gR0VUX0JJVChwX2NudC0+Y250aWQsIFNZU0NPVU5URVJfQVJNVjhNX0NOVElEX0NOVFNDX09GRik7Cn0KCmJvb2wgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2lzX2Nsb2NrX3N3aXRjaGluZ19pbXBsZW1lbnRlZChzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90ICogZGV2KQp7CiAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKiBwX2NudCA9IChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKikgZGV2LT5jZmctPmJhc2U7CiAgICByZXR1cm4gR0VUX0JJVChwX2NudC0+Y250aWQsIFNZU0NPVU5URVJfQVJNVjhNX0NOVElEX0NOVENTX09GRik7Cn0KCmVudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NlbGNsa190IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9nZXRfY2xvY2tfc291cmNlKHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QgKiBkZXYpCnsKICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqIHBfY250ID0gKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCAqKSBkZXYtPmNmZy0+YmFzZTsKICAgIHJldHVybiAoZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2VsY2xrX3QpIEdFVF9CSVRfRklFTEQocF9jbnQtPmNudGlkLCBTWVNDT1VOVEVSX0FSTVY4TV9DTlRJRF9DTlRTRUxDTEtfTUFTSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ09VTlRFUl9BUk1WOE1fQ05USURfQ05UU0VMQ0xLX09GRik7Cn0KCmVudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2NudHNjcl9vdnJfdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZ2V0X292ZXJyaWRlX2NudHNjcihzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90ICogZGV2KQp7CiAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKiBwX2NudCA9IChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKikgZGV2LT5jZmctPmJhc2U7CiAgICByZXR1cm4gKGVudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2NudHNjcl9vdnJfdCkgR0VUX0JJVChwX2NudC0+Y250aWQsIFNZU0NPVU5URVJfQVJNVjhNX0NOVElEX0NOVFNDUl9PVlJfT0ZGKTsKfQoKZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZXJyb3JfdApzeXNjb3VudGVyX2FybXY4X21fY250cmxfZ2V0X2NvdW50ZXJfc2NhbGVfdmFsdWUoc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCAqIGRldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NjYWxlX25yX3QgbnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NjYWxlX3ZhbF90ICogdmFsKQp7CiAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKiBwX2NudCA9IChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QgKikgZGV2LT5jZmctPmJhc2U7CgogICAgc3dpdGNoIChucikKICAgIHsKICAgIGNhc2UgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX05SXzA6CiAgICAgICAgdmFsLT5pbnRlZ2VyICAgICAgICAgICAgICA9IHBfY250LT5jbnRzY3IwID4+IFNZU0NPVU5URVJfQVJNVjhfTV9TQ0FMRV9WQUxfSU5UX09GRjsKICAgICAgICB2YWwtPmZpeGVkX3BvaW50X2ZyYWN0aW9uID0gcF9jbnQtPmNudHNjcjAgJiBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfVkFMX0ZSQUNUX01BWDsKICAgICAgICBicmVhazsKICAgIGNhc2UgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX05SXzE6CiAgICAgICAgdmFsLT5pbnRlZ2VyICAgICAgICAgICAgICA9IHBfY250LT5jbnRzY3IxID4+IFNZU0NPVU5URVJfQVJNVjhfTV9TQ0FMRV9WQUxfSU5UX09GRjsKICAgICAgICB2YWwtPmZpeGVkX3BvaW50X2ZyYWN0aW9uID0gcF9jbnQtPmNudHNjcjEgJiBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfVkFMX0ZSQUNUX01BWDsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgdmFsLT5pbnRlZ2VyICAgICAgICAgICAgICA9IDA7CiAgICAgICAgdmFsLT5maXhlZF9wb2ludF9mcmFjdGlvbiA9IDA7CiAgICAgICAgcmV0dXJuIFNZU0NPVU5URVJfQVJNVjhfTV9FUlJfSU5WQUxJRF9BUkc7CiAgICB9CgogICAgcmV0dXJuIFNZU0NPVU5URVJfQVJNVjhfTV9FUlJfTk9ORTsKfQoKZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZXJyb3JfdApzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2V0X2NvdW50ZXJfc2NhbGVfdmFsdWUoc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCAqIGRldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NjYWxlX25yX3QgbnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NjYWxlX3ZhbF90IHZhbCkKewogICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICogcF9jbnQgPSAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90ICopIGRldi0+Y2ZnLT5iYXNlOwogICAgdWludDMyX3QgcmVnX3ZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwoKICAgIGlmICgoc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2dldF9vdmVycmlkZV9jbnRzY3IoZGV2KSA9PSBTWVNDT1VOVEVSX0FSTVY4X01fQ05UU0NSX0lGX0RJU0FCTEVEKSAmJgogICAgICAgIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9pc19jb3VudGVyX2VuYWJsZWQoZGV2KSkKICAgIHsKICAgICAgICByZXR1cm4gU1lTQ09VTlRFUl9BUk1WOF9NX0VSUl9JTlZBTElEOwogICAgfQogICAgaWYgKHZhbC5pbnRlZ2VyID4gU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX1ZBTF9JTlRfTUFYIHx8IHZhbC5maXhlZF9wb2ludF9mcmFjdGlvbiA+IFNZU0NPVU5URVJfQVJNVjhfTV9TQ0FMRV9WQUxfRlJBQ1RfTUFYKQogICAgewogICAgICAgIHJldHVybiBTWVNDT1VOVEVSX0FSTVY4X01fRVJSX0lOVkFMSURfQVJHOwogICAgfQoKICAgIHJlZ192YWwgPSB2YWwuaW50ZWdlciA8PCBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfVkFMX0lOVF9PRkY7CiAgICByZWdfdmFsIHw9ICh2YWwuZml4ZWRfcG9pbnRfZnJhY3Rpb24gJiBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfVkFMX0ZSQUNUX01BWCk7CgogICAgc3dpdGNoIChucikKICAgIHsKICAgIGNhc2UgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX05SXzA6CiAgICAgICAgcF9jbnQtPmNudHNjcjAgPSByZWdfdmFsOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfTlJfMToKICAgICAgICBwX2NudC0+Y250c2NyMSA9IHJlZ192YWw7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBTWVNDT1VOVEVSX0FSTVY4X01fRVJSX0lOVkFMSURfQVJHOwogICAgfQoKICAgIHJldHVybiBTWVNDT1VOVEVSX0FSTVY4X01fRVJSX05PTkU7Cn0K