LyogYWhhMTUyeC5jIC0tIEFkYXB0ZWMgQUhBLTE1MnggZHJpdmVyCiAqIEF1dGhvcjogSvxyZ2VuIEUuIEZpc2NoZXIsIGZpc2NoZXJAbm9yYml0LmRlCiAqIENvcHlyaWdodCAxOTkzLTIwMDQgSvxyZ2VuIEUuIEZpc2NoZXIKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKICogbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICoKICogJElkOiBhaGExNTJ4LmMsdiAyLjcgMjAwNC8wMS8yNCAxMTo0Mjo1OSBmaXNjaGVyIEV4cCAkCiAqCiAqICRMb2c6IGFoYTE1MnguYyx2ICQKICogUmV2aXNpb24gMi43ICAyMDA0LzAxLzI0IDExOjQyOjU5ICBmaXNjaGVyCiAqIC0gZ2F0aGVyIGNvZGUgdGhhdCBpcyBub3QgdXNlZCBieSBQQ01DSUEgYXQgdGhlIGVuZAogKiAtIG1vdmUgcmVxdWVzdF9yZWdpb24gZm9yICFQQ01DSUEgY2FzZSB0byBkZXRlY3Rpb24KICogLSBtaWdyYXRpb24gdG8gbmV3IHNjc2kgaG9zdCBhcGkgKHJlbW92ZSBsZWdhY3kgY29kZSkKICogLSBmcmVlIGhvc3Qgc2NyaWJibGUgYmVmb3JlIHNjc2lfZG9uZQogKiAtIGZpeCBlcnJvciBoYW5kbGluZwogKiAtIG9uZSBpc2FwbnAgZGV2aWNlIGFkZGVkIHRvIGlkX3RhYmxlCiAqCiAqIFJldmlzaW9uIDIuNiAgMjAwMy8xMC8zMCAyMDo1Mjo0NyAgZmlzY2hlcgogKiAtIGludGVyZmFjZXMgY2hhbmdlcyBmb3Iga2VybmVsIDIuNgogKiAtIGFoYTE1MnhfcHJvYmVfb25lIGludHJvZHVjZWQgZm9yIHBjbWNpYSBzdHViCiAqIC0gZml4ZWQgcG5wZGV2IGhhbmRsaW5nCiAqIC0gaW5zdGVhZCBvZiBhbGxvY2F0aW9uIGEgbmV3IG9uZSwgcmV1c2UgY29tbWFuZCBmb3IgcmVxdWVzdCBzZW5zZSBhZnRlciBjaGVjayBjb25kaXRpb24gYW5kIHJlc2V0CiAqIC0gZml4ZXMgcmFjZSBpbiBpc19jb21wbGV0ZQogKgogKiBSZXZpc2lvbiAyLjUgIDIwMDIvMDQvMTQgMTE6MjQ6NTMgIGZpc2NoZXIKICogLSBpc2FwbnAgc3VwcG9ydAogKiAtIGFib3J0IGZpeGVkCiAqIC0gMi41IHN1cHBvcnQKICoKICogUmV2aXNpb24gMi40ICAyMDAwLzEyLzE2IDEyOjUzOjU2ICBmaXNjaGVyCiAqIC0gYWxsb3cgUkVRVUVTVCBTRU5TRSB0byBiZSBxdWV1ZWQKICogLSBoYW5kbGUgc2hhcmVkIFBDSSBpbnRlcnJ1cHRzCiAqCiAqIFJldmlzaW9uIDIuMyAgMjAwMC8xMS8wNCAxNjo0MDoyNiAgZmlzY2hlcgogKiAtIGhhbmRsZSBkYXRhIG92ZXJydW5zCiAqIC0gZXh0ZW5kIHRpbWVvdXQgZm9yIGRhdGEgcGhhc2VzCiAqCiAqIFJldmlzaW9uIDIuMiAgMjAwMC8wOC8wOCAxOTo1NDo1MyAgZmlzY2hlcgogKiAtIG1pbm9yIGNoYW5nZXMKICoKICogUmV2aXNpb24gMi4xICAyMDAwLzA1LzE3IDE2OjIzOjE3ICBmaXNjaGVyCiAqIC0gc2lnbmF0dXJlIHVwZGF0ZQogKiAtIGZpeCBmb3IgZGF0YSBvdXQgdy9vIHNjYXR0ZXIgZ2F0aGVyCiAqCiAqIFJldmlzaW9uIDIuMCAgMTk5OS8xMi8yNSAxNTowNzozMiAgZmlzY2hlcgogKiAtIGludGVycnVwdCByb3V0aW5lIGNvbXBsZXRseSByZXdvcmtlZAogKiAtIGJhc2ljIHN1cHBvcnQgZm9yIG5ldyBlaCBjb2RlCiAqCiAqIFJldmlzaW9uIDEuMjEgIDE5OTkvMTEvMTAgMjM6NDY6MzYgIGZpc2NoZXIKICogLSBkZWZhdWx0IHRvIHN5bmNocm9ub3VzIG9wZXJhdGlvbgogKiAtIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIGZpeGVkCiAqIC0gYWRkZWQgdGltZW91dCB0byBsb29wcwogKiAtIGRlYnVnZ2luZyBvdXRwdXQgY2FuIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCBwcm9jZnMKICoKICogUmV2aXNpb24gMS4yMCAgMTk5OS8xMS8wNyAxODozNzozMSAgZmlzY2hlcgogKiAtIHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3b3JrcwogKiAtIHJlc2lkIHN1cHBvcnQgZm9yIHNnIGRyaXZlcgogKgogKiBSZXZpc2lvbiAxLjE5ICAxOTk5LzExLzAyIDIyOjM5OjU5ICBmaXNjaGVyCiAqIC0gbW92ZWQgbGVhZGluZyBjb21tZW50cyB0byBSRUFETUUuYWhhMTUyeAogKiAtIG5ldyBhZGRpdGlvbmFsIG1vZHVsZSBwYXJhbWV0ZXJzCiAqIC0gdXBkYXRlcyBmb3IgMi4zCiAqIC0gc3VwcG9ydCBmb3IgdGhlIFRyaXBhY2UgVEMxNTUwIGNvbnRyb2xsZXIKICogLSBpbnRlcnJ1cHQgaGFuZGxpbmcgY2hhbmdlZAogKgogKiBSZXZpc2lvbiAxLjE4ICAxOTk2LzA5LzA3IDIwOjEwOjQwICBmaXNjaGVyCiAqIC0gZml4ZWQgY2FuX3F1ZXVlIGhhbmRsaW5nIChtdWx0aXBsZSBvdXRzdGFuZGluZyBjb21tYW5kcyB3b3JraW5nIGFnYWluKQogKgogKiBSZXZpc2lvbiAxLjE3ICAxOTk2LzA4LzE3IDE2OjA1OjE0ICBmaXNjaGVyCiAqIC0gYmlvc3BhcmFtIGltcHJvdmVkCiAqIC0gaW50ZXJydXB0IHZlcmlmaWNhdGlvbgogKiAtIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbgogKiAtIGNsZWFudXBzCiAqCiAqIFJldmlzaW9uIDEuMTYgIDE5OTYvMDYvMDkgMDA6MDQ6NTYgIHJvb3QKICogLSBhZGRlZCBjb25maWd1cmF0aW9uIHN5bWJvbHMgZm9yIGluc21vZCAoYWhhMTUyeC9haGExNTJ4MSkKICoKICogUmV2aXNpb24gMS4xNSAgMTk5Ni8wNC8zMCAxNDo1MjowNiAgZmlzY2hlcgogKiAtIHByb2MgaW5mbyBmaXhlZAogKiAtIHN1cHBvcnQgZm9yIGV4dGVuZGVkIHRyYW5zbGF0aW9uIGZvciA+MUdCIGRpc2tzCiAqCiAqIFJldmlzaW9uIDEuMTQgIDE5OTYvMDEvMTcgIDE1OjExOjIwICBmaXNjaGVyCiAqIC0gZml4ZWQgbG9ja3VwIGluIE1FU1NBR0UgSU4gcGhhc2UgYWZ0ZXIgcmVjb25uZWN0aW9uCiAqCiAqIFJldmlzaW9uIDEuMTMgIDE5OTYvMDEvMDkgIDAyOjE1OjUzICBmaXNjaGVyCiAqIC0gc29tZSBjbGVhbnVwcwogKiAtIG1vdmVkIHJlcXVlc3RfaXJxIGJlaGluZCBjb250cm9sbGVyIGluaXRpYWxpemF0aW9uCiAqICAgKHRvIGF2b2lkIHNwdXJpb3VzIGludGVycnVwdHMpCiAqCiAqIFJldmlzaW9uIDEuMTIgIDE5OTUvMTIvMTYgIDEyOjI2OjA3ICBmaXNjaGVyCiAqIC0gYmFycmllcigpcyBhZGRlZAogKiAtIGNvbmZpZ3VyYWJsZSBSRVNFVCBkZWxheSBhZGRlZAogKgogKiBSZXZpc2lvbiAxLjExICAxOTk1LzEyLzA2ICAyMToxODozNSAgZmlzY2hlcgogKiAtIHNvbWUgbWlub3IgdXBkYXRlcwogKgogKiBSZXZpc2lvbiAxLjEwICAxOTk1LzA3LzIyICAxOToxODo0NSAgZmlzY2hlcgogKiAtIHN1cHBvcnQgZm9yIDIgY29udHJvbGxlcnMKICogLSBzdGFydGVkIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXJzIChub3Qgd29ya2luZyB5ZXQpCiAqCiAqIFJldmlzaW9uIDEuOSAgMTk5NS8wMy8xOCAgMDk6MjA6MjQgIHJvb3QKICogLSBwYXRjaGVzIGZvciBQQ01DSUEgYW5kIG1vZHVsZXMKICoKICogUmV2aXNpb24gMS44ICAxOTk1LzAxLzIxICAyMjowNzoxOSAgcm9vdAogKiAtIHNuYXJmX3JlZ2lvbiA9PiByZXF1ZXN0X3JlZ2lvbgogKiAtIGFoYTE1MnhfaW50ciBpbnRlcmZhY2UgY2hhbmdlCiAqCiAqIFJldmlzaW9uIDEuNyAgMTk5NS8wMS8wMiAgMjM6MTk6MzYgIHJvb3QKICogLSB1cGRhdGVkIENPTU1BTkRfU0laRSB0byBjbWRfbGVuCiAqIC0gY2hhbmdlZCBzdGkoKSB0byByZXN0b3JlX2ZsYWdzKCkKICogLSBmaXhlZCBzb21lICNpZmRlZiB3aGljaCBnZW5lcmF0ZWQgd2FybmluZ3MKICoKICogUmV2aXNpb24gMS42ICAxOTk0LzExLzI0ICAyMDozNToyNyAgcm9vdAogKiAtIHByb2JsZW0gd2l0aCBvZGQgbnVtYmVyIG9mIGJ5dGVzIGluIGZpZm8gZml4ZWQKICoKICogUmV2aXNpb24gMS41ICAxOTk0LzEwLzMwICAxNDozOTo1NiAgcm9vdAogKiAtIGFib3J0IGNvZGUgZml4ZWQKICogLSBkZWJ1Z2dpbmcgaW1wcm92ZWQKICoKICogUmV2aXNpb24gMS40ICAxOTk0LzA5LzEyICAxMTozMzowMSAgcm9vdAogKiAtIGlycWFjdGlvbiB0byByZXF1ZXN0X2lycQogKiAtIGFib3J0aW9uIHVwZGF0ZWQKICoKICogUmV2aXNpb24gMS4zICAxOTk0LzA4LzA0ICAxMzo1MzowNSAgcm9vdAogKiAtIHVwZGF0ZXMgZm9yIG1pZC1sZXZlbC1kcml2ZXIgY2hhbmdlcwogKiAtIGFjY2VwdCB1bmV4cGVjdGVkIEJVU0ZSRUUgcGhhc2UgYXMgZXJyb3IgY29uZGl0aW9uCiAqIC0gcGFyaXR5IGNoZWNrIG5vdyBjb25maWd1cmFibGUKICoKICogUmV2aXNpb24gMS4yICAxOTk0LzA3LzAzICAxMjo1NjozNiAgcm9vdAogKiAtIGNsZWFuZWQgdXAgZGVidWdnaW5nIGNvZGUKICogLSBtb3JlIHR3ZWFraW5nIG9uIHJlc2V0IGRlbGF5cwogKiAtIHVwZGF0ZWQgYWJvcnQvcmVzZXQgY29kZSAocHJldHR5IHVudGVzdGVkLi4uKQogKgogKiBSZXZpc2lvbiAxLjEgIDE5OTQvMDUvMjggIDIxOjE4OjQ5ICByb290CiAqIC0gdXBkYXRlIGZvciBtaWQtbGV2ZWwgaW50ZXJmYWNlIGNoYW5nZSAoYWJvcnQtcmVzZXQpCiAqIC0gZGVsYXlzIGFmdGVyIHJlc2V0cyBhZGp1c3RlZCBmb3Igc29tZSBzbG93IGRldmljZXMKICoKICogUmV2aXNpb24gMS4wICAxOTk0LzAzLzI1ICAxMjo1MjowMCAgcm9vdAogKiAtIEZpeGVkICJtb3JlIGRhdGEgdGhhbiBleHBlY3RlZCIgcHJvYmxlbQogKiAtIGFkZGVkIG5ldyBCSU9TIHNpZ25hdHVyZXMKICoKICogUmV2aXNpb24gMC4xMDIgIDE5OTQvMDEvMzEgIDIwOjQ0OjEyICByb290CiAqIC0gbWlub3IgY2hhbmdlcyBpbiBpbnN3L291dHN3IGhhbmRsaW5nCiAqCiAqIFJldmlzaW9uIDAuMTAxICAxOTkzLzEyLzEzICAwMToxNjoyNyAgcm9vdAogKiAtIGZpeGVkIFNUQVRVUyBwaGFzZSAobm9uLUdPT0Qgc3RhdGkgd2VyZSBkcm9wcGVkIHNvbWV0aW1lczsKICogICBmaXhlcyBwcm9ibGVtcyB3aXRoIENELVJPTSBzZWN0b3Igc2l6ZSBkZXRlY3Rpb24gJiBtZWRpYSBjaGFuZ2UpCiAqCiAqIFJldmlzaW9uIDAuMTAwICAxOTkzLzEyLzEwICAxNjo1ODo0NyAgcm9vdAogKiAtIGZpeCBmb3IgdW5zdWNjZXNzZnVsIHNlbGVjdGlvbnMgaW4gY2FzZSBvZiBub24tY29udGludW91cyBpZCBhc3NpZ25tZW50cwogKiAgIG9uIHRoZSBzY3NpIGJ1cy4KICoKICogUmV2aXNpb24gMC45OSAgMTk5My8xMC8yNCAgMTY6MTk6NTkgIHJvb3QKICogLSBmaXhlZCBEQVRBIElOIChyYXJlIHJlYWQgZXJyb3JzIGdvbmUpCiAqCiAqIFJldmlzaW9uIDAuOTggIDE5OTMvMTAvMTcgIDEyOjU0OjQ0ICByb290CiAqIC0gZml4ZWQgc29tZSByZWNlbnQgZml4ZXMgKHNoYW1lIG9uIG1lKQogKiAtIG1vdmVkIGluaXRpYWxpemF0aW9uIG9mIHNjcmF0Y2ggYXJlYSB0byBhaGExNTJ4X3F1ZXVlCiAqCiAqIFJldmlzaW9uIDAuOTcgIDE5OTMvMTAvMDkgIDE4OjUzOjUzICByb290CiAqIC0gREFUQSBJTiBmaXhlZC4gUmFyZWx5IGxlZnQgZGF0YSBpbiB0aGUgZmlmby4KICoKICogUmV2aXNpb24gMC45NiAgMTk5My8xMC8wMyAgMDA6NTM6NTkgIHJvb3QKICogLSBtaW5vciBjaGFuZ2VzIG9uIERBVEEgSU4KICoKICogUmV2aXNpb24gMC45NSAgMTk5My8wOS8yNCAgMTA6MzY6MDEgIHJvb3QKICogLSBjaGFuZ2UgaGFuZGxpbmcgb2YgTVNHSSBhZnRlciByZXNlbGVjdGlvbgogKiAtIGZpeGVkIHN0aS9jbGkKICogLSBtaW5vciBjaGFuZ2VzCiAqCiAqIFJldmlzaW9uIDAuOTQgIDE5OTMvMDkvMTggIDE0OjA4OjIyICByb290CiAqIC0gZml4ZWQgYnVnIGluIG11bHRpcGxlIG91dHN0YW5kaW5nIGNvbW1hbmQgY29kZQogKiAtIGNoYW5nZWQgZGV0ZWN0aW9uCiAqIC0gc3VwcG9ydCBmb3Iga2VybmVsIGNvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uCiAqIC0gcmVzZXQgY29ycmVjdGVkCiAqIC0gY2hhbmdlZCBtZXNzYWdlIGhhbmRsaW5nCiAqCiAqIFJldmlzaW9uIDAuOTMgIDE5OTMvMDkvMTUgIDIwOjQxOjE5ICByb290CiAqIC0gZml4ZWQgYnVncyB3aXRoIG11bHRpcGxlIG91dHN0YW5kaW5nIGNvbW1hbmRzCiAqCiAqIFJldmlzaW9uIDAuOTIgIDE5OTMvMDkvMTMgIDAyOjQ2OjMzICByb290CiAqIC0gbXVsdGlwbGUgb3V0c3RhbmRpbmcgY29tbWFuZHMgd29yayAobm8gcHJvYmxlbXMgd2l0aCBJQk0gZHJpdmUpCiAqCiAqIFJldmlzaW9uIDAuOTEgIDE5OTMvMDkvMTIgIDIwOjUxOjQ2ICByb290CiAqIGFkZGVkIG11bHRpcGxlIG91dHN0YW5kaW5nIGNvbW1hbmRzCiAqIChzb21lIHByb2JsZW0gd2l0aCB0aGlzICQlJj8gSUJNIGRldmljZSByZW1haW4pCiAqCiAqIFJldmlzaW9uIDAuOSAgMTk5My8wOS8xMiAgMTE6MTE6MjIgIHJvb3QKICogLSBjb3JyZWN0ZWQgYXV0by1jb25maWd1cmF0aW9uCiAqIC0gY2hhbmdlZCB0aGUgYXV0by1jb25maWd1cmF0aW9uIChhZGRlZCBzb21lICcjZGVmaW5lJ3MpCiAqIC0gYWRkZWQgc3VwcG9ydCBmb3IgZGlzLS9yZWNvbm5lY3Rpb24KICoKICogUmV2aXNpb24gMC44ICAxOTkzLzA5LzA2ICAyMzowOTozOSAgcm9vdAogKiAtIGFkZGVkIHN1cHBvcnQgZm9yIHRoZSBkcml2ZSBhY3Rpdml0eSBsaWdodAogKiAtIG1pbm9yIGNoYW5nZXMKICoKICogUmV2aXNpb24gMC43ICAxOTkzLzA5LzA1ICAxNDozMDoxNSAgcm9vdAogKiAtIGltcHJvdmVkIHBoYXNlIGRldGVjdGlvbgogKiAtIG5vdyB1c2luZyB0aGUgbmV3IHNuYXJmX3JlZ2lvbiBjb2RlIG9mIDAuOTlwbDEzCiAqCiAqIFJldmlzaW9uIDAuNiAgMTk5My8wOS8wMiAgMTE6MDE6MzggIHJvb3QKICogZmlyc3QgcHVibGljIHJlbGVhc2U7IGFkZGVkIHNvbWUgc2lnbmF0dXJlcyBhbmQgYmlvc3BhcmFtKCkKICoKICogUmV2aXNpb24gMC41ICAxOTkzLzA4LzMwICAxMDoyMzozMCAgcm9vdAogKiBmaXhlZCB0aW1pbmcgcHJvYmxlbXMgd2l0aCBteSBJQk0gZHJpdmUKICoKICogUmV2aXNpb24gMC40ICAxOTkzLzA4LzI5ICAxNDowNjo1MiAgcm9vdAogKiBmaXhlZCBzb21lIHByb2JsZW1zIHdpdGggdGltZW91dHMgZHVlIGluY29tcGxldGUgY29tbWFuZHMKICoKICogUmV2aXNpb24gMC4zICAxOTkzLzA4LzI4ICAxNTo1NTowMyAgcm9vdAogKiB3cml0aW5nIGRhdGEgd29ya3MgdG9vLiAgbW91bnRlZCBhbmQgd29ya2VkIG9uIGEgZG9zIHBhcnRpdGlvbgogKgogKiBSZXZpc2lvbiAwLjIgIDE5OTMvMDgvMjcgIDIyOjQyOjA3ICByb290CiAqIHJlYWRpbmcgZGF0YSB3b3Jrcy4gIE1vdW50ZWQgYSBtc2RvcyBwYXJ0aXRpb24uCiAqCiAqIFJldmlzaW9uIDAuMSAgMTk5My8wOC8yNSAgMTM6Mzg6MzAgIHJvb3QKICogZmlyc3QgImRhbW4gdGhpbmcgZG9lc24ndCB3b3JrIiB2ZXJzaW9uCiAqCiAqIFJldmlzaW9uIDAuMCAgMTk5My8wOC8xNCAgMTk6NTQ6MjUgIHJvb3QKICogZW1wdHkgZnVuY3Rpb24gYm9kaWVzOyBkZXRlY3QoKSB3b3Jrcy4KICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIHNlZSBEb2N1bWVudGF0aW9uL3Njc2kvYWhhMTUyeC50eHQgZm9yIGNvbmZpZ3VyYXRpb24gZGV0YWlscwoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8YXNtL2lycS5oPgojaW5jbHVkZSA8bGludXgvaW8uaD4KI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvd2FpdC5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgojaW5jbHVkZSA8bGludXgvbGlzdC5oPgojaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgojaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CgojaW5jbHVkZSAic2NzaS5oIgojaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgojaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfc3BpLmg+CiNpbmNsdWRlICJhaGExNTJ4LmgiCgpzdGF0aWMgTElTVF9IRUFEKGFoYTE1MnhfaG9zdF9saXN0KTsKCgovKiBERUZJTkVTICovCgovKiBGb3IgUENNQ0lBIGNhcmRzLCBhbHdheXMgdXNlIEFVVE9DT05GICovCiNpZiBkZWZpbmVkKFBDTUNJQSkgfHwgZGVmaW5lZChNT0RVTEUpCiNpZiAhZGVmaW5lZChBVVRPQ09ORikKI2RlZmluZSBBVVRPQ09ORgojZW5kaWYKI2VuZGlmCgojaWYgIWRlZmluZWQoQVVUT0NPTkYpICYmICFkZWZpbmVkKFNFVFVQMCkKI2Vycm9yIGRlZmluZSBBVVRPQ09ORiBvciBTRVRVUDAKI2VuZGlmCgojaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQojZGVmaW5lIERFQlVHX0RFRkFVTFQgZGVidWdfZWgKCiNkZWZpbmUgRFBSSU5USyh3aGVuLG1zZ3MuLi4pIFwKCWRvIHsgaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmICh3aGVuKSkgcHJpbnRrKG1zZ3MpOyB9IHdoaWxlKDApCgojZGVmaW5lIERPX0xPQ0soZmxhZ3MpCVwKCWRvIHsgXAoJCWlmKHNwaW5faXNfbG9ja2VkKCZRTE9DSykpIHsgXAoJCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgIiglczolZCkgYWxyZWFkeSBsb2NrZWQgYXQgJXM6JWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIFFMT0NLRVIsIFFMT0NLRVJMKTsgXAoJCX0gXAoJCURQUklOVEsoZGVidWdfbG9ja3MsIERFQlVHX0xFQUQgIiglczolZCkgbG9ja2luZ1xuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKCQlzcGluX2xvY2tfaXJxc2F2ZSgmUUxPQ0ssZmxhZ3MpOyBcCgkJRFBSSU5USyhkZWJ1Z19sb2NrcywgREVCVUdfTEVBRCAiKCVzOiVkKSBsb2NrZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCgkJUUxPQ0tFUj1fX0ZVTkNUSU9OX187IFwKCQlRTE9DS0VSTD1fX0xJTkVfXzsgXAoJfSB3aGlsZSgwKQoKI2RlZmluZSBET19VTkxPQ0soZmxhZ3MpCVwKCWRvIHsgXAoJCURQUklOVEsoZGVidWdfbG9ja3MsIERFQlVHX0xFQUQgIiglczolZCkgdW5sb2NraW5nIChsb2NrZWQgYXQgJXM6JWQpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBRTE9DS0VSLCBRTE9DS0VSTCk7IFwKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZRTE9DSyxmbGFncyk7IFwKCQlEUFJJTlRLKGRlYnVnX2xvY2tzLCBERUJVR19MRUFEICIoJXM6JWQpIHVubG9ja2VkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAoJCVFMT0NLRVI9Iihub3QgbG9ja2VkKSI7IFwKCQlRTE9DS0VSTD0wOyBcCgl9IHdoaWxlKDApCgojZWxzZQojZGVmaW5lIERQUklOVEsod2hlbixtc2dzLi4uKQojZGVmaW5lCURPX0xPQ0soZmxhZ3MpCQlzcGluX2xvY2tfaXJxc2F2ZSgmUUxPQ0ssZmxhZ3MpCiNkZWZpbmUJRE9fVU5MT0NLKGZsYWdzKQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZRTE9DSyxmbGFncykKI2VuZGlmCgojZGVmaW5lIExFQUQJCSIoc2NzaSVkOiVkOiVkKSAiCiNkZWZpbmUgV0FSTl9MRUFECUtFUk5fV0FSTklORwlMRUFECiNkZWZpbmUgSU5GT19MRUFECUtFUk5fSU5GTwlMRUFECiNkZWZpbmUgTk9URV9MRUFECUtFUk5fTk9USUNFCUxFQUQKI2RlZmluZSBFUlJfTEVBRAlLRVJOX0VSUglMRUFECiNkZWZpbmUgREVCVUdfTEVBRAlLRVJOX0RFQlVHCUxFQUQKI2RlZmluZSBDTURJTkZPKGNtZCkgXAoJCQkoY21kKSA/ICgoY21kKS0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vKSA6IC0xLCBcCiAgICAgICAgICAgICAgICAgICAgICAgIChjbWQpID8gKChjbWQpLT5kZXZpY2UtPmlkICYgMHgwZikgOiAtMSwgXAoJCQkoY21kKSA/ICgoY21kKS0+ZGV2aWNlLT5sdW4gJiAweDA3KSA6IC0xCgojZGVmaW5lIERFTEFZX0RFRkFVTFQgMTAwMAoKI2lmIGRlZmluZWQoUENNQ0lBKQojZGVmaW5lIElSUV9NSU4gMAojZGVmaW5lIElSUV9NQVggMTYKI2Vsc2UKI2RlZmluZSBJUlFfTUlOIDkKI2lmIGRlZmluZWQoX19QUEMpCiNkZWZpbmUgSVJRX01BWCAoTlJfSVJRUy0xKQojZWxzZQojZGVmaW5lIElSUV9NQVggMTIKI2VuZGlmCiNlbmRpZgoKZW51bSB7Cglub3RfaXNzdWVkCT0gMHgwMDAxLAkvKiBjb21tYW5kIG5vdCB5ZXQgaXNzdWVkICovCglzZWxlY3RpbmcJPSAweDAwMDIsIAkvKiB0YXJnZXQgaXMgYmVlaW5nIHNlbGVjdGVkICovCglpZGVudGlmaWVkCT0gMHgwMDA0LAkvKiBJREVOVElGWSB3YXMgc2VudCAqLwoJZGlzY29ubmVjdGVkCT0gMHgwMDA4LAkvKiB0YXJnZXQgZGlzY29ubmVjdGVkICovCgljb21wbGV0ZWQJPSAweDAwMTAsCS8qIHRhcmdldCBzZW50IENPTU1BTkQgQ09NUExFVEUgKi8gCglhYm9ydGVkCQk9IDB4MDAyMCwJLyogQUJPUlQgd2FzIHNlbnQgKi8KCXJlc2V0dGVkCT0gMHgwMDQwLAkvKiBCVVMgREVWSUNFIFJFU0VUIHdhcyBzZW50ICovCglzcGlvcmR5CQk9IDB4MDA4MCwJLyogd2FpdGluZyBmb3IgU1BJT1JEWSB0byByYWlzZSAqLwoJc3luY25lZwkJPSAweDAxMDAsCS8qIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIGluIHByb2dyZXNzICovCglhYm9ydGluZwk9IDB4MDIwMCwJLyogQUJPUlQgaXMgcGVuZGluZyAqLwoJcmVzZXR0aW5nCT0gMHgwNDAwLAkvKiBCVVMgREVWSUNFIFJFU0VUIGlzIHBlbmRpbmcgKi8KCWNoZWNrX2NvbmRpdGlvbiA9IDB4MDgwMCwJLyogcmVxdWVzdGluZyBzZW5zZSBhZnRlciBDSEVDSyBDT05ESVRJT04gKi8KfTsKCk1PRFVMRV9BVVRIT1IoIkr8cmdlbiBGaXNjaGVyIik7Ck1PRFVMRV9ERVNDUklQVElPTihBSEExNTJYX1JFVklEKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKI2lmICFkZWZpbmVkKFBDTUNJQSkKI2lmIGRlZmluZWQoTU9EVUxFKQpzdGF0aWMgaW50IGlvW10gPSB7MCwgMH07Cm1vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKTU9EVUxFX1BBUk1fREVTQyhpbywiYmFzZSBpbyBhZGRyZXNzIG9mIGNvbnRyb2xsZXIiKTsKCnN0YXRpYyBpbnQgaXJxW10gPSB7MCwgMH07Cm1vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoaXJxLCJpbnRlcnJ1cHQgZm9yIGNvbnRyb2xsZXIiKTsKCnN0YXRpYyBpbnQgc2NzaWlkW10gPSB7NywgN307Cm1vZHVsZV9wYXJhbV9hcnJheShzY3NpaWQsIGludCwgTlVMTCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0Moc2NzaWlkLCJzY3NpIGlkIG9mIGNvbnRyb2xsZXIiKTsKCnN0YXRpYyBpbnQgcmVjb25uZWN0W10gPSB7MSwgMX07Cm1vZHVsZV9wYXJhbV9hcnJheShyZWNvbm5lY3QsIGludCwgTlVMTCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MocmVjb25uZWN0LCJhbGxvdyB0YXJnZXRzIHRvIGRpc2Nvbm5lY3QiKTsKCnN0YXRpYyBpbnQgcGFyaXR5W10gPSB7MSwgMX07Cm1vZHVsZV9wYXJhbV9hcnJheShwYXJpdHksIGludCwgTlVMTCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MocGFyaXR5LCJ1c2Ugc2NzaSBwYXJpdHkiKTsKCnN0YXRpYyBpbnQgc3luY1tdID0gezEsIDF9Owptb2R1bGVfcGFyYW1fYXJyYXkoc3luYywgaW50LCBOVUxMLCAwKTsKTU9EVUxFX1BBUk1fREVTQyhzeW5jLCJ1c2Ugc3luY2hyb25vdXMgdHJhbnNmZXJzIik7CgpzdGF0aWMgaW50IGRlbGF5W10gPSB7REVMQVlfREVGQVVMVCwgREVMQVlfREVGQVVMVH07Cm1vZHVsZV9wYXJhbV9hcnJheShkZWxheSwgaW50LCBOVUxMLCAwKTsKTU9EVUxFX1BBUk1fREVTQyhkZWxheSwic2NzaSByZXNldCBkZWxheSIpOwoKc3RhdGljIGludCBleHR0cmFuc1tdID0gezAsIDB9Owptb2R1bGVfcGFyYW1fYXJyYXkoZXh0dHJhbnMsIGludCwgTlVMTCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZXh0dHJhbnMsInVzZSBleHRlbmRlZCB0cmFuc2xhdGlvbiIpOwoKI2lmICFkZWZpbmVkKEFIQTE1MlhfREVCVUcpCnN0YXRpYyBpbnQgYWhhMTUyeFtdID0gezAsIDExLCA3LCAxLCAxLCAwLCBERUxBWV9ERUZBVUxULCAwfTsKbW9kdWxlX3BhcmFtX2FycmF5KGFoYTE1MngsIGludCwgTlVMTCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoYWhhMTUyeCwgInBhcmFtZXRlcnMgZm9yIGZpcnN0IGNvbnRyb2xsZXIiKTsKCnN0YXRpYyBpbnQgYWhhMTUyeDFbXSA9IHswLCAxMSwgNywgMSwgMSwgMCwgREVMQVlfREVGQVVMVCwgMH07Cm1vZHVsZV9wYXJhbV9hcnJheShhaGExNTJ4MSwgaW50LCBOVUxMLCAwKTsKTU9EVUxFX1BBUk1fREVTQyhhaGExNTJ4MSwgInBhcmFtZXRlcnMgZm9yIHNlY29uZCBjb250cm9sbGVyIik7CiNlbHNlCnN0YXRpYyBpbnQgZGVidWdbXSA9IHtERUJVR19ERUZBVUxULCBERUJVR19ERUZBVUxUfTsKbW9kdWxlX3BhcmFtX2FycmF5KGRlYnVnLCBpbnQsIE5VTEwsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZmxhZ3MgZm9yIGRyaXZlciBkZWJ1Z2dpbmciKTsKCnN0YXRpYyBpbnQgYWhhMTUyeFtdICAgPSB7MCwgMTEsIDcsIDEsIDEsIDEsIERFTEFZX0RFRkFVTFQsIDAsIERFQlVHX0RFRkFVTFR9Owptb2R1bGVfcGFyYW1fYXJyYXkoYWhhMTUyeCwgaW50LCBOVUxMLCAwKTsKTU9EVUxFX1BBUk1fREVTQyhhaGExNTJ4LCAicGFyYW1ldGVycyBmb3IgZmlyc3QgY29udHJvbGxlciIpOwoKc3RhdGljIGludCBhaGExNTJ4MVtdICA9IHswLCAxMSwgNywgMSwgMSwgMSwgREVMQVlfREVGQVVMVCwgMCwgREVCVUdfREVGQVVMVH07Cm1vZHVsZV9wYXJhbV9hcnJheShhaGExNTJ4MSwgaW50LCBOVUxMLCAwKTsKTU9EVUxFX1BBUk1fREVTQyhhaGExNTJ4MSwgInBhcmFtZXRlcnMgZm9yIHNlY29uZCBjb250cm9sbGVyIik7CiNlbmRpZiAvKiAhZGVmaW5lZChBSEExNTJYX0RFQlVHKSAqLwojZW5kaWYgLyogTU9EVUxFICovCgojaWZkZWYgX19JU0FQTlBfXwpzdGF0aWMgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0gewoJeyBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAoJCUlTQVBOUF9WRU5ET1IoJ0EnLCdEJywnUCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgxNTA1KSwgMCB9LAoJeyBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAoJCUlTQVBOUF9WRU5ET1IoJ0EnLCdEJywnUCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgxNTMwKSwgMCB9LAoJeyBJU0FQTlBfREVWSUNFX1NJTkdMRV9FTkQsIH0KfTsKTU9EVUxFX0RFVklDRV9UQUJMRShpc2FwbnAsIGlkX3RhYmxlKTsKI2VuZGlmIC8qIElTQVBOUCAqLwoKI2VuZGlmIC8qICFQQ01DSUEgKi8KCnN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGFoYTE1MnhfZHJpdmVyX3RlbXBsYXRlOwoKLyoKICogaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBob3N0CiAqCiAqLyAKZW51bSBhaGExNTJ4X3N0YXRlIHsKCWlkbGU9MCwKCXVua25vd24sCglzZWxkbywKCXNlbGRpLAoJc2VsdG8sCglidXNmcmVlLAoJbXNnbywKCWNtZCwKCW1zZ2ksCglzdGF0dXMsCglkYXRhaSwKCWRhdGFvLAoJcGFyZXJyLAoJcnN0aSwKCW1heHN0YXRlCn07CgovKgogKiBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uIG9mIHRoZSBob3N0CiAqCiAqLwpzdHJ1Y3QgYWhhMTUyeF9ob3N0ZGF0YSB7CglTY3NpX0NtbmQgKmlzc3VlX1NDOwoJCS8qIHBlbmRpbmcgY29tbWFuZHMgdG8gaXNzdWUgKi8KCglTY3NpX0NtbmQgKmN1cnJlbnRfU0M7CgkJLyogY3VycmVudCBjb21tYW5kIG9uIHRoZSBidXMgKi8KCglTY3NpX0NtbmQgKmRpc2Nvbm5lY3RlZF9TQzsKCQkvKiBjb21tYW5kcyB0aGF0IGRpc2Nvbm5lY3RlZCAqLwoKCVNjc2lfQ21uZCAqZG9uZV9TQzsKCQkvKiBjb21tYW5kIHRoYXQgd2FzIGNvbXBsZXRlZCAqLwoKCXNwaW5sb2NrX3QgbG9jazsKCQkvKiBob3N0IGxvY2sgKi8KCiNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCgljb25zdCBjaGFyICpsb2NrZXI7CgkJLyogd2hpY2ggZnVuY3Rpb24gaGFzIHRoZSBsb2NrICovCglpbnQgbG9ja2VybDsJLyogd2hlcmUgZGlkIGl0IGdldCBpdCAqLwoKCWludCBkZWJ1ZzsJLyogY3VycmVudCBkZWJ1Z2dpbmcgc2V0dGluZyAqLwojZW5kaWYKCiNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKCWludCAgICAgICAgICAgdG90YWxfY29tbWFuZHM7CglpbnQJICAgICAgZGlzY29ubmVjdGlvbnM7CglpbnQJICAgICAgYnVzZnJlZV93aXRob3V0X2FueV9hY3Rpb247CglpbnQJICAgICAgYnVzZnJlZV93aXRob3V0X29sZF9jb21tYW5kOwoJaW50CSAgICAgIGJ1c2ZyZWVfd2l0aG91dF9uZXdfY29tbWFuZDsKCWludAkgICAgICBidXNmcmVlX3dpdGhvdXRfZG9uZV9jb21tYW5kOwoJaW50CSAgICAgIGJ1c2ZyZWVfd2l0aF9jaGVja19jb25kaXRpb247CglpbnQgICAgICAgICAgIGNvdW50W21heHN0YXRlXTsKCWludCAgICAgICAgICAgY291bnRfdHJhbnNbbWF4c3RhdGVdOwoJdW5zaWduZWQgbG9uZyB0aW1lW21heHN0YXRlXTsKI2VuZGlmCgoJaW50IGNvbW1hbmRzOwkJLyogY3VycmVudCBudW1iZXIgb2YgY29tbWFuZHMgKi8KCglpbnQgcmVjb25uZWN0OwkJLyogZGlzY29ubmVjdGlvbiBhbGxvd2VkICovCglpbnQgcGFyaXR5OwkJLyogcGFyaXR5IGNoZWNraW5nIGVuYWJsZWQgKi8KCWludCBzeW5jaHJvbm91czsJLyogc3luY2hyb25vdXMgdHJhbnNmZXJlcyBlbmFibGVkICovCglpbnQgZGVsYXk7CQkvKiByZXNldCBvdXQgZGVsYXkgKi8KCWludCBleHRfdHJhbnM7CQkvKiBleHRlbmRlZCB0cmFuc2xhdGlvbiBlbmFibGVkICovCgoJaW50IHN3aW50OyAJCS8qIHNvZnR3YXJlLWludGVycnVwdCB3YXMgZmlyZWQgZHVyaW5nIGRldGVjdCgpICovCglpbnQgc2VydmljZTsJCS8qIGJoIG5lZWRzIHRvIGJlIHJ1biAqLwoJaW50IGluX2ludHI7CQkvKiBiaCBpcyBydW5uaW5nICovCgoJLyogY3VycmVudCBzdGF0ZSwKCSAgIHByZXZpb3VzIHN0YXRlLAoJICAgbGFzdCBzdGF0ZSBkaWZmZXJlbnQgZnJvbSBjdXJyZW50IHN0YXRlICovCgllbnVtIGFoYTE1Mnhfc3RhdGUgc3RhdGUsIHByZXZzdGF0ZSwgbGFzdHN0YXRlOwoKCWludCB0YXJnZXQ7CgkJLyogcmVjb25uZWN0aW5nIHRhcmdldCAqLwoKCXVuc2lnbmVkIGNoYXIgc3luY3JhdGVbOF07CgkJLyogY3VycmVudCBzeW5jaHJvbm91cyB0cmFuc2ZlciBhZ3JlZW1lbnRzICovCgoJdW5zaWduZWQgY2hhciBzeW5jbmVnWzhdOwoJCS8qIDA6IG5vIG5lZ290aWF0aW9uOwoJCSAqIDE6IG5lZ290aWF0aW9uIGluIHByb2dyZXNzOwoJCSAqIDI6IG5lZ290aWF0aW9uIGNvbXBsZXRlZAoJCSAqLwoKCWludCBjbWRfaTsKCQkvKiBudW1iZXIgb2Ygc2VudCBieXRlcyBvZiBjdXJyZW50IGNvbW1hbmQgKi8KCglpbnQgbXNnaV9sZW47CgkJLyogbnVtYmVyIG9mIHJlY2VpdmVkIG1lc3NhZ2UgYnl0ZXMgKi8KCXVuc2lnbmVkIGNoYXIgbXNnaVsyNTZdOwoJCS8qIHJlY2VpdmVkIG1lc3NhZ2UgYnl0ZXMgKi8KCglpbnQgbXNnb19pLCBtc2dvX2xlbjsJCgkJLyogbnVtYmVyIG9mIHNlbnQgYnl0ZXMgYW5kIGxlbmd0aCBvZiBjdXJyZW50IG1lc3NhZ2VzICovCgl1bnNpZ25lZCBjaGFyIG1zZ29bMjU2XTsKCQkvKiBwZW5kaW5nIG1lc3NhZ2VzICovCgoJaW50IGRhdGFfbGVuOwoJCS8qIG51bWJlciBvZiBzZW50L3JlY2VpdmVkIGJ5dGVzIGluIGRhdGFwaGFzZSAqLwoKCXVuc2lnbmVkIGxvbmcgaW9fcG9ydDA7Cgl1bnNpZ25lZCBsb25nIGlvX3BvcnQxOwoKI2lmZGVmIF9fSVNBUE5QX18KCXN0cnVjdCBwbnBfZGV2ICpwbnBkZXY7CiNlbmRpZgoJc3RydWN0IGxpc3RfaGVhZCBob3N0X2xpc3Q7Cn07CgoKLyoKICogaG9zdCBzcGVjaWZpYyBjb21tYW5kIGV4dGVuc2lvbgogKgogKi8Kc3RydWN0IGFoYTE1Mnhfc2NkYXRhIHsKCVNjc2lfQ21uZCAqbmV4dDsJLyogbmV4dCBzYyBpbiBxdWV1ZSAqLwoJc3RydWN0IHNlbWFwaG9yZSAqc2VtOwkvKiBzZW1hcGhvcmUgdG8gYmxvY2sgb24gKi8KCXVuc2lnbmVkIGNoYXIgY21kX2xlbjsKCXVuc2lnbmVkIGNoYXIgY21uZFtNQVhfQ09NTUFORF9TSVpFXTsKCXVuc2lnbmVkIHNob3J0IHVzZV9zZzsKCXVuc2lnbmVkIHJlcXVlc3RfYnVmZmxlbjsKCXZvaWQgKnJlcXVlc3RfYnVmZmVyOwp9OwoKCi8qIGFjY2VzcyBtYWNyb3MgZm9yIGhvc3RkYXRhICovCgojZGVmaW5lIEhPU1REQVRBKHNocG50KQkJKChzdHJ1Y3QgYWhhMTUyeF9ob3N0ZGF0YSAqKSAmc2hwbnQtPmhvc3RkYXRhKQoKI2RlZmluZSBIT1NUTk8JCQkoKHNocG50KS0+aG9zdF9ubykKCiNkZWZpbmUgQ1VSUkVOVF9TQwkJKEhPU1REQVRBKHNocG50KS0+Y3VycmVudF9TQykKI2RlZmluZSBET05FX1NDCQkJKEhPU1REQVRBKHNocG50KS0+ZG9uZV9TQykKI2RlZmluZSBJU1NVRV9TQwkJKEhPU1REQVRBKHNocG50KS0+aXNzdWVfU0MpCiNkZWZpbmUgRElTQ09OTkVDVEVEX1NDCQkoSE9TVERBVEEoc2hwbnQpLT5kaXNjb25uZWN0ZWRfU0MpCiNkZWZpbmUgUUxPQ0sJCQkoSE9TVERBVEEoc2hwbnQpLT5sb2NrKQojZGVmaW5lIFFMT0NLRVIJCQkoSE9TVERBVEEoc2hwbnQpLT5sb2NrZXIpCiNkZWZpbmUgUUxPQ0tFUkwJCShIT1NUREFUQShzaHBudCktPmxvY2tlcmwpCgojZGVmaW5lIFNUQVRFCQkJKEhPU1REQVRBKHNocG50KS0+c3RhdGUpCiNkZWZpbmUgUFJFVlNUQVRFCQkoSE9TVERBVEEoc2hwbnQpLT5wcmV2c3RhdGUpCiNkZWZpbmUgTEFTVFNUQVRFCQkoSE9TVERBVEEoc2hwbnQpLT5sYXN0c3RhdGUpCgojZGVmaW5lIFJFQ09OTl9UQVJHRVQJCShIT1NUREFUQShzaHBudCktPnRhcmdldCkKCiNkZWZpbmUgQ01EX0kJCQkoSE9TVERBVEEoc2hwbnQpLT5jbWRfaSkKCiNkZWZpbmUgTVNHTyhpKQkJCShIT1NUREFUQShzaHBudCktPm1zZ29baV0pCiNkZWZpbmUgTVNHT19JCQkJKEhPU1REQVRBKHNocG50KS0+bXNnb19pKQojZGVmaW5lIE1TR09MRU4JCQkoSE9TVERBVEEoc2hwbnQpLT5tc2dvX2xlbikKI2RlZmluZSBBRERNU0dPKHgpCQkoTVNHT0xFTjwyNTYgPyAodm9pZCkoTVNHTyhNU0dPTEVOKyspPXgpIDogYWhhMTUyeF9lcnJvcihzaHBudCwiTVNHTyBvdmVyZmxvdyIpKQoKI2RlZmluZSBNU0dJKGkpCQkJKEhPU1REQVRBKHNocG50KS0+bXNnaVtpXSkKI2RlZmluZSBNU0dJTEVOCQkJKEhPU1REQVRBKHNocG50KS0+bXNnaV9sZW4pCiNkZWZpbmUgQURETVNHSSh4KQkJKE1TR0lMRU48MjU2ID8gKHZvaWQpKE1TR0koTVNHSUxFTisrKT14KSA6IGFoYTE1MnhfZXJyb3Ioc2hwbnQsIk1TR0kgb3ZlcmZsb3ciKSkKCiNkZWZpbmUgREFUQV9MRU4JCShIT1NUREFUQShzaHBudCktPmRhdGFfbGVuKQoKI2RlZmluZSBTWU5DUkFURQkJKEhPU1REQVRBKHNocG50KS0+c3luY3JhdGVbQ1VSUkVOVF9TQy0+ZGV2aWNlLT5pZF0pCiNkZWZpbmUgU1lOQ05FRwkJCShIT1NUREFUQShzaHBudCktPnN5bmNuZWdbQ1VSUkVOVF9TQy0+ZGV2aWNlLT5pZF0pCgojZGVmaW5lIERFTEFZCQkJKEhPU1REQVRBKHNocG50KS0+ZGVsYXkpCiNkZWZpbmUgRVhUX1RSQU5TCQkoSE9TVERBVEEoc2hwbnQpLT5leHRfdHJhbnMpCiNkZWZpbmUgVEMxNTUwCQkJKEhPU1REQVRBKHNocG50KS0+dGMxNTUwKQojZGVmaW5lIFJFQ09OTkVDVAkJKEhPU1REQVRBKHNocG50KS0+cmVjb25uZWN0KQojZGVmaW5lIFBBUklUWQkJCShIT1NUREFUQShzaHBudCktPnBhcml0eSkKI2RlZmluZSBTWU5DSFJPTk9VUwkJKEhPU1REQVRBKHNocG50KS0+c3luY2hyb25vdXMpCgojZGVmaW5lIEhPU1RJT1BPUlQwCQkoSE9TVERBVEEoc2hwbnQpLT5pb19wb3J0MCkKI2RlZmluZSBIT1NUSU9QT1JUMQkJKEhPU1REQVRBKHNocG50KS0+aW9fcG9ydDEpCgojZGVmaW5lIFNDREFUQShTQ3BudCkJCSgoc3RydWN0IGFoYTE1Mnhfc2NkYXRhICopIChTQ3BudCktPmhvc3Rfc2NyaWJibGUpCiNkZWZpbmUgU0NORVhUKFNDcG50KQkJU0NEQVRBKFNDcG50KS0+bmV4dAojZGVmaW5lIFNDU0VNKFNDcG50KQkJU0NEQVRBKFNDcG50KS0+c2VtCgojZGVmaW5lIFNHX0FERFJFU1MoYnVmZmVyKQkoKGNoYXIgKikgKHBhZ2VfYWRkcmVzcygoYnVmZmVyKS0+cGFnZSkrKGJ1ZmZlciktPm9mZnNldCkpCgovKiBzdGF0ZSBoYW5kbGluZyAqLwpzdGF0aWMgdm9pZCBzZWxkaV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOwpzdGF0aWMgdm9pZCBzZWxkb19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOwpzdGF0aWMgdm9pZCBzZWx0b19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOwpzdGF0aWMgdm9pZCBidXNmcmVlX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CgpzdGF0aWMgdm9pZCBtc2dvX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOwpzdGF0aWMgdm9pZCBtc2dvX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CnN0YXRpYyB2b2lkIG1zZ29fZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKCnN0YXRpYyB2b2lkIGNtZF9pbml0KHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKc3RhdGljIHZvaWQgY21kX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CnN0YXRpYyB2b2lkIGNtZF9lbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOwoKc3RhdGljIHZvaWQgZGF0YWlfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CnN0YXRpYyB2b2lkIGRhdGFpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CnN0YXRpYyB2b2lkIGRhdGFpX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CgpzdGF0aWMgdm9pZCBkYXRhb19pbml0KHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKc3RhdGljIHZvaWQgZGF0YW9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKc3RhdGljIHZvaWQgZGF0YW9fZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKCnN0YXRpYyB2b2lkIHN0YXR1c19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOwoKc3RhdGljIHZvaWQgbXNnaV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOwpzdGF0aWMgdm9pZCBtc2dpX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CgpzdGF0aWMgdm9pZCBwYXJlcnJfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKc3RhdGljIHZvaWQgcnN0aV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOwoKc3RhdGljIHZvaWQgaXNfY29tcGxldGUoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOwoKLyoKICogZHJpdmVyIHN0YXRlcwogKgogKi8Kc3RhdGljIHN0cnVjdCB7CgljaGFyCQkqbmFtZTsKCXZvaWQJCSgqaW5pdCkoc3RydWN0IFNjc2lfSG9zdCAqKTsKCXZvaWQJCSgqcnVuKShzdHJ1Y3QgU2NzaV9Ib3N0ICopOwoJdm9pZAkJKCplbmQpKHN0cnVjdCBTY3NpX0hvc3QgKik7CglpbnQJCXNwaW87Cn0gc3RhdGVzW10gPSB7Cgl7ICJpZGxlIiwJTlVMTCwJCU5VTEwsCQlOVUxMLAkJMH0sCgl7ICJ1bmtub3duIiwJTlVMTCwJCU5VTEwsCQlOVUxMLAkJMH0sCgl7ICJzZWxkbyIsCU5VTEwsCQlzZWxkb19ydW4sCU5VTEwsCQkwfSwKCXsgInNlbGRpIiwJTlVMTCwJCXNlbGRpX3J1biwJTlVMTCwJCTB9LAoJeyAic2VsdG8iLAlOVUxMLAkJc2VsdG9fcnVuLAlOVUxMLAkJMH0sCgl7ICJidXNmcmVlIiwJTlVMTCwJCWJ1c2ZyZWVfcnVuLAlOVUxMLAkJMH0sCgl7ICJtc2dvIiwJbXNnb19pbml0LAltc2dvX3J1biwJbXNnb19lbmQsCTF9LAoJeyAiY21kIiwJY21kX2luaXQsCWNtZF9ydW4sCWNtZF9lbmQsCTF9LAoJeyAibXNnaSIsCU5VTEwsCQltc2dpX3J1biwJbXNnaV9lbmQsCTF9LAoJeyAic3RhdHVzIiwJTlVMTCwJCXN0YXR1c19ydW4sCU5VTEwsCQkxfSwKCXsgImRhdGFpIiwJZGF0YWlfaW5pdCwJZGF0YWlfcnVuLAlkYXRhaV9lbmQsCTB9LAoJeyAiZGF0YW8iLAlkYXRhb19pbml0LAlkYXRhb19ydW4sCWRhdGFvX2VuZCwJMH0sCgl7ICJwYXJlcnIiLAlOVUxMLAkJcGFyZXJyX3J1biwJTlVMTCwJCTB9LAoJeyAicnN0aSIsCU5VTEwsCQlyc3RpX3J1biwJTlVMTCwJCTB9LAp9OwoKLyogc2V0dXAgJiBpbnRlcnJ1cHQgKi8Kc3RhdGljIGlycXJldHVybl90IGludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKc3RhdGljIHZvaWQgcmVzZXRfcG9ydHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOwpzdGF0aWMgdm9pZCBhaGExNTJ4X2Vycm9yKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBjaGFyICptc2cpOwpzdGF0aWMgdm9pZCBkb25lKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBpbnQgZXJyb3IpOwoKLyogZGlhZ25vc3RpY3MgKi8Kc3RhdGljIHZvaWQgZGlzcF9wb3J0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CnN0YXRpYyB2b2lkIHNob3dfY29tbWFuZChTY3NpX0NtbmQgKiBwdHIpOwpzdGF0aWMgdm9pZCBzaG93X3F1ZXVlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CnN0YXRpYyB2b2lkIGRpc3BfZW5pbnRyKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKCgovKgogKiAgcXVldWUgc2VydmljZXM6CiAqCiAqLwpzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX1NDKFNjc2lfQ21uZCAqKlNDLCBTY3NpX0NtbmQgKm5ld19TQykKewoJU2NzaV9DbW5kICplbmQ7CgoJU0NORVhUKG5ld19TQykgPSBOVUxMOwoJaWYgKCEqU0MpCgkJKlNDID0gbmV3X1NDOwoJZWxzZSB7CgkJZm9yIChlbmQgPSAqU0M7IFNDTkVYVChlbmQpOyBlbmQgPSBTQ05FWFQoZW5kKSkKCQkJOwoJCVNDTkVYVChlbmQpID0gbmV3X1NDOwoJfQp9CgpzdGF0aWMgaW5saW5lIFNjc2lfQ21uZCAqcmVtb3ZlX2ZpcnN0X1NDKFNjc2lfQ21uZCAqKiBTQykKewoJU2NzaV9DbW5kICpwdHI7CgoJcHRyID0gKlNDOwoJaWYgKHB0cikgewoJCSpTQyA9IFNDTkVYVCgqU0MpOwoJCVNDTkVYVChwdHIpPU5VTEw7Cgl9CglyZXR1cm4gcHRyOwp9CgpzdGF0aWMgaW5saW5lIFNjc2lfQ21uZCAqcmVtb3ZlX2x1bl9TQyhTY3NpX0NtbmQgKiogU0MsIGludCB0YXJnZXQsIGludCBsdW4pCnsKCVNjc2lfQ21uZCAqcHRyLCAqcHJldjsKCglmb3IgKHB0ciA9ICpTQywgcHJldiA9IE5VTEw7CgkgICAgIHB0ciAmJiAoKHB0ci0+ZGV2aWNlLT5pZCAhPSB0YXJnZXQpIHx8IChwdHItPmRldmljZS0+bHVuICE9IGx1bikpOwoJICAgICBwcmV2ID0gcHRyLCBwdHIgPSBTQ05FWFQocHRyKSkKCSAgICAgOwoKCWlmIChwdHIpIHsKCQlpZiAocHJldikKCQkJU0NORVhUKHByZXYpID0gU0NORVhUKHB0cik7CgkJZWxzZQoJCQkqU0MgPSBTQ05FWFQocHRyKTsKCgkJU0NORVhUKHB0cik9TlVMTDsKCX0KCglyZXR1cm4gcHRyOwp9CgpzdGF0aWMgaW5saW5lIFNjc2lfQ21uZCAqcmVtb3ZlX1NDKFNjc2lfQ21uZCAqKlNDLCBTY3NpX0NtbmQgKlNDcCkKewoJU2NzaV9DbW5kICpwdHIsICpwcmV2OwoKCWZvciAocHRyID0gKlNDLCBwcmV2ID0gTlVMTDsKCSAgICAgcHRyICYmIFNDcCE9cHRyOwoJICAgICBwcmV2ID0gcHRyLCBwdHIgPSBTQ05FWFQocHRyKSkKCSAgICAgOwoKCWlmIChwdHIpIHsKCQlpZiAocHJldikKCQkJU0NORVhUKHByZXYpID0gU0NORVhUKHB0cik7CgkJZWxzZQoJCQkqU0MgPSBTQ05FWFQocHRyKTsKCgkJU0NORVhUKHB0cik9TlVMTDsKCX0KCglyZXR1cm4gcHRyOwp9CgpzdGF0aWMgaXJxcmV0dXJuX3Qgc3dpbnRyKGludCBpcnFubywgdm9pZCAqZGV2X2lkKQp7CglzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IGRldl9pZDsKCglIT1NUREFUQShzaHBudCktPnN3aW50Kys7CgoJU0VUUE9SVChETUFDTlRSTDAsIElOVEVOKTsKCXJldHVybiBJUlFfSEFORExFRDsKfQoKc3RydWN0IFNjc2lfSG9zdCAqYWhhMTUyeF9wcm9iZV9vbmUoc3RydWN0IGFoYTE1Mnhfc2V0dXAgKnNldHVwKQp7CglzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudDsKCglzaHBudCA9IHNjc2lfaG9zdF9hbGxvYygmYWhhMTUyeF9kcml2ZXJfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgYWhhMTUyeF9ob3N0ZGF0YSkpOwoJaWYgKCFzaHBudCkgewoJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogc2NzaV9ob3N0X2FsbG9jIGZhaWxlZFxuIik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJbWVtc2V0KEhPU1REQVRBKHNocG50KSwgMCwgc2l6ZW9mICpIT1NUREFUQShzaHBudCkpOwoJSU5JVF9MSVNUX0hFQUQoJkhPU1REQVRBKHNocG50KS0+aG9zdF9saXN0KTsKCgkvKiBuZWVkIHRvIGhhdmUgaG9zdCByZWdpc3RlcmVkIGJlZm9yZSB0cmlnZ2VyaW5nIGFueSBpbnRlcnJ1cHQgKi8KCWxpc3RfYWRkX3RhaWwoJkhPU1REQVRBKHNocG50KS0+aG9zdF9saXN0LCAmYWhhMTUyeF9ob3N0X2xpc3QpOwoKCXNocG50LT5pb19wb3J0ICAgPSBzZXR1cC0+aW9fcG9ydDsKCXNocG50LT5uX2lvX3BvcnQgPSBJT19SQU5HRTsKCXNocG50LT5pcnEgICAgICAgPSBzZXR1cC0+aXJxOwoKCWlmICghc2V0dXAtPnRjMTU1MCkgewoJCUhPU1RJT1BPUlQwID0gc2V0dXAtPmlvX3BvcnQ7CgkJSE9TVElPUE9SVDEgPSBzZXR1cC0+aW9fcG9ydDsKCX0gZWxzZSB7CgkJSE9TVElPUE9SVDAgPSBzZXR1cC0+aW9fcG9ydCsweDEwOwoJCUhPU1RJT1BPUlQxID0gc2V0dXAtPmlvX3BvcnQtMHgxMDsKCX0KCglzcGluX2xvY2tfaW5pdCgmUUxPQ0spOwoJUkVDT05ORUNUICAgPSBzZXR1cC0+cmVjb25uZWN0OwoJU1lOQ0hST05PVVMgPSBzZXR1cC0+c3luY2hyb25vdXM7CglQQVJJVFkgICAgICA9IHNldHVwLT5wYXJpdHk7CglERUxBWSAgICAgICA9IHNldHVwLT5kZWxheTsKCUVYVF9UUkFOUyAgID0gc2V0dXAtPmV4dF90cmFuczsKCiNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCglIT1NUREFUQShzaHBudCktPmRlYnVnID0gc2V0dXAtPmRlYnVnOwojZW5kaWYKCglTRVRQT1JUKFNDU0lJRCwgc2V0dXAtPnNjc2lpZCA8PCA0KTsKCXNocG50LT50aGlzX2lkID0gc2V0dXAtPnNjc2lpZDsKCglpZiAoc2V0dXAtPnJlY29ubmVjdCkKCQlzaHBudC0+Y2FuX3F1ZXVlID0gQUhBMTUyWF9NQVhRVUVVRTsKCgkvKiBSRVNFVCBPVVQgKi8KCXByaW50aygiYWhhMTUyeDogcmVzZXR0aW5nIGJ1cy4uLlxuIik7CglTRVRQT1JUKFNDU0lTRVEsIFNDU0lSU1RPKTsKCW1kZWxheSgyNTYpOwoJU0VUUE9SVChTQ1NJU0VRLCAwKTsKCW1kZWxheShERUxBWSk7CgoJcmVzZXRfcG9ydHMoc2hwbnQpOwoKCXByaW50ayhLRVJOX0lORk8KCSAgICAgICAiYWhhMTUyeCVkJXM6ICIKCSAgICAgICAidml0YWwgZGF0YTogcmV2PSV4LCAiCgkgICAgICAgImlvPTB4JTAzbHggKDB4JTAzbHgvMHglMDNseCksICIKCSAgICAgICAiaXJxPSVkLCAiCgkgICAgICAgInNjc2lpZD0lZCwgIgoJICAgICAgICJyZWNvbm5lY3Q9JXMsICIKCSAgICAgICAicGFyaXR5PSVzLCAiCgkgICAgICAgInN5bmNocm9ub3VzPSVzLCAiCgkgICAgICAgImRlbGF5PSVkLCAiCgkgICAgICAgImV4dGVuZGVkIHRyYW5zbGF0aW9uPSVzXG4iLAoJICAgICAgIHNocG50LT5ob3N0X25vLCBzZXR1cC0+dGMxNTUwID8gIiAodGMxNTUwIG1vZGUpIiA6ICIiLAoJICAgICAgIEdFVFBPUlQoUkVWKSAmIDB4NywKCSAgICAgICBzaHBudC0+aW9fcG9ydCwgSE9TVElPUE9SVDAsIEhPU1RJT1BPUlQxLAoJICAgICAgIHNocG50LT5pcnEsCgkgICAgICAgc2hwbnQtPnRoaXNfaWQsCgkgICAgICAgUkVDT05ORUNUID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKCSAgICAgICBQQVJJVFkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAoJICAgICAgIFNZTkNIUk9OT1VTID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKCSAgICAgICBERUxBWSwKCSAgICAgICBFWFRfVFJBTlMgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKCgkvKiBub3QgZXhwZWN0aW5nIGFueSBpbnRlcnJ1cHRzICovCglTRVRQT1JUKFNJTU9ERTAsIDApOwoJU0VUUE9SVChTSU1PREUxLCAwKTsKCglpZiggcmVxdWVzdF9pcnEoc2hwbnQtPmlycSwgc3dpbnRyLCBJUlFGX0RJU0FCTEVEfElSUUZfU0hBUkVELCAiYWhhMTUyeCIsIHNocG50KSApIHsKCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogaXJxICVkIGJ1c3kuXG4iLCBzaHBudC0+aG9zdF9ubywgc2hwbnQtPmlycSk7CgkJZ290byBvdXRfaG9zdF9wdXQ7Cgl9CgoJSE9TVERBVEEoc2hwbnQpLT5zd2ludCA9IDA7CgoJcHJpbnRrKEtFUk5fSU5GTyAiYWhhMTUyeCVkOiB0cnlpbmcgc29mdHdhcmUgaW50ZXJydXB0LCAiLCBzaHBudC0+aG9zdF9ubyk7CgoJbWIoKTsKCVNFVFBPUlQoRE1BQ05UUkwwLCBTV0lOVHxJTlRFTik7CgltZGVsYXkoMTAwMCk7CglmcmVlX2lycShzaHBudC0+aXJxLCBzaHBudCk7CgoJaWYgKCFIT1NUREFUQShzaHBudCktPnN3aW50KSB7CgkJaWYgKFRFU1RISShETUFTVEFULCBJTlRTVEFUKSkgewoJCQlwcmludGsoImxvc3QuXG4iKTsKCQl9IGVsc2UgewoJCQlwcmludGsoImZhaWxlZC5cbiIpOwoJCX0KCgkJU0VUUE9SVChETUFDTlRSTDAsIElOVEVOKTsKCgkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IGlycSAlZCBwb3NzaWJseSB3cm9uZy4gICIKCQkJCSJQbGVhc2UgdmVyaWZ5LlxuIiwgc2hwbnQtPmhvc3Rfbm8sIHNocG50LT5pcnEpOwoJCWdvdG8gb3V0X2hvc3RfcHV0OwoJfQoJcHJpbnRrKCJvay5cbiIpOwoKCgkvKiBjbGVhciBpbnRlcnJ1cHRzICovCglTRVRQT1JUKFNTVEFUMCwgMHg3Zik7CglTRVRQT1JUKFNTVEFUMSwgMHhlZik7CgoJaWYgKCByZXF1ZXN0X2lycShzaHBudC0+aXJxLCBpbnRyLCBJUlFGX0RJU0FCTEVEfElSUUZfU0hBUkVELCAiYWhhMTUyeCIsIHNocG50KSApIHsKCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogZmFpbGVkIHRvIHJlYXNzaWduIGlycSAlZC5cbiIsIHNocG50LT5ob3N0X25vLCBzaHBudC0+aXJxKTsKCQlnb3RvIG91dF9ob3N0X3B1dDsKCX0KCglpZiggc2NzaV9hZGRfaG9zdChzaHBudCwgTlVMTCkgKSB7CgkJZnJlZV9pcnEoc2hwbnQtPmlycSwgc2hwbnQpOwoJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeCVkOiBmYWlsZWQgdG8gYWRkIGhvc3QuXG4iLCBzaHBudC0+aG9zdF9ubyk7CgkJZ290byBvdXRfaG9zdF9wdXQ7Cgl9CgoJc2NzaV9zY2FuX2hvc3Qoc2hwbnQpOwoKCXJldHVybiBzaHBudDsKCm91dF9ob3N0X3B1dDoKCWxpc3RfZGVsKCZIT1NUREFUQShzaHBudCktPmhvc3RfbGlzdCk7CglzY3NpX2hvc3RfcHV0KHNocG50KTsKCglyZXR1cm4gTlVMTDsKfQoKdm9pZCBhaGExNTJ4X3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCWlmKCFzaHBudCkKCQlyZXR1cm47CgoJaWYgKHNocG50LT5pcnEpCgkJZnJlZV9pcnEoc2hwbnQtPmlycSwgc2hwbnQpOwoKI2lmICFkZWZpbmVkKFBDTUNJQSkKCWlmIChzaHBudC0+aW9fcG9ydCkKCQlyZWxlYXNlX3JlZ2lvbihzaHBudC0+aW9fcG9ydCwgSU9fUkFOR0UpOwojZW5kaWYKCiNpZmRlZiBfX0lTQVBOUF9fCglpZiAoSE9TVERBVEEoc2hwbnQpLT5wbnBkZXYpCgkJcG5wX2RldmljZV9kZXRhY2goSE9TVERBVEEoc2hwbnQpLT5wbnBkZXYpOwojZW5kaWYKCglzY3NpX3JlbW92ZV9ob3N0KHNocG50KTsKCWxpc3RfZGVsKCZIT1NUREFUQShzaHBudCktPmhvc3RfbGlzdCk7CglzY3NpX2hvc3RfcHV0KHNocG50KTsKfQoKCi8qCiAqIHNldHVwIGNvbnRyb2xsZXIgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cyBkZXBlbmRpbmcKICogb24gY3VycmVudCBzdGF0ZSAobG9jayBoYXMgdG8gYmUgYWNxdWlyZWQpCiAqCiAqLyAKc3RhdGljIGludCBzZXR1cF9leHBlY3RlZF9pbnRlcnJ1cHRzKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQp7CglpZihDVVJSRU5UX1NDKSB7CgkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IDEgPDwgMTY7CgkKCQlpZihDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBzZWxlY3RpbmcpIHsKCQkJRFBSSU5USyhkZWJ1Z19pbnRyLCBERUJVR19MRUFEICJleHBlY3Rpbmc6IChzZWxkbykgKHNlbHRpbW8pIChzZWxkaSlcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOwoJCQlTRVRQT1JUKFNTVEFUMSwgU0VMVE8pOwoJCQlTRVRQT1JUKFNJTU9ERTAsIEVOU0VMRE8gfCAoRElTQ09OTkVDVEVEX1NDID8gRU5TRUxESSA6IDApKTsKCQkJU0VUUE9SVChTSU1PREUxLCBFTlNFTFRJTU8pOwoJCX0gZWxzZSB7CgkJCURQUklOVEsoZGVidWdfaW50ciwgREVCVUdfTEVBRCAiZXhwZWN0aW5nOiAocGhhc2UgY2hhbmdlKSAoYnVzZnJlZSkgJXNcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIHNwaW9yZHkgPyAiKHNwaW9yZHkpIiA6ICIiKTsKCQkJU0VUUE9SVChTSU1PREUwLCAoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgc3Bpb3JkeSkgPyBFTlNQSU9SRFkgOiAwKTsKCQkJU0VUUE9SVChTSU1PREUxLCBFTlBIQVNFTUlTIHwgRU5TQ1NJUlNUIHwgRU5TQ1NJUEVSUiB8IEVOQlVTRlJFRSk7IAoJCX0KCX0gZWxzZSBpZihTVEFURT09c2VsZGkpIHsKCQlEUFJJTlRLKGRlYnVnX2ludHIsIERFQlVHX0xFQUQgImV4cGVjdGluZzogKHBoYXNlIGNoYW5nZSkgKGlkZW50aWZ5KVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJU0VUUE9SVChTSU1PREUwLCAwKTsKCQlTRVRQT1JUKFNJTU9ERTEsIEVOUEhBU0VNSVMgfCBFTlNDU0lSU1QgfCBFTlNDU0lQRVJSIHwgRU5CVVNGUkVFKTsgCgl9IGVsc2UgewoJCURQUklOVEsoZGVidWdfaW50ciwgREVCVUdfTEVBRCAiZXhwZWN0aW5nOiAlcyAlc1xuIiwKCQkJQ01ESU5GTyhDVVJSRU5UX1NDKSwKCQkJRElTQ09OTkVDVEVEX1NDID8gIihyZXNlbGVjdGlvbikiIDogIiIsCgkJCUlTU1VFX1NDID8gIihidXNmcmVlKSIgOiAiIik7CgkJU0VUUE9SVChTSU1PREUwLCBESVNDT05ORUNURURfU0MgPyBFTlNFTERJIDogMCk7CgkJU0VUUE9SVChTSU1PREUxLCBFTlNDU0lSU1QgfCAoIChJU1NVRV9TQ3x8RE9ORV9TQykgPyBFTkJVU0ZSRUUgOiAwKSk7Cgl9CgoJaWYoIUhPU1REQVRBKHNocG50KS0+aW5faW50cikKCQlTRVRCSVRTKERNQUNOVFJMMCwgSU5URU4pOwoKCXJldHVybiBURVNUSEkoRE1BU1RBVCwgSU5UU1RBVCk7Cn0KCgovKiAKICogIFF1ZXVlIGEgY29tbWFuZCBhbmQgc2V0dXAgaW50ZXJydXB0cyBmb3IgYSBmcmVlIGJ1cy4KICovCnN0YXRpYyBpbnQgYWhhMTUyeF9pbnRlcm5hbF9xdWV1ZShTY3NpX0NtbmQgKlNDcG50LCBzdHJ1Y3Qgc2VtYXBob3JlICpzZW0sIGludCBwaGFzZSwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKewoJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCiNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCglpZiAoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX3F1ZXVlKSB7CgkJcHJpbnRrKElORk9fTEVBRCAicXVldWU6ICVwOyBjbWRfbGVuPSVkIHBpZWNlcz0lZCBzaXplPSV1IGNtbmQ9IiwKCQkgICAgICAgQ01ESU5GTyhTQ3BudCksIFNDcG50LCBTQ3BudC0+Y21kX2xlbiwgU0NwbnQtPnVzZV9zZywgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CgkJX19zY3NpX3ByaW50X2NvbW1hbmQoU0NwbnQtPmNtbmQpOwoJfQojZW5kaWYKCglTQ3BudC0+c2NzaV9kb25lCT0gZG9uZTsKCVNDcG50LT5yZXNpZCAJCT0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKCVNDcG50LT5TQ3AucGhhc2UJPSBub3RfaXNzdWVkIHwgcGhhc2U7CglTQ3BudC0+U0NwLlN0YXR1cwk9IENIRUNLX0NPTkRJVElPTjsKCVNDcG50LT5TQ3AuTWVzc2FnZQk9IDA7CglTQ3BudC0+U0NwLmhhdmVfZGF0YV9pbgk9IDA7CglTQ3BudC0+U0NwLnNlbnRfY29tbWFuZAk9IDA7CgoJaWYoU0NwbnQtPlNDcC5waGFzZSAmIChyZXNldHRpbmd8Y2hlY2tfY29uZGl0aW9uKSkgewoJCWlmKFNDcG50LT5ob3N0X3NjcmliYmxlPT0wIHx8IFNDU0VNKFNDcG50KSB8fCBTQ05FWFQoU0NwbnQpKSB7CgkJCXByaW50ayhFUlJfTEVBRCAiY2Fubm90IHJldXNlIGNvbW1hbmRcbiIsIENNRElORk8oU0NwbnQpKTsKCQkJcmV0dXJuIEZBSUxFRDsKCQl9Cgl9IGVsc2UgewoJCXN0cnVjdCBhaGExNTJ4X3NjZGF0YSAqc2M7CgoJCVNDcG50LT5ob3N0X3NjcmliYmxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFoYTE1Mnhfc2NkYXRhKSwgR0ZQX0FUT01JQyk7CgkJaWYoU0NwbnQtPmhvc3Rfc2NyaWJibGU9PTApIHsKCQkJcHJpbnRrKEVSUl9MRUFEICJhbGxvY2F0aW9uIGZhaWxlZFxuIiwgQ01ESU5GTyhTQ3BudCkpOwoJCQlyZXR1cm4gRkFJTEVEOwoJCX0KCgkJc2MgPSBTQ0RBVEEoU0NwbnQpOwoJCW1lbWNweShzYy0+Y21uZCwgU0NwbnQtPmNtbmQsIHNpemVvZihzYy0+Y21uZCkpOwoJCXNjLT5yZXF1ZXN0X2J1ZmZlciAgPSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CgkJc2MtPnJlcXVlc3RfYnVmZmxlbiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47CgkJc2MtPnVzZV9zZyAgICAgICAgICA9IFNDcG50LT51c2Vfc2c7CgkJc2MtPmNtZF9sZW4gICAgICAgICA9IFNDcG50LT5jbWRfbGVuOwoJfQoKCVNDTkVYVChTQ3BudCkJCT0gTlVMTDsKCVNDU0VNKFNDcG50KQkJPSBzZW07CgoJLyogc2V0dXAgc2NyYXRjaCBhcmVhCgkgICBTQ3AucHRyICAgICAgICAgICAgICA6IGJ1ZmZlciBwb2ludGVyCgkgICBTQ3AudGhpc19yZXNpZHVhbCAgICA6IGJ1ZmZlciBsZW5ndGgKCSAgIFNDcC5idWZmZXIgICAgICAgICAgIDogbmV4dCBidWZmZXIKCSAgIFNDcC5idWZmZXJzX3Jlc2lkdWFsIDogbGVmdCBidWZmZXJzIGluIGxpc3QKCSAgIFNDcC5waGFzZSAgICAgICAgICAgIDogY3VycmVudCBzdGF0ZSBvZiB0aGUgY29tbWFuZCAqLwoJaWYgKFNDcG50LT51c2Vfc2cpIHsKCQlTQ3BudC0+U0NwLmJ1ZmZlciAgICAgICAgICAgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKCQlTQ3BudC0+U0NwLnB0ciAgICAgICAgICAgICAgPSBTR19BRERSRVNTKFNDcG50LT5TQ3AuYnVmZmVyKTsKCQlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgICAgPSBTQ3BudC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOwoJCVNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IFNDcG50LT51c2Vfc2cgLSAxOwoJfSBlbHNlIHsKCQlTQ3BudC0+U0NwLnB0ciAgICAgICAgICAgICAgPSAoY2hhciAqKSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CgkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsICAgID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKCQlTQ3BudC0+U0NwLmJ1ZmZlciAgICAgICAgICAgPSBOVUxMOwoJCVNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7Cgl9CgoJRE9fTE9DSyhmbGFncyk7CgojaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCglIT1NUREFUQShzaHBudCktPnRvdGFsX2NvbW1hbmRzKys7CiNlbmRpZgoKCS8qIFR1cm4gbGVkIG9uLCB3aGVuIHRoaXMgaXMgdGhlIGZpcnN0IGNvbW1hbmQuICovCglIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKys7CglpZiAoSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcz09MSkKCQlTRVRQT1JUKFBPUlRBLCAxKTsKCglhcHBlbmRfU0MoJklTU1VFX1NDLCBTQ3BudCk7CgoJaWYoIUhPU1REQVRBKHNocG50KS0+aW5faW50cikKCQlzZXR1cF9leHBlY3RlZF9pbnRlcnJ1cHRzKHNocG50KTsKCglET19VTkxPQ0soZmxhZ3MpOwoKCXJldHVybiAwOwp9CgovKgogKiAgcXVldWUgYSBjb21tYW5kCiAqCiAqLwpzdGF0aWMgaW50IGFoYTE1MnhfcXVldWUoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKewojaWYgMAoJaWYoKlNDcG50LT5jbW5kID09IFJFUVVFU1RfU0VOU0UpIHsKCQlTQ3BudC0+cmVzdWx0ID0gMDsKCQlkb25lKFNDcG50KTsKCgkJcmV0dXJuIDA7Cgl9CiNlbmRpZgoKCXJldHVybiBhaGExNTJ4X2ludGVybmFsX3F1ZXVlKFNDcG50LCBOVUxMLCAwLCBkb25lKTsKfQoKCi8qCiAqICAKICoKICovCnN0YXRpYyB2b2lkIHJlc2V0X2RvbmUoU2NzaV9DbW5kICpTQ3BudCkKewojaWYgMAoJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBTQ3BudC0+aG9zdDsKCURQUklOVEsoZGVidWdfZWgsIElORk9fTEVBRCAicmVzZXRfZG9uZSBjYWxsZWRcbiIsIENNRElORk8oU0NwbnQpKTsKI2VuZGlmCglpZihTQ1NFTShTQ3BudCkpIHsKCQl1cChTQ1NFTShTQ3BudCkpOwoJfSBlbHNlIHsKCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IHJlc2V0X2RvbmUgdy9vIHNlbWFwaG9yZVxuIik7Cgl9Cn0KCi8qCiAqICBBYm9ydCBhIGNvbW1hbmQKICoKICovCnN0YXRpYyBpbnQgYWhhMTUyeF9hYm9ydChTY3NpX0NtbmQgKlNDcG50KQp7CglzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CglTY3NpX0NtbmQgKnB0cjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgojaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQoJaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX2VoKSB7CgkJcHJpbnRrKERFQlVHX0xFQUQgImFib3J0KCVwKSIsIENNRElORk8oU0NwbnQpLCBTQ3BudCk7CgkJc2hvd19xdWV1ZXMoc2hwbnQpOwoJfQojZW5kaWYKCglET19MT0NLKGZsYWdzKTsKCglwdHI9cmVtb3ZlX1NDKCZJU1NVRV9TQywgU0NwbnQpOwoKCWlmKHB0cikgewoJCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgIm5vdCB5ZXQgaXNzdWVkIC0gU1VDQ0VTU1xuIiwgQ01ESU5GTyhTQ3BudCkpOwoKCQlIT1NUREFUQShzaHBudCktPmNvbW1hbmRzLS07CgkJaWYgKCFIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKQoJCQlTRVRQT1JUKFBPUlRBLCAwKTsKCQlET19VTkxPQ0soZmxhZ3MpOwoKCQlrZnJlZShTQ3BudC0+aG9zdF9zY3JpYmJsZSk7CgkJU0NwbnQtPmhvc3Rfc2NyaWJibGU9TlVMTDsKCgkJcmV0dXJuIFNVQ0NFU1M7Cgl9IAoKCURPX1VOTE9DSyhmbGFncyk7CgoJLyoKCSAqIEZJWE1FOgoJICogZm9yIGN1cnJlbnQgY29tbWFuZDogcXVldWUgQUJPUlQgZm9yIG1lc3NhZ2Ugb3V0IGFuZCByYWlzZSBBVE4KCSAqIGZvciBkaXNjb25uZWN0ZWQgY29tbWFuZDogcHNldWRvIFNDIHdpdGggQUJPUlQgbWVzc2FnZSBvciBBQk9SVCBvbiByZXNlbGVjdGlvbj8KCSAqCgkgKi8KCglwcmludGsoRVJSX0xFQUQgImNhbm5vdCBhYm9ydCBydW5uaW5nIG9yIGRpc2Nvbm5lY3RlZCBjb21tYW5kXG4iLCBDTURJTkZPKFNDcG50KSk7CgoJcmV0dXJuIEZBSUxFRDsKfQoKc3RhdGljIHZvaWQgdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIHApCnsKCVNjc2lfQ21uZAkgKlNDcCAgID0gKFNjc2lfQ21uZCAqKXA7CglzdHJ1Y3Qgc2VtYXBob3JlICpzZW0gICA9IFNDU0VNKFNDcCk7CglzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcC0+ZGV2aWNlLT5ob3N0OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgkvKiByZW1vdmUgY29tbWFuZCBmcm9tIGlzc3VlIHF1ZXVlICovCglET19MT0NLKGZsYWdzKTsKCXJlbW92ZV9TQygmSVNTVUVfU0MsIFNDcCk7CglET19VTkxPQ0soZmxhZ3MpOwoKCXVwKHNlbSk7Cn0KCi8qCiAqIFJlc2V0IGEgZGV2aWNlCiAqCiAqLwpzdGF0aWMgaW50IGFoYTE1MnhfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KQp7CglzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CglERUNMQVJFX01VVEVYX0xPQ0tFRChzZW0pOwoJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CglpbnQgcmV0LCBpc3N1ZWQsIGRpc2Nvbm5lY3RlZDsKCXVuc2lnbmVkIGNoYXIgb2xkX2NtZF9sZW4gPSBTQ3BudC0+Y21kX2xlbjsKCXVuc2lnbmVkIHNob3J0IG9sZF91c2Vfc2cgPSBTQ3BudC0+dXNlX3NnOwoJdm9pZCAqb2xkX2J1ZmZlciA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKCXVuc2lnbmVkIG9sZF9idWZmbGVuID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgojaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQoJaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX2VoKSB7CgkJcHJpbnRrKElORk9fTEVBRCAiYWhhMTUyeF9kZXZpY2VfcmVzZXQoJXApIiwgQ01ESU5GTyhTQ3BudCksIFNDcG50KTsKCQlzaG93X3F1ZXVlcyhzaHBudCk7Cgl9CiNlbmRpZgoKCWlmKENVUlJFTlRfU0M9PVNDcG50KSB7CgkJcHJpbnRrKEVSUl9MRUFEICJjYW5ub3QgcmVzZXQgY3VycmVudCBkZXZpY2VcbiIsIENNRElORk8oU0NwbnQpKTsKCQlyZXR1cm4gRkFJTEVEOwoJfQoKCURPX0xPQ0soZmxhZ3MpOwoJaXNzdWVkICAgICAgID0gcmVtb3ZlX1NDKCZJU1NVRV9TQywgU0NwbnQpPT0wOwoJZGlzY29ubmVjdGVkID0gaXNzdWVkICYmIHJlbW92ZV9TQygmRElTQ09OTkVDVEVEX1NDLCBTQ3BudCk7CglET19VTkxPQ0soZmxhZ3MpOwoKCVNDcG50LT5jbWRfbGVuICAgICAgICAgPSAwOwoJU0NwbnQtPnVzZV9zZyAgICAgICAgICA9IDA7CglTQ3BudC0+cmVxdWVzdF9idWZmZXIgID0gTlVMTDsKCVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gPSAwOwoKCWluaXRfdGltZXIoJnRpbWVyKTsKCXRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpIFNDcG50OwoJdGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgMTAwKkhaOyAgIC8qIDEwcyAqLwoJdGltZXIuZnVuY3Rpb24gPSAodm9pZCAoKikodW5zaWduZWQgbG9uZykpIHRpbWVyX2V4cGlyZWQ7CgoJYWhhMTUyeF9pbnRlcm5hbF9xdWV1ZShTQ3BudCwgJnNlbSwgcmVzZXR0aW5nLCByZXNldF9kb25lKTsKCWFkZF90aW1lcigmdGltZXIpOwoJZG93bigmc2VtKTsKCWRlbF90aW1lcigmdGltZXIpOwoKCVNDcG50LT5jbWRfbGVuICAgICAgICAgPSBvbGRfY21kX2xlbjsKCVNDcG50LT51c2Vfc2cgICAgICAgICAgPSBvbGRfdXNlX3NnOwogIAlTQ3BudC0+cmVxdWVzdF9idWZmZXIgID0gb2xkX2J1ZmZlcjsKICAgICAgIAlTQ3BudC0+cmVxdWVzdF9idWZmbGVuID0gb2xkX2J1ZmZsZW47CgoJRE9fTE9DSyhmbGFncyk7CgoJaWYoU0NwbnQtPlNDcC5waGFzZSAmIHJlc2V0dGVkKSB7CgkJSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcy0tOwoJCWlmICghSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcykKCQkJU0VUUE9SVChQT1JUQSwgMCk7CgkJa2ZyZWUoU0NwbnQtPmhvc3Rfc2NyaWJibGUpOwoJCVNDcG50LT5ob3N0X3NjcmliYmxlPU5VTEw7CgoJCXJldCA9IFNVQ0NFU1M7Cgl9IGVsc2UgewoJCS8qIHJlcXVldWUgKi8KCQlpZighaXNzdWVkKSB7CgkJCWFwcGVuZF9TQygmSVNTVUVfU0MsIFNDcG50KTsKCQl9IGVsc2UgaWYoZGlzY29ubmVjdGVkKSB7CgkJCWFwcGVuZF9TQygmRElTQ09OTkVDVEVEX1NDLCBTQ3BudCk7CgkJfQoJCgkJcmV0ID0gRkFJTEVEOwoJfQoKCURPX1VOTE9DSyhmbGFncyk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBmcmVlX2hhcmRfcmVzZXRfU0NzKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBTY3NpX0NtbmQgKipTQ3MpCnsKCVNjc2lfQ21uZCAqcHRyOwoKCXB0cj0qU0NzOwoJd2hpbGUocHRyKSB7CgkJU2NzaV9DbW5kICpuZXh0OwoKCQlpZihTQ0RBVEEocHRyKSkgewoJCQluZXh0ID0gU0NORVhUKHB0cik7CgkJfSBlbHNlIHsKCQkJcHJpbnRrKERFQlVHX0xFQUQgInF1ZXVlIGNvcnJ1cHRlZCBhdCAlcFxuIiwgQ01ESU5GTyhwdHIpLCBwdHIpOwoJCQluZXh0ID0gTlVMTDsKCQl9CgoJCWlmICghcHRyLT5kZXZpY2UtPnNvZnRfcmVzZXQpIHsKCQkJRFBSSU5USyhkZWJ1Z19laCwgREVCVUdfTEVBRCAiZGlzY29ubmVjdGVkIGNvbW1hbmQgJXAgcmVtb3ZlZFxuIiwgQ01ESU5GTyhwdHIpLCBwdHIpOwoJCQlyZW1vdmVfU0MoU0NzLCBwdHIpOwoJCQlIT1NUREFUQShzaHBudCktPmNvbW1hbmRzLS07CgkJCWtmcmVlKHB0ci0+aG9zdF9zY3JpYmJsZSk7CgkJCXB0ci0+aG9zdF9zY3JpYmJsZT1OVUxMOwoJCX0KCgkJcHRyID0gbmV4dDsKCX0KfQoKLyoKICogUmVzZXQgdGhlIGJ1cwogKgogKi8Kc3RhdGljIGludCBhaGExNTJ4X2J1c19yZXNldF9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCURPX0xPQ0soZmxhZ3MpOwoKI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKCWlmKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19laCkgewoJCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IGJ1cyByZXNldCIsIHNocG50LT5ob3N0X25vKTsKCQlzaG93X3F1ZXVlcyhzaHBudCk7Cgl9CiNlbmRpZgoKCWZyZWVfaGFyZF9yZXNldF9TQ3Moc2hwbnQsICZJU1NVRV9TQyk7CglmcmVlX2hhcmRfcmVzZXRfU0NzKHNocG50LCAmRElTQ09OTkVDVEVEX1NDKTsKCglEUFJJTlRLKGRlYnVnX2VoLCBLRVJOX0RFQlVHICJzY3NpJWQ6IHJlc2V0dGluZyBidXNcbiIsIHNocG50LT5ob3N0X25vKTsKCglTRVRQT1JUKFNDU0lTRVEsIFNDU0lSU1RPKTsKCW1kZWxheSgyNTYpOwoJU0VUUE9SVChTQ1NJU0VRLCAwKTsKCW1kZWxheShERUxBWSk7CgoJRFBSSU5USyhkZWJ1Z19laCwgS0VSTl9ERUJVRyAic2NzaSVkOiBidXMgcmVzZXR0ZWRcbiIsIHNocG50LT5ob3N0X25vKTsKCglzZXR1cF9leHBlY3RlZF9pbnRlcnJ1cHRzKHNocG50KTsKCWlmKEhPU1REQVRBKHNocG50KS0+Y29tbWFuZHM9PTApCgkJU0VUUE9SVChQT1JUQSwgMCk7CgoJRE9fVU5MT0NLKGZsYWdzKTsKCglyZXR1cm4gU1VDQ0VTUzsKfQoKLyoKICogUmVzZXQgdGhlIGJ1cwogKgogKi8Kc3RhdGljIGludCBhaGExNTJ4X2J1c19yZXNldChTY3NpX0NtbmQgKlNDcG50KQp7CglyZXR1cm4gYWhhMTUyeF9idXNfcmVzZXRfaG9zdChTQ3BudC0+ZGV2aWNlLT5ob3N0KTsKfQoKLyoKICogIFJlc3RvcmUgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIEFJQy02MjYwIHJlZ2lzdGVycyBhbmQgcmVzZXQgdGhlIGZpZm9zCiAqCiAqLwpzdGF0aWMgdm9pZCByZXNldF9wb3J0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KCVNFVFBPUlQoRE1BQ05UUkwwLCBSU1RGSUZPKTsKCglTRVRQT1JUKFNDU0lTRVEsIDApOwoKCVNFVFBPUlQoU1hGUkNUTDEsIDApOwoJU0VUUE9SVChTQ1NJU0lHLCAwKTsKCVNFVFJBVEUoMCk7CgoJLyogY2xlYXIgYWxsIGludGVycnVwdCBjb25kaXRpb25zICovCglTRVRQT1JUKFNTVEFUMCwgMHg3Zik7CglTRVRQT1JUKFNTVEFUMSwgMHhlZik7CgoJU0VUUE9SVChTU1RBVDQsIFNZTkNFUlIgfCBGV0VSUiB8IEZSRVJSKTsKCglTRVRQT1JUKERNQUNOVFJMMCwgMCk7CglTRVRQT1JUKERNQUNOVFJMMSwgMCk7CgoJU0VUUE9SVChCUlNUQ05UUkwsIDB4ZjEpOwoKCS8qIGNsZWFyIFNDU0kgZmlmb3MgYW5kIHRyYW5zZmVyIGNvdW50ICovCglTRVRQT1JUKFNYRlJDVEwwLCBDSDF8Q0xSQ0gxfENMUlNUQ05UKTsKCVNFVFBPUlQoU1hGUkNUTDAsIENIMSk7CgoJRE9fTE9DSyhmbGFncyk7CglzZXR1cF9leHBlY3RlZF9pbnRlcnJ1cHRzKHNocG50KTsKCURPX1VOTE9DSyhmbGFncyk7Cn0KCi8qCiAqIFJlc2V0IHRoZSBob3N0IChidXMgYW5kIGNvbnRyb2xsZXIpCiAqCiAqLwppbnQgYWhhMTUyeF9ob3N0X3Jlc2V0X2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCURQUklOVEsoZGVidWdfZWgsIEtFUk5fREVCVUcgInNjc2klZDogaG9zdCByZXNldFxuIiwgc2hwbnQtPmhvc3Rfbm8pOwoKCWFoYTE1MnhfYnVzX3Jlc2V0X2hvc3Qoc2hwbnQpOwoKCURQUklOVEsoZGVidWdfZWgsIEtFUk5fREVCVUcgInNjc2klZDogcmVzZXR0aW5nIHBvcnRzXG4iLCBzaHBudC0+aG9zdF9ubyk7CglyZXNldF9wb3J0cyhzaHBudCk7CgoJcmV0dXJuIFNVQ0NFU1M7Cn0KCi8qCiAqIFJlc2V0IHRoZSBob3N0IChidXMgYW5kIGNvbnRyb2xsZXIpCiAqIAogKi8Kc3RhdGljIGludCBhaGExNTJ4X2hvc3RfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKewoJcmV0dXJuIGFoYTE1MnhfaG9zdF9yZXNldF9ob3N0KFNDcG50LT5kZXZpY2UtPmhvc3QpOwp9CgovKgogKiBSZXR1cm4gdGhlICJsb2dpY2FsIGdlb21ldHJ5IgogKgogKi8Kc3RhdGljIGludCBhaGExNTJ4X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCgkJc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaW5mb19hcnJheSkKewoJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBzZGV2LT5ob3N0OwoKCS8qIHRyeSBkZWZhdWx0IHRyYW5zbGF0aW9uICovCglpbmZvX2FycmF5WzBdID0gNjQ7CglpbmZvX2FycmF5WzFdID0gMzI7CglpbmZvX2FycmF5WzJdID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgLyAoNjQgKiAzMik7CgoJLyogZm9yIGRpc2tzID4xR0IgZG8gc29tZSBndWVzc2luZyAqLwoJaWYgKGluZm9fYXJyYXlbMl0gPj0gMTAyNCkgewoJCWludCBpbmZvWzNdOwoKCQkvKiB0cnkgdG8gZmlndXJlIG91dCB0aGUgZ2VvbWV0cnkgZnJvbSB0aGUgcGFydGl0aW9uIHRhYmxlICovCgkJaWYgKHNjc2ljYW1fYmlvc19wYXJhbShiZGV2LCBjYXBhY2l0eSwgaW5mbykgPCAwIHx8CgkJICAgICEoKGluZm9bMF0gPT0gNjQgJiYgaW5mb1sxXSA9PSAzMikgfHwgKGluZm9bMF0gPT0gMjU1ICYmIGluZm9bMV0gPT0gNjMpKSkgewoJCQlpZiAoRVhUX1RSQU5TKSB7CgkJCQlwcmludGsoS0VSTl9OT1RJQ0UKCQkJCSAgICAgICAiYWhhMTUyeDogdW5hYmxlIHRvIHZlcmlmeSBnZW9tZXRyeSBmb3IgZGlzayB3aXRoID4xR0IuXG4iCgkJCQkgICAgICAgIiAgICAgICAgIHVzaW5nIGV4dGVuZGVkIHRyYW5zbGF0aW9uLlxuIik7CgkJCQlpbmZvX2FycmF5WzBdID0gMjU1OwoJCQkJaW5mb19hcnJheVsxXSA9IDYzOwoJCQkJaW5mb19hcnJheVsyXSA9ICh1bnNpZ25lZCBsb25nKWNhcGFjaXR5IC8gKDI1NSAqIDYzKTsKCQkJfSBlbHNlIHsKCQkJCXByaW50ayhLRVJOX05PVElDRQoJCQkJICAgICAgICJhaGExNTJ4OiB1bmFibGUgdG8gdmVyaWZ5IGdlb21ldHJ5IGZvciBkaXNrIHdpdGggPjFHQi5cbiIKCQkJCSAgICAgICAiICAgICAgICAgVXNpbmcgZGVmYXVsdCB0cmFuc2xhdGlvbi4gUGxlYXNlIHZlcmlmeSB5b3Vyc2VsZi5cbiIKCQkJCSAgICAgICAiICAgICAgICAgUGVyaGFwcyB5b3UgbmVlZCB0byBlbmFibGUgZXh0ZW5kZWQgdHJhbnNsYXRpb24gaW4gdGhlIGRyaXZlci5cbiIKCQkJCSAgICAgICAiICAgICAgICAgU2VlIERvY3VtZW50YXRpb24vc2NzaS9haGExNTJ4LnR4dCBmb3IgZGV0YWlscy5cbiIpOwoJCQl9CgkJfSBlbHNlIHsKCQkJaW5mb19hcnJheVswXSA9IGluZm9bMF07CgkJCWluZm9fYXJyYXlbMV0gPSBpbmZvWzFdOwoJCQlpbmZvX2FycmF5WzJdID0gaW5mb1syXTsKCgkJCWlmIChpbmZvWzBdID09IDI1NSAmJiAhRVhUX1RSQU5TKSB7CgkJCQlwcmludGsoS0VSTl9OT1RJQ0UKCQkJCSAgICAgICAiYWhhMTUyeDogY3VycmVudCBwYXJ0aXRpb24gdGFibGUgaXMgdXNpbmcgZXh0ZW5kZWQgdHJhbnNsYXRpb24uXG4iCgkJCQkgICAgICAgIiAgICAgICAgIHVzaW5nIGl0IGFsc28sIGFsdGhvdWdoIGl0J3Mgbm90IGV4cGxpY2l0bHkgZW5hYmxlZC5cbiIpOwoJCQl9CgkJfQoJfQoKCXJldHVybiAwOwp9CgovKgogKiAgSW50ZXJuYWwgZG9uZSBmdW5jdGlvbgogKgogKi8Kc3RhdGljIHZvaWQgZG9uZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgaW50IGVycm9yKQp7CglpZiAoQ1VSUkVOVF9TQykgewoJCWlmKERPTkVfU0MpCgkJCXByaW50ayhFUlJfTEVBRCAidGhlcmUncyBhbHJlYWR5IGEgY29tcGxldGVkIGNvbW1hbmQgJXAgLSB3aWxsIGNhdXNlIGFib3J0XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBET05FX1NDKTsKCgkJRE9ORV9TQyA9IENVUlJFTlRfU0M7CgkJQ1VSUkVOVF9TQyA9IE5VTEw7CgkJRE9ORV9TQy0+cmVzdWx0ID0gZXJyb3I7Cgl9IGVsc2UKCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGRvbmUoKSBjYWxsZWQgb3V0c2lkZSBvZiBjb21tYW5kXG4iKTsKfQoKc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBhaGExNTJ4X3RxOwoKLyoKICogUnVuIHNlcnZpY2UgY29tcGxldGlvbnMgb24gdGhlIGNhcmQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCiAqCiAqLwpzdGF0aWMgdm9pZCBydW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQp7CglzdHJ1Y3QgYWhhMTUyeF9ob3N0ZGF0YSAqaGQ7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeShoZCwgJmFoYTE1MnhfaG9zdF9saXN0LCBob3N0X2xpc3QpIHsKCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNvbnRhaW5lcl9vZigodm9pZCAqKWhkLCBzdHJ1Y3QgU2NzaV9Ib3N0LCBob3N0ZGF0YSk7CgoJCWlzX2NvbXBsZXRlKHNob3N0KTsKCX0KfQoKLyoKICogSW50ZXJydXB0IGhhbmRsZXIKICoKICovCnN0YXRpYyBpcnFyZXR1cm5fdCBpbnRyKGludCBpcnFubywgdm9pZCAqZGV2X2lkKQp7CglzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopZGV2X2lkOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGNoYXIgcmV2LCBkbWFjbnRybDA7CgoJaWYgKCFzaHBudCkgewoJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogY2F0Y2hlZCBpbnRlcnJ1cHQgJWQgZm9yIHVua25vd24gY29udHJvbGxlci5cbiIsIGlycW5vKTsKCQlyZXR1cm4gSVJRX05PTkU7Cgl9CgoJLyoKCSAqIFJlYWQgYSBjb3VwbGUgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIGtub3duIHRvIG5vdCBiZSBhbGwgMSdzLiBJZgoJICogd2UgcmVhZCBhbGwgMSdzICgtMSksIHRoYXQgbWVhbnMgdGhhdCBlaXRoZXI6CgkgKgoJICogYS4gVGhlIGhvc3QgYWRhcHRlciBjaGlwIGhhcyBnb25lIGJhZCwgYW5kIHdlIGNhbm5vdCBjb250cm9sIGl0LAoJICoJT1IKCSAqIGIuIFRoZSBob3N0IGFkYXB0ZXIgaXMgYSBQQ01DSUEgY2FyZCB0aGF0IGhhcyBiZWVuIGVqZWN0ZWQKCSAqCgkgKiBJbiBlaXRoZXIgY2FzZSwgd2UgY2Fubm90IGRvIGFueXRoaW5nIHdpdGggdGhlIGhvc3QgYWRhcHRlciBhdAoJICogdGhpcyBwb2ludCBpbiB0aW1lLiBTbyBqdXN0IGlnbm9yZSB0aGUgaW50ZXJydXB0IGFuZCByZXR1cm4uCgkgKiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBpbnRlcnJ1cHQgbWlnaHQgYWN0dWFsbHkgYmUgbWVhbnQgZm9yCgkgKiBzb21lb25lIGVsc2Ugc2hhcmluZyB0aGlzIElSUSwgYW5kIHRoYXQgZHJpdmVyIHdpbGwgaGFuZGxlIGl0LgoJICovCglyZXYgPSBHRVRQT1JUKFJFVik7CglkbWFjbnRybDAgPSBHRVRQT1JUKERNQUNOVFJMMCk7CglpZiAoKHJldiA9PSAweEZGKSAmJiAoZG1hY250cmwwID09IDB4RkYpKQoJCXJldHVybiBJUlFfTk9ORTsKCglpZiggVEVTVExPKERNQVNUQVQsIElOVFNUQVQpICkKCQlyZXR1cm4gSVJRX05PTkU7CQoKCS8qIG5vIG1vcmUgaW50ZXJydXB0cyBmcm9tIHRoZSBjb250cm9sbGVyLCB3aGlsZSB3ZSdyZSBidXN5LgoJICAgSU5URU4gaXMgcmVzdG9yZWQgYnkgdGhlIEJIIGhhbmRsZXIgKi8KCUNMUkJJVFMoRE1BQ05UUkwwLCBJTlRFTik7CgoJRE9fTE9DSyhmbGFncyk7CglpZiggSE9TVERBVEEoc2hwbnQpLT5zZXJ2aWNlPT0wICkgewoJCUhPU1REQVRBKHNocG50KS0+c2VydmljZT0xOwoKCQkvKiBQb2tlIHRoZSBCSCBoYW5kbGVyICovCgkJSU5JVF9XT1JLKCZhaGExNTJ4X3RxLCBydW4pOwoJCXNjaGVkdWxlX3dvcmsoJmFoYTE1MnhfdHEpOwoJfQoJRE9fVU5MT0NLKGZsYWdzKTsKCglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCi8qCiAqIGJ1c2ZyZWUgcGhhc2UKICogLSBoYW5kbGUgY29tcGxldGl0aW9uL2Rpc2Nvbm5lY3Rpb24vZXJyb3Igb2YgY3VycmVudCBjb21tYW5kCiAqIC0gc3RhcnQgc2VsZWN0aW9uIGZvciBuZXh0IGNvbW1hbmQgKGlmIGFueSkKICovCnN0YXRpYyB2b2lkIGJ1c2ZyZWVfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwojaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCglpbnQgYWN0aW9uPTA7CiNlbmRpZgoKCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxDTFJDSDF8Q0xSU1RDTlQpOwoJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxKTsKCglTRVRQT1JUKFNTVEFUMSwgQ0xSQlVTRlJFRSk7CgkKCWlmKENVUlJFTlRfU0MpIHsKI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQoJCWFjdGlvbisrOwojZW5kaWYKCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJj0gfnN5bmNuZWc7CgoJCWlmKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIGNvbXBsZXRlZCkgewoJCQkvKiB0YXJnZXQgc2VudCBDT01NQU5EIENPTVBMRVRFICovCgkJCWRvbmUoc2hwbnQsIChDVVJSRU5UX1NDLT5TQ3AuU3RhdHVzICYgMHhmZikgfCAoKENVUlJFTlRfU0MtPlNDcC5NZXNzYWdlICYgMHhmZikgPDwgOCkgfCAoRElEX09LIDw8IDE2KSk7CgoJCX0gZWxzZSBpZihDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBhYm9ydGVkKSB7CgkJCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgIkFCT1JUIHNlbnRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOwoJCQlkb25lKHNocG50LCAoQ1VSUkVOVF9TQy0+U0NwLlN0YXR1cyAmIDB4ZmYpIHwgKChDVVJSRU5UX1NDLT5TQ3AuTWVzc2FnZSAmIDB4ZmYpIDw8IDgpIHwgKERJRF9BQk9SVCA8PCAxNikpOwoKCQl9IGVsc2UgaWYoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgcmVzZXR0ZWQpIHsKCQkJRFBSSU5USyhkZWJ1Z19laCwgREVCVUdfTEVBRCAiQlVTIERFVklDRSBSRVNFVCBzZW50XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQkJZG9uZShzaHBudCwgKENVUlJFTlRfU0MtPlNDcC5TdGF0dXMgJiAweGZmKSB8ICgoQ1VSUkVOVF9TQy0+U0NwLk1lc3NhZ2UgJiAweGZmKSA8PCA4KSB8IChESURfUkVTRVQgPDwgMTYpKTsKCgkJfSBlbHNlIGlmKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIGRpc2Nvbm5lY3RlZCkgewoJCQkvKiB0YXJnZXQgc2VudCBESVNDT05ORUNUICovCgkJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJ0YXJnZXQgZGlzY29ubmVjdGVkIGF0ICVkLyVkXG4iLAoJCQkJQ01ESU5GTyhDVVJSRU5UX1NDKSwKCQkJCUNVUlJFTlRfU0MtPnJlc2lkLAoJCQkJQ1VSUkVOVF9TQy0+cmVxdWVzdF9idWZmbGVuKTsKI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQoJCQlIT1NUREFUQShzaHBudCktPmRpc2Nvbm5lY3Rpb25zKys7CiNlbmRpZgoJCQlhcHBlbmRfU0MoJkRJU0NPTk5FQ1RFRF9TQywgQ1VSUkVOVF9TQyk7CgkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSAxIDw8IDE2OwoJCQlDVVJSRU5UX1NDID0gTlVMTDsKCgkJfSBlbHNlIHsKCQkJZG9uZShzaHBudCwgRElEX0VSUk9SIDw8IDE2KTsKCQl9CiNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKCX0gZWxzZSB7CgkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfb2xkX2NvbW1hbmQrKzsKI2VuZGlmCgl9CgoJRE9fTE9DSyhmbGFncyk7CgoJaWYoRE9ORV9TQykgewojaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCgkJYWN0aW9uKys7CiNlbmRpZgoKCQlpZihET05FX1NDLT5TQ3AucGhhc2UgJiBjaGVja19jb25kaXRpb24pIHsKCQkJc3RydWN0IHNjc2lfY21uZCAqY21kID0gSE9TVERBVEEoc2hwbnQpLT5kb25lX1NDOwoJCQlzdHJ1Y3QgYWhhMTUyeF9zY2RhdGEgKnNjID0gU0NEQVRBKGNtZCk7CgojaWYgMAoJCQlpZihIT1NUREFUQShzaHBudCktPmRlYnVnICYgZGVidWdfZWgpIHsKCQkJCXByaW50ayhFUlJfTEVBRCAicmVjZWl2ZWQgc2Vuc2U6ICIsIENNRElORk8oRE9ORV9TQykpOwoJCQkJc2NzaV9wcmludF9zZW5zZSgiYmgiLCBET05FX1NDKTsKCQkJfQojZW5kaWYKCgkJCS8qIHJlc3RvcmUgb2xkIGNvbW1hbmQgKi8KCQkJbWVtY3B5KGNtZC0+Y21uZCwgc2MtPmNtbmQsIHNpemVvZihzYy0+Y21uZCkpOwoJCQljbWQtPnJlcXVlc3RfYnVmZmVyICA9IHNjLT5yZXF1ZXN0X2J1ZmZlcjsKCQkJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSBzYy0+cmVxdWVzdF9idWZmbGVuOwoJCQljbWQtPnVzZV9zZyAgICAgICAgICA9IHNjLT51c2Vfc2c7CgkJCWNtZC0+Y21kX2xlbiAgICAgICAgID0gc2MtPmNtZF9sZW47CgoJCQljbWQtPlNDcC5TdGF0dXMgPSAweDAyOwoKCQkJSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcy0tOwoJCQlpZiAoIUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMpCgkJCQlTRVRQT1JUKFBPUlRBLCAwKTsJLyogdHVybiBsZWQgb2ZmICovCgkJfSBlbHNlIGlmKERPTkVfU0MtPlNDcC5TdGF0dXM9PTB4MDIpIHsKI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQoJCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aF9jaGVja19jb25kaXRpb24rKzsKI2VuZGlmCiNpZiAwCgkJCURQUklOVEsoZGVidWdfZWgsIEVSUl9MRUFEICJDSEVDSyBDT05ESVRJT04gZm91bmRcbiIsIENNRElORk8oRE9ORV9TQykpOwojZW5kaWYKCgkJCWlmKCEoRE9ORV9TQy0+U0NwLlN0YXR1cyAmIG5vdF9pc3N1ZWQpKSB7CgkJCQlTY3NpX0NtbmQgKnB0ciA9IERPTkVfU0M7CgkJCQlET05FX1NDPU5VTEw7CiNpZiAwCgkJCQlEUFJJTlRLKGRlYnVnX2VoLCBFUlJfTEVBRCAicmVxdWVzdGluZyBzZW5zZVxuIiwgQ01ESU5GTyhwdHIpKTsKI2VuZGlmCgoJCQkJcHRyLT5jbW5kWzBdICAgICAgICAgPSBSRVFVRVNUX1NFTlNFOwoJCQkJcHRyLT5jbW5kWzFdICAgICAgICAgPSAwOwoJCQkJcHRyLT5jbW5kWzJdICAgICAgICAgPSAwOwoJCQkJcHRyLT5jbW5kWzNdICAgICAgICAgPSAwOwoJCQkJcHRyLT5jbW5kWzRdICAgICAgICAgPSBzaXplb2YocHRyLT5zZW5zZV9idWZmZXIpOwoJCQkJcHRyLT5jbW5kWzVdICAgICAgICAgPSAwOwoJCQkJcHRyLT5jbWRfbGVuICAgICAgICAgPSA2OwoJCQkJcHRyLT51c2Vfc2cgICAgICAgICAgPSAwOyAKCQkJCXB0ci0+cmVxdWVzdF9idWZmZXIgID0gcHRyLT5zZW5zZV9idWZmZXI7CgkJCQlwdHItPnJlcXVlc3RfYnVmZmxlbiA9IHNpemVvZihwdHItPnNlbnNlX2J1ZmZlcik7CgkJCQoJCQkJRE9fVU5MT0NLKGZsYWdzKTsKCQkJCWFoYTE1MnhfaW50ZXJuYWxfcXVldWUocHRyLCBOVUxMLCBjaGVja19jb25kaXRpb24sIHB0ci0+c2NzaV9kb25lKTsKCQkJCURPX0xPQ0soZmxhZ3MpOwojaWYgMAoJCQl9IGVsc2UgewoJCQkJRFBSSU5USyhkZWJ1Z19laCwgRVJSX0xFQUQgImNvbW1hbmQgbm90IGlzc3VlZCAtIENIRUNLIENPTkRJVElPTiBpZ25vcmVkXG4iLCBDTURJTkZPKERPTkVfU0MpKTsKI2VuZGlmCgkJCX0KCQl9CgoJCWlmKERPTkVfU0MgJiYgRE9ORV9TQy0+c2NzaV9kb25lKSB7CiNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCgkJCWludCBob3N0bm89RE9ORV9TQy0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vOwoJCQlpbnQgaWQ9RE9ORV9TQy0+ZGV2aWNlLT5pZCAmIDB4ZjsKCQkJaW50IGx1bj1ET05FX1NDLT5kZXZpY2UtPmx1biAmIDB4NzsKI2VuZGlmCgkJCVNjc2lfQ21uZCAqcHRyID0gRE9ORV9TQzsKCQkJRE9ORV9TQz1OVUxMOwoKCQkJLyogdHVybiBsZWQgb2ZmLCB3aGVuIG5vIGNvbW1hbmRzIGFyZSBpbiB0aGUgZHJpdmVyICovCgkJCUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMtLTsKCQkJaWYgKCFIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKQoJCQkJU0VUUE9SVChQT1JUQSwgMCk7CS8qIHR1cm4gbGVkIG9mZiAqLwoKCQkJaWYocHRyLT5zY3NpX2RvbmUgIT0gcmVzZXRfZG9uZSkgewoJCQkJa2ZyZWUocHRyLT5ob3N0X3NjcmliYmxlKTsKCQkJCXB0ci0+aG9zdF9zY3JpYmJsZT1OVUxMOwoJCQl9CgoJCQlET19VTkxPQ0soZmxhZ3MpOwoJCQlEUFJJTlRLKGRlYnVnX2RvbmUsIERFQlVHX0xFQUQgImNhbGxpbmcgc2NzaV9kb25lKCVwKVxuIiwgaG9zdG5vLCBpZCwgbHVuLCBwdHIpOwogICAgICAgICAgICAgICAgCXB0ci0+c2NzaV9kb25lKHB0cik7CgkJCURQUklOVEsoZGVidWdfZG9uZSwgREVCVUdfTEVBRCAic2NzaV9kb25lKCVwKSByZXR1cm5lZFxuIiwgaG9zdG5vLCBpZCwgbHVuLCBwdHIpOwoJCQlET19MT0NLKGZsYWdzKTsKCQl9CgoJCURPTkVfU0M9TlVMTDsKI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQoJfSBlbHNlIHsKCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9kb25lX2NvbW1hbmQrKzsKI2VuZGlmCgl9CgoJaWYoSVNTVUVfU0MpCgkJQ1VSUkVOVF9TQyA9IHJlbW92ZV9maXJzdF9TQygmSVNTVUVfU0MpOwoKCURPX1VOTE9DSyhmbGFncyk7CgoJaWYoQ1VSUkVOVF9TQykgewojaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCgkJYWN0aW9uKys7CiNlbmRpZgoJICAgIAlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gc2VsZWN0aW5nOwoKCQlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAic2VsZWN0aW5nIHRhcmdldFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgoJCS8qIGNsZWFyIHNlbGVjdGlvbiB0aW1lb3V0ICovCgkJU0VUUE9SVChTU1RBVDEsIFNFTFRPKTsKCgkJU0VUUE9SVChTQ1NJSUQsIChzaHBudC0+dGhpc19pZCA8PCBPSURfKSB8IENVUlJFTlRfU0MtPmRldmljZS0+aWQpOwoJCVNFVFBPUlQoU1hGUkNUTDEsIChQQVJJVFkgPyBFTlNQQ0hLIDogMCApIHwgRU5TVElNRVIpOwoJCVNFVFBPUlQoU0NTSVNFUSwgRU5TRUxPIHwgRU5BVVRPQVROTyB8IChESVNDT05ORUNURURfU0MgPyBFTlJFU0VMSSA6IDApKTsKCX0gZWxzZSB7CiNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9uZXdfY29tbWFuZCsrOwojZW5kaWYKCQlTRVRQT1JUKFNDU0lTRVEsIERJU0NPTk5FQ1RFRF9TQyA/IEVOUkVTRUxJIDogMCk7Cgl9CgojaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCglpZighYWN0aW9uKQoJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X2FueV9hY3Rpb24rKzsKI2VuZGlmCn0KCi8qCiAqIFNlbGVjdGlvbiBkb25lIChPVVQpCiAqIC0gcXVldWUgSURFTlRJRlkgbWVzc2FnZSBhbmQgU0RUUiB0byBzZWxlY3RlZCB0YXJnZXQgZm9yIG1lc3NhZ2Ugb3V0CiAqICAgKEFUTiBhc3NlcnRlZCBhdXRvbWFnaWNhbGx5IHZpYSBFTkFVVE9BVE5PIGluIGJ1c2ZyZWUoKSkKICovCnN0YXRpYyB2b2lkIHNlbGRvX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewoJU0VUUE9SVChTQ1NJU0lHLCAwKTsKCVNFVFBPUlQoU1NUQVQxLCBDTFJCVVNGUkVFKTsKCVNFVFBPUlQoU1NUQVQxLCBDTFJQSEFTRUNIRyk7CgogICAgCUNVUlJFTlRfU0MtPlNDcC5waGFzZSAmPSB+KHNlbGVjdGluZ3xub3RfaXNzdWVkKTsKCglTRVRQT1JUKFNDU0lTRVEsIDApOwoKCWlmIChURVNUTE8oU1NUQVQwLCBTRUxETykpIHsKCQlwcmludGsoRVJSX0xFQUQgImFoYTE1Mng6IHBhc3NpbmcgYnVzIGZyZWUgY29uZGl0aW9uXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQlkb25lKHNocG50LCBESURfTk9fQ09OTkVDVCA8PCAxNik7CgkJcmV0dXJuOwoJfQoKCVNFVFBPUlQoU1NUQVQwLCBDTFJTRUxETyk7CgkKCUFERE1TR08oSURFTlRJRlkoUkVDT05ORUNULCBDVVJSRU5UX1NDLT5kZXZpY2UtPmx1bikpOwoKCWlmIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBhYm9ydGluZykgewoJCUFERE1TR08oQUJPUlQpOwoJfSBlbHNlIGlmIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiByZXNldHRpbmcpIHsKCQlBRERNU0dPKEJVU19ERVZJQ0VfUkVTRVQpOwoJfSBlbHNlIGlmIChTWU5DTkVHPT0wICYmIFNZTkNIUk9OT1VTKSB7CiAgICAJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSBzeW5jbmVnOwoJCU1TR09MRU4gKz0gc3BpX3BvcHVsYXRlX3N5bmNfbXNnKCZNU0dPKE1TR09MRU4pLCA1MCwgOCk7CgkJU1lOQ05FRz0xOwkJLyogbmVnb3RpYXRpb24gaW4gcHJvZ3Jlc3MgKi8KCX0KCglTRVRSQVRFKFNZTkNSQVRFKTsKfQoKLyoKICogU2VsZWN0aW9uIHRpbWVvdXQKICogLSByZXR1cm4gY29tbWFuZCB0byBtaWQtbGV2ZWwgd2l0aCBmYWlsdXJlIGNhdXNlCiAqCiAqLwpzdGF0aWMgdm9pZCBzZWx0b19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCVNFVFBPUlQoU0NTSVNFUSwgMCk7CQkKCVNFVFBPUlQoU1NUQVQxLCBDTFJTRUxUSU1PKTsKCglEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAic2VsZWN0aW9uIHRpbWVvdXRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOwoKCWlmKCFDVVJSRU5UX1NDKSB7CgkJRFBSSU5USyhkZWJ1Z19zZWxlY3Rpb24sIERFQlVHX0xFQUQgIiFDVVJSRU5UX1NDXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQlyZXR1cm47Cgl9CgogICAgCUNVUlJFTlRfU0MtPlNDcC5waGFzZSAmPSB+c2VsZWN0aW5nOwoKCWlmIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBhYm9ydGVkKSB7CgkJRFBSSU5USyhkZWJ1Z19zZWxlY3Rpb24sIERFQlVHX0xFQUQgImFib3J0ZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOwoJCWRvbmUoc2hwbnQsIERJRF9BQk9SVCA8PCAxNik7Cgl9IGVsc2UgaWYgKFRFU1RMTyhTU1RBVDAsIFNFTElOR08pKSB7CgkJRFBSSU5USyhkZWJ1Z19zZWxlY3Rpb24sIERFQlVHX0xFQUQgImFyYml0cmF0aW9uIG5vdCB3b25cbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOwoJCWRvbmUoc2hwbnQsIERJRF9CVVNfQlVTWSA8PCAxNik7Cgl9IGVsc2UgewoJCS8qIEFSQklUUkFUSU9OIHdvbiwgYnV0IFNFTEVDVElPTiBmYWlsZWQgKi8KCQlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAic2VsZWN0aW9uIGZhaWxlZFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJZG9uZShzaHBudCwgRElEX05PX0NPTk5FQ1QgPDwgMTYpOwoJfQp9CgovKgogKiBTZWxlY3Rpb24gaW4gZG9uZQogKiAtIHB1dCBjdXJyZW50IGNvbW1hbmQgYmFjayB0byBpc3N1ZSBxdWV1ZQogKiAgIChyZWNvbm5lY3Rpb24gb2YgYSBkaXNjb25uZWN0ZWQgbmV4dXMgaW5zdGVhZAogKiAgICBvZiBzdWNjZXNzZnVsIHNlbGVjdGlvbiBvdXQpCiAqCiAqLwpzdGF0aWMgdm9pZCBzZWxkaV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCWludCBzZWxpZDsKCWludCB0YXJnZXQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCVNFVFBPUlQoU0NTSVNJRywgMCk7CglTRVRQT1JUKFNTVEFUMCwgQ0xSU0VMREkpOwoJU0VUUE9SVChTU1RBVDEsIENMUkJVU0ZSRUUpOwoJU0VUUE9SVChTU1RBVDEsIENMUlBIQVNFQ0hHKTsKCglpZihDVVJSRU5UX1NDKSB7CgkJaWYoIShDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBub3RfaXNzdWVkKSkKCQkJcHJpbnRrKEVSUl9MRUFEICJjb21tYW5kIHNob3VsZCBub3QgaGF2ZSBiZWVuIGlzc3VlZCB5ZXRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOwoKCQlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgRVJSX0xFQUQgImNvbW1hbmQgcmVxdWV1ZWQgLSByZXNlbGVjdGlvblxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgoJCURPX0xPQ0soZmxhZ3MpOwoJCWFwcGVuZF9TQygmSVNTVUVfU0MsIENVUlJFTlRfU0MpOwoJCURPX1VOTE9DSyhmbGFncyk7CgoJCUNVUlJFTlRfU0MgPSBOVUxMOwoJfQoKCWlmKCFESVNDT05ORUNURURfU0MpIHsKCQlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAidW5leHBlY3RlZCBTRUxESSAiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQlyZXR1cm47Cgl9CgoJUkVDT05OX1RBUkdFVD0tMTsKCglzZWxpZCA9IEdFVFBPUlQoU0VMSUQpICYgfigxIDw8IHNocG50LT50aGlzX2lkKTsKCglpZiAoc2VsaWQ9PTApIHsKCQlwcmludGsoImFoYTE1MnglZDogdGFyZ2V0IGlkIHVua25vd24gKCUwMngpXG4iLCBIT1NUTk8sIHNlbGlkKTsKCQlyZXR1cm47Cgl9CgoJZm9yKHRhcmdldD03OyAhKHNlbGlkICYgKDEgPDwgdGFyZ2V0KSk7IHRhcmdldC0tKQoJCTsKCglpZihzZWxpZCAmIH4oMSA8PCB0YXJnZXQpKSB7CgkJcHJpbnRrKCJhaGExNTJ4JWQ6IG11bHRpcGxlIHRhcmdldHMgcmVjb25uZWN0ZWQgKCUwMngpXG4iLAoJCSAgICAgICBIT1NUTk8sIHNlbGlkKTsKCX0KCgoJU0VUUE9SVChTQ1NJSUQsIChzaHBudC0+dGhpc19pZCA8PCBPSURfKSB8IHRhcmdldCk7CglTRVRQT1JUKFNDU0lTRVEsIDApOwoKCVNFVFJBVEUoSE9TVERBVEEoc2hwbnQpLT5zeW5jcmF0ZVt0YXJnZXRdKTsKCglSRUNPTk5fVEFSR0VUPXRhcmdldDsKCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJ0YXJnZXQgJWQgcmVzZWxlY3RlZCAoJTAyeCkuXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCB0YXJnZXQsIHNlbGlkKTsKfQoKLyoKICogbWVzc2FnZSBpbiBwaGFzZQogKiAtIGhhbmRsZSBpbml0aWFsIG1lc3NhZ2UgYWZ0ZXIgcmVjb25uZWN0aW9uIHRvIGlkZW50aWZ5CiAqICAgcmVjb25uZWN0aW5nIG5leHVzCiAqIC0gcXVldWUgY29tbWFuZCBvbiBESVNDT05ORUNURURfU0Mgb24gRElTQ09OTkVDVCBtZXNzYWdlCiAqIC0gc2V0IGNvbXBsZXRlZCBmbGFnIG9uIENPTU1BTkQgQ09NUExFVEUKICogICAob3RoZXIgY29tcGxldGl0aW9uIGNvZGUgbW92ZWQgdG8gYnVzZnJlZV9ydW4pCiAqIC0gaGFuZGxlIHJlc3BvbnNlIHRvIFNEVFIKICogLSBjbGVhciBzeW5jaHJvbm91cyB0cmFuc2ZlciBhZ3JlZW1lbnRzIG9uIEJVUyBSRVNFVAogKgogKiBGSVhNRTogd2hhdCBhYm91dCBTQVZFIFBPSU5URVJTLCBSRVNUT1JFIFBPSU5URVJTPwogKgogKi8Kc3RhdGljIHZvaWQgbXNnaV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCWZvcig7OykgewoJCWludCBzc3RhdDEgPSBHRVRQT1JUKFNTVEFUMSk7CgoJCWlmKHNzdGF0MSAmIChQSEFTRUNIR3xQSEFTRU1JU3xCVVNGUkVFKSB8fCAhKHNzdGF0MSAmIFJFUUlOSVQpKQoJCQlyZXR1cm47CgoJCWlmKFRFU1RMTyhTU1RBVDAsU1BJT1JEWSkpIHsKCQkJRFBSSU5USyhkZWJ1Z19tc2dpLCBERUJVR19MRUFEICIhU1BJT1JEWVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJCXJldHVybjsKCQl9CQoKCQlBRERNU0dJKEdFVFBPUlQoU0NTSURBVCkpOwoKI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKCQlpZiAoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX21zZ2kpIHsKCQkJcHJpbnRrKElORk9fTEVBRCAiaW5ib3VuZCBtZXNzYWdlICUwMnggIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgTVNHSSgwKSk7CgkJCXNwaV9wcmludF9tc2coJk1TR0koMCkpOwoJCQlwcmludGsoIlxuIik7CgkJfQojZW5kaWYKCgkJaWYoIUNVUlJFTlRfU0MpIHsKCQkJaWYoTEFTVFNUQVRFIT1zZWxkaSkgewoJCQkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IG1lc3NhZ2UgaW4gdy9vIGN1cnJlbnQgY29tbWFuZCBub3QgYWZ0ZXIgcmVzZWxlY3Rpb25cbiIsIEhPU1ROTyk7CgkJCX0KCgkJCS8qCgkgCSAJICogSGFuZGxlIHJlc2VsZWN0aW9uCgkgCQkgKi8KCQkJaWYoIShNU0dJKDApICYgSURFTlRJRllfQkFTRSkpIHsKCQkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeCVkOiB0YXJnZXQgZGlkbid0IGlkZW50aWZ5IGFmdGVyIHJlc2VsZWN0aW9uXG4iLCBIT1NUTk8pOwoJCQkJY29udGludWU7CgkJCX0KCgkJCUNVUlJFTlRfU0MgPSByZW1vdmVfbHVuX1NDKCZESVNDT05ORUNURURfU0MsIFJFQ09OTl9UQVJHRVQsIE1TR0koMCkgJiAweDNmKTsKCgkJCWlmICghQ1VSUkVOVF9TQykgewoJCQkJc2hvd19xdWV1ZXMoc2hwbnQpOwoJCQkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IG5vIGRpc2Nvbm5lY3RlZCBjb21tYW5kIGZvciB0YXJnZXQgJWQvJWRcbiIsIEhPU1ROTywgUkVDT05OX1RBUkdFVCwgTVNHSSgwKSAmIDB4M2YpOwoJCQkJY29udGludWU7CgkJCX0KCgkJCURQUklOVEsoZGVidWdfbXNnaSwgREVCVUdfTEVBRCAidGFyZ2V0IHJlY29ubmVjdGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCgkJCUNVUlJFTlRfU0MtPlNDcC5NZXNzYWdlID0gTVNHSSgwKTsKCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICY9IH5kaXNjb25uZWN0ZWQ7CgoJCQlNU0dJTEVOPTA7CgoJCQkvKiBuZXh0IG1lc3NhZ2UgaWYgYW55ICovCgkJCWNvbnRpbnVlOwoJCX0gCgoJCUNVUlJFTlRfU0MtPlNDcC5NZXNzYWdlID0gTVNHSSgwKTsKCgkJc3dpdGNoIChNU0dJKDApKSB7CgkJY2FzZSBESVNDT05ORUNUOgoJCQlpZiAoIVJFQ09OTkVDVCkKCQkJCXByaW50ayhXQVJOX0xFQUQgInRhcmdldCB3YXMgbm90IGFsbG93ZWQgdG8gZGlzY29ubmVjdFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgoJCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gZGlzY29ubmVjdGVkOwoJCQlicmVhazsKCgkJY2FzZSBDT01NQU5EX0NPTVBMRVRFOgoJCQlpZihDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBjb21wbGV0ZWQpCgkJCQlEUFJJTlRLKGRlYnVnX21zZ2ksIERFQlVHX0xFQUQgImFnYWluIENPTU1BTkQgQ09NUExFVEVcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOwoKCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IGNvbXBsZXRlZDsKCQkJYnJlYWs7CgoJCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CgkJCWlmIChTWU5DTkVHPT0xKSB7CgkJCQlwcmludGsoSU5GT19MRUFEICJTeW5jaHJvbm91cyBEYXRhIFRyYW5zZmVyIFJlcXVlc3Qgd2FzIHJlamVjdGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQkJCVNZTkNORUc9MjsJLyogbmVnb3RpYXRpb24gY29tcGxldGVkICovCgkJCX0gZWxzZQoJCQkJcHJpbnRrKElORk9fTEVBRCAiaW5ib3VuZCBtZXNzYWdlIChNRVNTQUdFIFJFSkVDVClcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOwoJCQlicmVhazsKCgkJY2FzZSBTQVZFX1BPSU5URVJTOgoJCQlicmVhazsKCgkJY2FzZSBSRVNUT1JFX1BPSU5URVJTOgoJCQlicmVhazsKCgkJY2FzZSBFWFRFTkRFRF9NRVNTQUdFOgoJCQlpZihNU0dJTEVOPDIgfHwgTVNHSUxFTjxNU0dJKDEpKzIpIHsKCQkJCS8qIG5vdCB5ZXQgY29tcGxldGVkICovCgkJCQljb250aW51ZTsKCQkJfQoKCQkJc3dpdGNoIChNU0dJKDIpKSB7CgkJCWNhc2UgRVhURU5ERURfU0RUUjoKCQkJCXsKCQkJCQlsb25nIHRpY2tzOwoKCQkJCQlpZiAoTVNHSSgxKSAhPSAzKSB7CgkJCQkJCXByaW50ayhFUlJfTEVBRCAiU0RUUiBtZXNzYWdlIGxlbmd0aCE9M1xuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCgkJCQkJaWYgKCFIT1NUREFUQShzaHBudCktPnN5bmNocm9ub3VzKQoJCQkJCQlicmVhazsKCgkJCQkJcHJpbnRrKElORk9fTEVBRCwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJCQkJc3BpX3ByaW50X21zZygmTVNHSSgwKSk7CgkJCQkJcHJpbnRrKCJcbiIpOwoKCQkJCQl0aWNrcyA9IChNU0dJKDMpICogNCArIDQ5KSAvIDUwOwoKCQkJCQlpZiAoc3luY25lZykgewoJCQkJCQkvKiBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLwoJCQkJCQlpZiAodGlja3MgPiA5IHx8IE1TR0koNCkgPCAxIHx8IE1TR0koNCkgPiA4KSB7CgkJCQkJCQlBRERNU0dPKE1FU1NBR0VfUkVKRUNUKTsKCQkJCQkJCXByaW50ayhJTkZPX0xFQUQgInJlY2VpdmVkIFN5bmNocm9ub3VzIERhdGEgVHJhbnNmZXIgUmVxdWVzdCBpbnZhbGlkIC0gcmVqZWN0ZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCVNZTkNSQVRFIHw9ICgodGlja3MgLSAyKSA8PCA0KSArIE1TR0koNCk7CgkJCQkJfSBlbHNlIGlmICh0aWNrcyA8PSA5ICYmIE1TR0koNCkgPj0gMSkgewoJCQkJCQlBRERNU0dPKEVYVEVOREVEX01FU1NBR0UpOwoJCQkJCQlBRERNU0dPKDMpOwoJCQkJCQlBRERNU0dPKEVYVEVOREVEX1NEVFIpOwoJCQkJCQlpZiAodGlja3MgPCA0KSB7CgkJCQkJCQl0aWNrcyA9IDQ7CgkJCQkJCQlBRERNU0dPKDUwKTsKCQkJCQkJfSBlbHNlCgkJCQkJCQlBRERNU0dPKE1TR0koMykpOwoKCQkJCQkJaWYgKE1TR0koNCkgPiA4KQoJCQkJCQkJTVNHSSg0KSA9IDg7CgoJCQkJCQlBRERNU0dPKE1TR0koNCkpOwoKCQkJCQkJU1lOQ1JBVEUgfD0gKCh0aWNrcyAtIDIpIDw8IDQpICsgTVNHSSg0KTsKCQkJCQl9IGVsc2UgewoJCQkJCQkvKiByZXF1ZXN0ZWQgU0RUUiBpcyB0b28gc2xvdywgZG8gaXQgYXN5bmNocm9ub3VzbHkgKi8KCQkJCQkJcHJpbnRrKElORk9fTEVBRCAiU3luY2hyb25vdXMgRGF0YSBUcmFuc2ZlciBSZXF1ZXN0IHRvbyBzbG93IC0gUmVqZWN0aW5nXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQkJCQkJQURETVNHTyhNRVNTQUdFX1JFSkVDVCk7CgkJCQkJfQoKCQkJCQlTWU5DTkVHPTI7CQkvKiBuZWdvdGlhdGlvbiBjb21wbGV0ZWQgKi8KCQkJCQlTRVRSQVRFKFNZTkNSQVRFKTsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJY2FzZSBCVVNfREVWSUNFX1JFU0VUOgoJCQkJewoJCQkJCWludCBpOwoKCQkJCQlmb3IoaT0wOyBpPDg7IGkrKykgewoJCQkJCQlIT1NUREFUQShzaHBudCktPnN5bmNyYXRlW2ldPTA7CgkJCQkJCUhPU1REQVRBKHNocG50KS0+c3luY25lZ1tpXT0wOwoJCQkJCX0KCgkJCQl9CgkJCQlicmVhazsKCgkJCWNhc2UgRVhURU5ERURfTU9ESUZZX0RBVEFfUE9JTlRFUjoKCQkJY2FzZSBFWFRFTkRFRF9FWFRFTkRFRF9JREVOVElGWToKCQkJY2FzZSBFWFRFTkRFRF9XRFRSOgoJCQlkZWZhdWx0OgoJCQkJQURETVNHTyhNRVNTQUdFX1JFSkVDVCk7CgkJCQlicmVhazsKCQkJfQoJCQlicmVhazsKCQl9CgoJCU1TR0lMRU49MDsKCX0KfQoKc3RhdGljIHZvaWQgbXNnaV9lbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCWlmKE1TR0lMRU4+MCkKCQlwcmludGsoV0FSTl9MRUFEICJ0YXJnZXQgbGVmdCBiZWZvcmUgbWVzc2FnZSBjb21wbGV0ZWQgKCVkKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgTVNHSUxFTik7CgoJaWYgKE1TR09MRU4gPiAwICYmICEoR0VUUE9SVChTU1RBVDEpICYgQlVTRlJFRSkpIHsKCQlEUFJJTlRLKGRlYnVnX21zZ2ksIERFQlVHX0xFQUQgIm1zZ28gcGVuZGluZ1xuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJU0VUUE9SVChTQ1NJU0lHLCBQX01TR0kgfCBTSUdfQVROTyk7Cgl9IAp9CgovKgogKiBtZXNzYWdlIG91dCBwaGFzZQogKgogKi8Kc3RhdGljIHZvaWQgbXNnb19pbml0KHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQp7CglpZihNU0dPTEVOPT0wKSB7CgkJaWYoKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIHN5bmNuZWcpICYmIFNZTkNORUc9PTIgJiYgU1lOQ1JBVEU9PTApIHsKCQkJQURETVNHTyhJREVOVElGWShSRUNPTk5FQ1QsIENVUlJFTlRfU0MtPmRldmljZS0+bHVuKSk7CgkJfSBlbHNlIHsKCQkJcHJpbnRrKElORk9fTEVBRCAidW5leHBlY3RlZCBNRVNTQUdFIE9VVCBwaGFzZTsgcmVqZWN0aW5nXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQkJQURETVNHTyhNRVNTQUdFX1JFSkVDVCk7CgkJfQoJfQoKI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKCWlmKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBkZWJ1Z19tc2dvKSB7CgkJaW50IGk7CgoJCXByaW50ayhERUJVR19MRUFEICJtZXNzYWdlcyggIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJZm9yIChpPTA7IGk8TVNHT0xFTjsgaSs9c3BpX3ByaW50X21zZygmTVNHTyhpKSksIHByaW50aygiICIpKQoJCQk7CgkJcHJpbnRrKCIpXG4iKTsKCX0KI2VuZGlmCn0KCi8qCiAqIG1lc3NhZ2Ugb3V0IHBoYXNlCiAqCiAqLwpzdGF0aWMgdm9pZCBtc2dvX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewoJaWYoTVNHT19JPT1NU0dPTEVOKQoJCURQUklOVEsoZGVidWdfbXNnbywgREVCVUdfTEVBRCAibWVzc2FnZXMgYWxsIHNlbnQgKCVkLyVkKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgTVNHT19JLCBNU0dPTEVOKTsKCgl3aGlsZShNU0dPX0k8TVNHT0xFTikgewoJCURQUklOVEsoZGVidWdfbXNnbywgREVCVUdfTEVBRCAibWVzc2FnZSBieXRlICUwMnggKCVkLyVkKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgTVNHTyhNU0dPX0kpLCBNU0dPX0ksIE1TR09MRU4pOwoKCQlpZihURVNUTE8oU1NUQVQwLCBTUElPUkRZKSkgewoJCQlEUFJJTlRLKGRlYnVnX21zZ28sIERFQlVHX0xFQUQgIiFTUElPUkRZXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKE1TR09fST09TVNHT0xFTi0xKSB7CgkJCS8qIExlYXZlIE1FU1NBR0UgT1VUIGFmdGVyIHRyYW5zZmVyICovCgkJCVNFVFBPUlQoU1NUQVQxLCBDTFJBVE5PKTsKCQl9CgoKCQlpZiAoTVNHTyhNU0dPX0kpICYgSURFTlRJRllfQkFTRSkKCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IGlkZW50aWZpZWQ7CgoJCWlmIChNU0dPKE1TR09fSSk9PUFCT1JUKQoJCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gYWJvcnRlZDsKCgkJaWYgKE1TR08oTVNHT19JKT09QlVTX0RFVklDRV9SRVNFVCkKCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IHJlc2V0dGVkOwoKCQlTRVRQT1JUKFNDU0lEQVQsIE1TR08oTVNHT19JKyspKTsKCX0KfQoKc3RhdGljIHZvaWQgbXNnb19lbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCWlmKE1TR09fSTxNU0dPTEVOKSB7CgkJcHJpbnRrKEVSUl9MRUFEICJtZXNzYWdlIHNlbnQgaW5jb21wbGV0ZWx5ICglZC8lZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIE1TR09fSSwgTVNHT0xFTik7CgkJaWYoU1lOQ05FRz09MSkgewoJCQlwcmludGsoSU5GT19MRUFEICJTeW5jaHJvbm91cyBEYXRhIFRyYW5zZmVyIFJlcXVlc3Qgd2FzIHJlamVjdGVkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQkJU1lOQ05FRz0yOwoJCX0KCX0KCQkKCU1TR09fSSAgPSAwOwoJTVNHT0xFTiA9IDA7Cn0KCi8qIAogKiBjb21tYW5kIHBoYXNlCiAqCiAqLwpzdGF0aWMgdm9pZCBjbWRfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewoJaWYgKENVUlJFTlRfU0MtPlNDcC5zZW50X2NvbW1hbmQpIHsKCQlwcmludGsoRVJSX0xFQUQgImNvbW1hbmQgYWxyZWFkeSBzZW50XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQlkb25lKHNocG50LCBESURfRVJST1IgPDwgMTYpOwoJCXJldHVybjsKCX0KCiNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCglpZiAoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX2NtZCkgewoJCXByaW50ayhERUJVR19MRUFEICJjbWRfaW5pdDogIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJX19zY3NpX3ByaW50X2NvbW1hbmQoQ1VSUkVOVF9TQy0+Y21uZCk7Cgl9CiNlbmRpZgoKCUNNRF9JPTA7Cn0KCi8qCiAqIGNvbW1hbmQgcGhhc2UKICoKICovCnN0YXRpYyB2b2lkIGNtZF9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCWlmKENNRF9JPT1DVVJSRU5UX1NDLT5jbWRfbGVuKSB7CgkJRFBSSU5USyhkZWJ1Z19jbWQsIERFQlVHX0xFQUQgImNvbW1hbmQgYWxyZWFkeSBjb21wbGV0ZWx5IHNlbnQgKCVkLyVkKSIsIENNRElORk8oQ1VSUkVOVF9TQyksIENNRF9JLCBDVVJSRU5UX1NDLT5jbWRfbGVuKTsKCQlkaXNwX3BvcnRzKHNocG50KTsKCX0KCgl3aGlsZShDTURfSTxDVVJSRU5UX1NDLT5jbWRfbGVuKSB7CgkJRFBSSU5USyhkZWJ1Z19jbWQsIERFQlVHX0xFQUQgImNvbW1hbmQgYnl0ZSAlMDJ4ICglZC8lZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIENVUlJFTlRfU0MtPmNtbmRbQ01EX0ldLCBDTURfSSwgQ1VSUkVOVF9TQy0+Y21kX2xlbik7CgoJCWlmKFRFU1RMTyhTU1RBVDAsIFNQSU9SRFkpKSB7CgkJCURQUklOVEsoZGVidWdfY21kLCBERUJVR19MRUFEICIhU1BJT1JEWVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJCXJldHVybjsKCQl9CgoJCVNFVFBPUlQoU0NTSURBVCwgQ1VSUkVOVF9TQy0+Y21uZFtDTURfSSsrXSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGNtZF9lbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCWlmKENNRF9JPENVUlJFTlRfU0MtPmNtZF9sZW4pCgkJcHJpbnRrKEVSUl9MRUFEICJjb21tYW5kIHNlbnQgaW5jb21wbGV0ZWx5ICglZC8lZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIENNRF9JLCBDVVJSRU5UX1NDLT5jbWRfbGVuKTsKCWVsc2UKCQlDVVJSRU5UX1NDLT5TQ3Auc2VudF9jb21tYW5kKys7Cn0KCi8qCiAqIHN0YXR1cyBwaGFzZQogKgogKi8Kc3RhdGljIHZvaWQgc3RhdHVzX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewoJaWYoVEVTVExPKFNTVEFUMCxTUElPUkRZKSkgewoJCURQUklOVEsoZGVidWdfc3RhdHVzLCBERUJVR19MRUFEICIhU1BJT1JEWVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJcmV0dXJuOwoJfQoKCUNVUlJFTlRfU0MtPlNDcC5TdGF0dXMgPSBHRVRQT1JUKFNDU0lEQVQpOwoKI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKCWlmIChIT1NUREFUQShzaHBudCktPmRlYnVnICYgZGVidWdfc3RhdHVzKSB7CgkJcHJpbnRrKERFQlVHX0xFQUQgImluYm91bmQgc3RhdHVzICUwMnggIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgQ1VSUkVOVF9TQy0+U0NwLlN0YXR1cyk7CgkJc2NzaV9wcmludF9zdGF0dXMoQ1VSUkVOVF9TQy0+U0NwLlN0YXR1cyk7CgkJcHJpbnRrKCJcbiIpOwoJfQojZW5kaWYKfQoKLyoKICogZGF0YSBpbiBwaGFzZQogKgogKi8Kc3RhdGljIHZvaWQgZGF0YWlfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewoJU0VUUE9SVChETUFDTlRSTDAsIFJTVEZJRk8pOwoJU0VUUE9SVChETUFDTlRSTDAsIFJTVEZJRk98RU5ETUEpOwoKCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxDTFJTVENOVCk7CglTRVRQT1JUKFNYRlJDVEwwLCBDSDF8U0NTSUVOfERNQUVOKTsKCglTRVRQT1JUKFNJTU9ERTAsIDApOwoJU0VUUE9SVChTSU1PREUxLCBFTlNDU0lQRVJSIHwgRU5TQ1NJUlNUIHwgRU5QSEFTRU1JUyB8IEVOQlVTRlJFRSk7CgoJREFUQV9MRU49MDsKCURQUklOVEsoZGVidWdfZGF0YWksCgkJREVCVUdfTEVBRCAiZGF0YWlfaW5pdDogcmVxdWVzdF9idWZmbGVuPSVkIHJlc2lkPSVkXG4iLAoJCUNNRElORk8oQ1VSUkVOVF9TQyksIENVUlJFTlRfU0MtPnJlcXVlc3RfYnVmZmxlbiwgQ1VSUkVOVF9TQy0+cmVzaWQpOwp9CgpzdGF0aWMgdm9pZCBkYXRhaV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCXVuc2lnbmVkIGxvbmcgdGhlX3RpbWU7CglpbnQgZmlmb2RhdGEsIGRhdGFfY291bnQ7CgoJLyoKCSAqIGxvb3Agd2hpbGUgdGhlIHBoYXNlIHBlcnNpc3RzIG9yIHRoZSBmaWZvcyBhcmUgbm90IGVtcHR5CgkgKgoJICovCgl3aGlsZShURVNUTE8oRE1BU1RBVCwgSU5UU1RBVCkgfHwgVEVTVExPKERNQVNUQVQsIERGSUZPRU1QKSB8fCBURVNUTE8oU1NUQVQyLCBTRU1QVFkpKSB7CgkJLyogRklYTUU6IG1heWJlIHRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgc2V0dGluZyB1cAoJCSAqIFNUQ05UIHRvIHRyaWdnZXIgRU5TV1JBUCBpbnRlcnJ1cHQsIGluc3RlYWQgb2YKCQkgKiBwb2xsaW5nIGZvciBERklGT0ZVTEwKCQkgKi8KCQl0aGVfdGltZT1qaWZmaWVzICsgMTAwKkhaOwoJCXdoaWxlKFRFU1RMTyhETUFTVEFULCBERklGT0ZVTEx8SU5UU1RBVCkgJiYgdGltZV9iZWZvcmUoamlmZmllcyx0aGVfdGltZSkpCgkJCWJhcnJpZXIoKTsKCgkJaWYoVEVTVExPKERNQVNUQVQsIERGSUZPRlVMTHxJTlRTVEFUKSkgewoJCQlwcmludGsoRVJSX0xFQUQgImRhdGFpIHRpbWVvdXQiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQkJZGlzcF9wb3J0cyhzaHBudCk7CgkJCWJyZWFrOwoJCX0KCgkJaWYoVEVTVEhJKERNQVNUQVQsIERGSUZPRlVMTCkpIHsKCQkJZmlmb2RhdGEgPSAxMjg7CgkJfSBlbHNlIHsKCQkJdGhlX3RpbWU9amlmZmllcyArIDEwMCpIWjsKCQkJd2hpbGUoVEVTVExPKFNTVEFUMiwgU0VNUFRZKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLHRoZV90aW1lKSkKCQkJCWJhcnJpZXIoKTsKCgkJCWlmKFRFU1RMTyhTU1RBVDIsIFNFTVBUWSkpIHsKCQkJCXByaW50ayhFUlJfTEVBRCAiZGF0YWkgc2VtcHR5IHRpbWVvdXQiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKCQkJCWRpc3BfcG9ydHMoc2hwbnQpOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWZpZm9kYXRhID0gR0VUUE9SVChGSUZPU1RBVCk7CgkJfQoKCQlpZihDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbD4wKSB7CgkJCXdoaWxlKGZpZm9kYXRhPjAgJiYgQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw+MCkgewogICAgICAgICAgICAgICAgICAgICAgICAJZGF0YV9jb3VudCA9IGZpZm9kYXRhPkNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsID8KCQkJCQkJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgOgoJCQkJCQlmaWZvZGF0YTsKCQkJCWZpZm9kYXRhIC09IGRhdGFfY291bnQ7CgogICAgICAgICAgICAgICAgICAgICAgICAJaWYoZGF0YV9jb3VudCAmIDEpIHsKCQkJCQlEUFJJTlRLKGRlYnVnX2RhdGFpLCBERUJVR19MRUFEICI4Yml0XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJU0VUUE9SVChETUFDTlRSTDAsIEVORE1BfF84QklUKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJKkNVUlJFTlRfU0MtPlNDcC5wdHIrKyA9IEdFVFBPUlQoREFUQVBPUlQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbC0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlEQVRBX0xFTisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlTRVRQT1JUKERNQUNOVFJMMCwgRU5ETUEpOwogICAgICAgICAgICAgICAgICAgICAgICAJfQoJCiAgICAgICAgICAgICAgICAgICAgICAgIAlpZihkYXRhX2NvdW50ID4gMSkgewoJCQkJCURQUklOVEsoZGVidWdfZGF0YWksIERFQlVHX0xFQUQgIjE2Yml0KCVkKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgZGF0YV9jb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRhdGFfY291bnQgPj49IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWluc3coREFUQVBPUlQsIENVUlJFTlRfU0MtPlNDcC5wdHIsIGRhdGFfY291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlDVVJSRU5UX1NDLT5TQ3AucHRyICAgICAgICAgICArPSAyICogZGF0YV9jb3VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gMiAqIGRhdGFfY291bnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCURBVEFfTEVOICAgICAgICAgICAgICAgICAgICAgICs9IDIgKiBkYXRhX2NvdW50OwogICAgICAgICAgICAgICAgICAgICAgICAJfQoJCiAgICAgICAgICAgICAgICAgICAgICAgIAlpZihDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbD09MCAmJiBDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbD4wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCS8qIGFkdmFuY2UgdG8gbmV4dCBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwtLTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlDVVJSRU5UX1NDLT5TQ3AucHRyICAgICAgICAgICA9IFNHX0FERFJFU1MoQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsID0gQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlci0+bGVuZ3RoOwoJCQkJfSAKICAgICAgICAgICAgICAgIAl9CgkJfSBlbHNlIGlmKGZpZm9kYXRhPjApIHsgCgkJCXByaW50ayhFUlJfTEVBRCAibm8gYnVmZmVycyBsZWZ0IGZvciAlZCglZCkgYnl0ZXMgKGRhdGEgb3ZlcnJ1biE/KVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgZmlmb2RhdGEsIEdFVFBPUlQoRklGT1NUQVQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgU0VUUE9SVChETUFDTlRSTDAsIEVORE1BfF84QklUKTsKCQkJd2hpbGUoZmlmb2RhdGE+MCkgewoJCQkJaW50IGRhdGE7CgkJCQlkYXRhPUdFVFBPUlQoREFUQVBPUlQpOwoJCQkJRFBSSU5USyhkZWJ1Z19kYXRhaSwgREVCVUdfTEVBRCAiZGF0YT0lMDJ4XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBkYXRhKTsKCQkJCWZpZm9kYXRhLS07CgkJCQlEQVRBX0xFTisrOwoJCQl9CiAgICAgICAgICAgICAgICAgICAgICAgIFNFVFBPUlQoRE1BQ05UUkwwLCBFTkRNQXxfOEJJVCk7CgkJfQoJfQoKCWlmKFRFU1RMTyhETUFTVEFULCBJTlRTVEFUKSB8fAoJICAgVEVTVExPKERNQVNUQVQsIERGSUZPRU1QKSB8fAoJICAgVEVTVExPKFNTVEFUMiwgU0VNUFRZKSB8fAoJICAgR0VUUE9SVChGSUZPU1RBVCk+MCkgewoJICAgCS8qCgkJICogc29tZXRoaW5nIHdlbnQgd3JvbmcsIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGxlZnQgaW4gdGhlIGZpZm9zCgkJICogb3IgdGhlIHBoYXNlIGRpZG4ndCBjaGFuZ2UKCQkgKi8KCQlwcmludGsoRVJSX0xFQUQgImZpZm9zIHNob3VsZCBiZSBlbXB0eSBhbmQgcGhhc2Ugc2hvdWxkIGhhdmUgY2hhbmdlZFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJZGlzcF9wb3J0cyhzaHBudCk7Cgl9CgoJaWYoREFUQV9MRU4hPUdFVFNUQ05UKCkpIHsKCQlwcmludGsoRVJSX0xFQUQKCQkgICAgICAgIm1hbnVhbCB0cmFuc2ZlciBjb3VudCBkaWZmZXJzIGZyb20gYXV0b21hdGljIChjb3VudD0lZDtzdGNudD0lZDtkaWZmPSVkO2ZpZm9zdGF0PSVkKSIsCgkJICAgICAgIENNRElORk8oQ1VSUkVOVF9TQyksIERBVEFfTEVOLCBHRVRTVENOVCgpLCBHRVRTVENOVCgpLURBVEFfTEVOLCBHRVRQT1JUKEZJRk9TVEFUKSk7CgkJZGlzcF9wb3J0cyhzaHBudCk7CgkJbWRlbGF5KDEwMDAwKTsKCX0KfQoKc3RhdGljIHZvaWQgZGF0YWlfZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQp7CglDVVJSRU5UX1NDLT5yZXNpZCAtPSBHRVRTVENOVCgpOwoKCURQUklOVEsoZGVidWdfZGF0YWksCgkJREVCVUdfTEVBRCAiZGF0YWlfZW5kOiByZXF1ZXN0X2J1ZmZsZW49JWQgcmVzaWQ9JWQgc3RjbnQ9JWRcbiIsCgkJQ01ESU5GTyhDVVJSRU5UX1NDKSwgQ1VSUkVOVF9TQy0+cmVxdWVzdF9idWZmbGVuLCBDVVJSRU5UX1NDLT5yZXNpZCwgR0VUU1RDTlQoKSk7CgoJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfENMUlNUQ05UKTsKCVNFVFBPUlQoRE1BQ05UUkwwLCAwKTsKfQoKLyoKICogZGF0YSBvdXQgcGhhc2UKICoKICovCnN0YXRpYyB2b2lkIGRhdGFvX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCVNFVFBPUlQoRE1BQ05UUkwwLCBXUklURV9SRUFEIHwgUlNURklGTyk7CglTRVRQT1JUKERNQUNOVFJMMCwgV1JJVEVfUkVBRCB8IEVORE1BKTsKCglTRVRQT1JUKFNYRlJDVEwwLCBDSDF8Q0xSU1RDTlQpOwoJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfFNDU0lFTnxETUFFTik7CgoJU0VUUE9SVChTSU1PREUwLCAwKTsKCVNFVFBPUlQoU0lNT0RFMSwgRU5TQ1NJUEVSUiB8IEVOU0NTSVJTVCB8IEVOUEhBU0VNSVMgfCBFTkJVU0ZSRUUgKTsKCglEQVRBX0xFTiA9IENVUlJFTlRfU0MtPnJlc2lkOwoKCURQUklOVEsoZGVidWdfZGF0YW8sCgkJREVCVUdfTEVBRCAiZGF0YW9faW5pdDogcmVxdWVzdF9idWZmbGVuPSVkOyByZXNpZD0lZFxuIiwKCQlDTURJTkZPKENVUlJFTlRfU0MpLCBDVVJSRU5UX1NDLT5yZXF1ZXN0X2J1ZmZsZW4sIENVUlJFTlRfU0MtPnJlc2lkKTsKfQoKc3RhdGljIHZvaWQgZGF0YW9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQp7Cgl1bnNpZ25lZCBsb25nIHRoZV90aW1lOwoJaW50IGRhdGFfY291bnQ7CgoJLyogdW50aWwgcGhhc2UgY2hhbmdlcyBvciBhbGwgZGF0YSBzZW50ICovCgl3aGlsZShURVNUTE8oRE1BU1RBVCwgSU5UU1RBVCkgJiYgQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw+MCkgewoJCWRhdGFfY291bnQgPSAxMjg7CgkJaWYoZGF0YV9jb3VudCA+IENVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsKQoJCQlkYXRhX2NvdW50PUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsOwoKCQlpZihURVNUTE8oRE1BU1RBVCwgREZJRk9FTVApKSB7CgkJCXByaW50ayhFUlJfTEVBRCAiZGF0YW8gZmlmbyBub3QgZW1wdHkgKCVkKSIsIENNRElORk8oQ1VSUkVOVF9TQyksIEdFVFBPUlQoRklGT1NUQVQpKTsKCQkJZGlzcF9wb3J0cyhzaHBudCk7CgkJCWJyZWFrOwoJCX0KCgkJaWYoZGF0YV9jb3VudCAmIDEpIHsKCQkJU0VUUE9SVChETUFDTlRSTDAsV1JJVEVfUkVBRHxFTkRNQXxfOEJJVCk7CgkJCVNFVFBPUlQoREFUQVBPUlQsICpDVVJSRU5UX1NDLT5TQ3AucHRyKyspOwoJCQlDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbC0tOwoJCQlDVVJSRU5UX1NDLT5yZXNpZC0tOwoJCQlTRVRQT1JUKERNQUNOVFJMMCxXUklURV9SRUFEfEVORE1BKTsKCQl9CgoJCWlmKGRhdGFfY291bnQgPiAxKSB7CgkJCWRhdGFfY291bnQgPj49IDE7CgkJCW91dHN3KERBVEFQT1JULCBDVVJSRU5UX1NDLT5TQ3AucHRyLCBkYXRhX2NvdW50KTsKCQkJQ1VSUkVOVF9TQy0+U0NwLnB0ciAgICAgICAgICAgKz0gMiAqIGRhdGFfY291bnQ7CgkJCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsIC09IDIgKiBkYXRhX2NvdW50OwoJCQlDVVJSRU5UX1NDLT5yZXNpZCAgICAgICAgICAgICAtPSAyICogZGF0YV9jb3VudDsKCSAgCX0KCgkJaWYoQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw9PTAgJiYgQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw+MCkgewoJCQkvKiBhZHZhbmNlIHRvIG5leHQgYnVmZmVyICovCgkJCUNVUlJFTlRfU0MtPlNDcC5idWZmZXJzX3Jlc2lkdWFsLS07CgkJCUNVUlJFTlRfU0MtPlNDcC5idWZmZXIrKzsKCQkJQ1VSUkVOVF9TQy0+U0NwLnB0ciAgICAgICAgICAgPSBTR19BRERSRVNTKENVUlJFTlRfU0MtPlNDcC5idWZmZXIpOwoJCQlDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbCA9IENVUlJFTlRfU0MtPlNDcC5idWZmZXItPmxlbmd0aDsKCQl9CgoJCXRoZV90aW1lPWppZmZpZXMgKyAxMDAqSFo7CgkJd2hpbGUoVEVTVExPKERNQVNUQVQsIERGSUZPRU1QfElOVFNUQVQpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsdGhlX3RpbWUpKQoJCQliYXJyaWVyKCk7CgoJCWlmKFRFU1RMTyhETUFTVEFULCBERklGT0VNUHxJTlRTVEFUKSkgewoJCQlwcmludGsoRVJSX0xFQUQgImRhdGFvdXQgdGltZW91dCIsIENNRElORk8oQ1VSUkVOVF9TQykpOwoJCQlkaXNwX3BvcnRzKHNocG50KTsKCQkJYnJlYWs7CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkYXRhb19lbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCnsKCWlmKFRFU1RMTyhETUFTVEFULCBERklGT0VNUCkpIHsKCQlpbnQgZGF0YV9jb3VudCA9IChEQVRBX0xFTiAtIENVUlJFTlRfU0MtPnJlc2lkKSAtIEdFVFNUQ05UKCk7CgoJCURQUklOVEsoZGVidWdfZGF0YW8sIERFQlVHX0xFQUQgImRhdGFvOiAlZCBieXRlcyB0byByZXNlbmQgKCVkIHdyaXR0ZW4sICVkIHRyYW5zZmVycmVkKVxuIiwKCQkJQ01ESU5GTyhDVVJSRU5UX1NDKSwKCQkJZGF0YV9jb3VudCwKCQkJREFUQV9MRU4tQ1VSUkVOVF9TQy0+cmVzaWQsCgkJCUdFVFNUQ05UKCkpOwoKCQlDVVJSRU5UX1NDLT5yZXNpZCArPSBkYXRhX2NvdW50OwoKCQlpZihDVVJSRU5UX1NDLT51c2Vfc2cpIHsKCQkJZGF0YV9jb3VudCAtPSBDVVJSRU5UX1NDLT5TQ3AucHRyIC0gU0dfQUREUkVTUyhDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyKTsKCQkJd2hpbGUoZGF0YV9jb3VudD4wKSB7CgkJCQlDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyLS07CgkJCQlDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCsrOwoJCQkJZGF0YV9jb3VudCAtPSBDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CgkJCX0KCQkJQ1VSUkVOVF9TQy0+U0NwLnB0ciAgICAgICAgICAgPSBTR19BRERSRVNTKENVUlJFTlRfU0MtPlNDcC5idWZmZXIpIC0gZGF0YV9jb3VudDsKCQkJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgPSBDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyLT5sZW5ndGggKyBkYXRhX2NvdW50OwoJCX0gZWxzZSB7CgkJCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgIC09IGRhdGFfY291bnQ7CgkJCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsICs9IGRhdGFfY291bnQ7CgkJfQoJfQoKCURQUklOVEsoZGVidWdfZGF0YW8sIERFQlVHX0xFQUQgImRhdGFvX2VuZDogcmVxdWVzdF9idWZmbGVuPSVkOyByZXNpZD0lZDsgc3RjbnQ9JWRcbiIsCgkJQ01ESU5GTyhDVVJSRU5UX1NDKSwKCQlDVVJSRU5UX1NDLT5yZXF1ZXN0X2J1ZmZsZW4sCgkJQ1VSUkVOVF9TQy0+cmVzaWQsCgkJR0VUU1RDTlQoKSk7CgoJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfENMUkNIMXxDTFJTVENOVCk7CglTRVRQT1JUKFNYRlJDVEwwLCBDSDEpOwoKCVNFVFBPUlQoRE1BQ05UUkwwLCAwKTsKfQoKLyoKICogZmlndXJlIG91dCB3aGF0IHN0YXRlIHdlJ3JlIGluCiAqCiAqLwpzdGF0aWMgaW50IHVwZGF0ZV9zdGF0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewoJaW50IGRhdGFwaGFzZT0wOwoJdW5zaWduZWQgaW50IHN0YXQwID0gR0VUUE9SVChTU1RBVDApOwoJdW5zaWduZWQgaW50IHN0YXQxID0gR0VUUE9SVChTU1RBVDEpOwoKCVBSRVZTVEFURSA9IFNUQVRFOwoJU1RBVEU9dW5rbm93bjsKCglpZihzdGF0MSAmIFNDU0lSU1RJKSB7CgkJU1RBVEU9cnN0aTsKCQlTRVRQT1JUKFNDU0lTRVEsMCk7CgkJU0VUUE9SVChTU1RBVDEsU0NTSVJTVEkpOwogIAl9IGVsc2UgaWYoc3RhdDAgJiBTRUxESSAmJiBQUkVWU1RBVEU9PWJ1c2ZyZWUpIHsKCQlTVEFURT1zZWxkaTsKCX0gZWxzZSBpZihzdGF0MCAmIFNFTERPICYmIENVUlJFTlRfU0MgJiYgKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIHNlbGVjdGluZykpIHsKCQlTVEFURT1zZWxkbzsKCX0gZWxzZSBpZihzdGF0MSAmIFNFTFRPKSB7CgkJU1RBVEU9c2VsdG87Cgl9IGVsc2UgaWYoc3RhdDEgJiBCVVNGUkVFKSB7CgkJU1RBVEU9YnVzZnJlZTsKCQlTRVRQT1JUKFNTVEFUMSxCVVNGUkVFKTsKCX0gZWxzZSBpZihzdGF0MSAmIFNDU0lQRVJSKSB7CgkJU1RBVEU9cGFyZXJyOwoJCVNFVFBPUlQoU1NUQVQxLFNDU0lQRVJSKTsKCX0gZWxzZSBpZihzdGF0MSAmIFJFUUlOSVQpIHsKCQlzd2l0Y2goR0VUUE9SVChTQ1NJU0lHKSAmIFBfTUFTSykgewoJCWNhc2UgUF9NU0dJOglTVEFURT1tc2dpOwlicmVhazsKCQljYXNlIFBfTVNHTzoJU1RBVEU9bXNnbzsJYnJlYWs7CgkJY2FzZSBQX0RBVEFPOglTVEFURT1kYXRhbzsJYnJlYWs7CgkJY2FzZSBQX0RBVEFJOglTVEFURT1kYXRhaTsJYnJlYWs7CgkJY2FzZSBQX1NUQVRVUzoJU1RBVEU9c3RhdHVzOwlicmVhazsKCQljYXNlIFBfQ01EOglTVEFURT1jbWQ7CWJyZWFrOwoJCX0KCQlkYXRhcGhhc2U9MTsKCX0KCglpZigoc3RhdDAgJiBTRUxESSkgJiYgU1RBVEUhPXNlbGRpICYmICFkYXRhcGhhc2UpIHsKCQlwcmludGsoSU5GT19MRUFEICJyZXNlbGVjdGlvbiBtaXNzZWQ/IiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CgkJZGlzcF9wb3J0cyhzaHBudCk7Cgl9CgoJaWYoU1RBVEUhPVBSRVZTVEFURSkgewoJCUxBU1RTVEFURT1QUkVWU1RBVEU7Cgl9CgoJcmV0dXJuIGRhdGFwaGFzZTsKfQoKLyoKICogaGFuZGxlIHBhcml0eSBlcnJvcgogKgogKiBGSVhNRTogaW4gd2hpY2ggcGhhc2U/CiAqCiAqLwpzdGF0aWMgdm9pZCBwYXJlcnJfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQp7CglwcmludGsoRVJSX0xFQUQgInBhcml0eSBlcnJvclxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7Cglkb25lKHNocG50LCBESURfUEFSSVRZIDw8IDE2KTsKfQoKLyoKICogaGFuZGxlIHJlc2V0IGluCiAqCiAqLwpzdGF0aWMgdm9pZCByc3RpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewoJU2NzaV9DbW5kICpwdHI7CgoJcHJpbnRrKEtFUk5fTk9USUNFICJhaGExNTJ4JWQ6IHNjc2kgcmVzZXQgaW5cbiIsIEhPU1ROTyk7CgkKCXB0cj1ESVNDT05ORUNURURfU0M7Cgl3aGlsZShwdHIpIHsKCQlTY3NpX0NtbmQgKm5leHQgPSBTQ05FWFQocHRyKTsKCgkJaWYgKCFwdHItPmRldmljZS0+c29mdF9yZXNldCkgewoJCQlyZW1vdmVfU0MoJkRJU0NPTk5FQ1RFRF9TQywgcHRyKTsKCgkJCWtmcmVlKHB0ci0+aG9zdF9zY3JpYmJsZSk7CgkJCXB0ci0+aG9zdF9zY3JpYmJsZT1OVUxMOwoKCQkJcHRyLT5yZXN1bHQgPSAgRElEX1JFU0VUIDw8IDE2OwoJCQlwdHItPnNjc2lfZG9uZShwdHIpOwoJCX0KCgkJcHRyID0gbmV4dDsKCX0KCglpZihDVVJSRU5UX1NDICYmICFDVVJSRU5UX1NDLT5kZXZpY2UtPnNvZnRfcmVzZXQpCgkJZG9uZShzaHBudCwgRElEX1JFU0VUIDw8IDE2ICk7Cn0KCgovKgogKiBib3R0b20taGFsZiBoYW5kbGVyCiAqCiAqLwpzdGF0aWMgdm9pZCBpc19jb21wbGV0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewoJaW50IGRhdGFwaGFzZTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglpbnQgcGVuZGluZzsKCglpZighc2hwbnQpCgkJcmV0dXJuOwoKCURPX0xPQ0soZmxhZ3MpOwoKCWlmKCBIT1NUREFUQShzaHBudCktPnNlcnZpY2U9PTAgKSAgewoJCURPX1VOTE9DSyhmbGFncyk7CgkJcmV0dXJuOwoJfQoKCUhPU1REQVRBKHNocG50KS0+c2VydmljZSA9IDA7CgoJaWYoSE9TVERBVEEoc2hwbnQpLT5pbl9pbnRyKSB7CgkJRE9fVU5MT0NLKGZsYWdzKTsKCQkvKiBhaGExNTJ4X2Vycm9yIG5ldmVyIHJldHVybnMuLiAqLwoJCWFoYTE1MnhfZXJyb3Ioc2hwbnQsICJib3R0b20taGFsZiBhbHJlYWR5IHJ1bm5pbmchPyIpOwoJfQoJSE9TVERBVEEoc2hwbnQpLT5pbl9pbnRyKys7CgoJLyoKCSAqIGxvb3Agd2hpbGUgdGhlcmUgYXJlIGludGVycnVwdCBjb25kaXRpb25zIHBlbmRpbmcKCSAqCgkgKi8KCWRvIHsKCQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKCQlET19VTkxPQ0soZmxhZ3MpOwoKCQlkYXRhcGhhc2U9dXBkYXRlX3N0YXRlKHNocG50KTsKCgkJRFBSSU5USyhkZWJ1Z19waGFzZXMsIExFQUQgInN0YXJ0ICVzICVzKCVzKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgc3RhdGVzW1NUQVRFXS5uYW1lLCBzdGF0ZXNbUFJFVlNUQVRFXS5uYW1lLCBzdGF0ZXNbTEFTVFNUQVRFXS5uYW1lKTsKCgkJLyoKCQkgKiBlbmQgcHJldmlvdXMgc3RhdGUKCQkgKgoJCSAqLwoJCWlmKFBSRVZTVEFURSE9U1RBVEUgJiYgc3RhdGVzW1BSRVZTVEFURV0uZW5kKQoJCQlzdGF0ZXNbUFJFVlNUQVRFXS5lbmQoc2hwbnQpOwoKCQkvKgoJCSAqIGRpc2FibGUgU1BJTyBtb2RlIGlmIHByZXZpb3VzIHBoYXNlIHVzZWQgaXQKCQkgKiBhbmQgdGhpcyBvbmUgZG9lc24ndAoJCSAqCgkJICovCgkJaWYoc3RhdGVzW1BSRVZTVEFURV0uc3BpbyAmJiAhc3RhdGVzW1NUQVRFXS5zcGlvKSB7CgkJCVNFVFBPUlQoU1hGUkNUTDAsIENIMSk7CgkJCVNFVFBPUlQoRE1BQ05UUkwwLCAwKTsKCQkJaWYoQ1VSUkVOVF9TQykKCQkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSAmPSB+c3Bpb3JkeTsKCQl9CgoJCS8qCgkJICogYWNjZXB0IGN1cnJlbnQgZGF0YXBoYXNlIHBoYXNlCgkJICoKCQkgKi8KCQlpZihkYXRhcGhhc2UpIHsKCQkJU0VUUE9SVChTU1RBVDAsIFJFUUlOSVQpOwoJCQlTRVRQT1JUKFNDU0lTSUcsIEdFVFBPUlQoU0NTSVNJRykgJiBQX01BU0spOwoJCQlTRVRQT1JUKFNTVEFUMSwgUEhBU0VDSEcpOyAgCgkJfQoJCQoJCS8qCgkJICogZW5hYmxlIFNQSU8gbW9kZSBpZiBwcmV2aW91cyBkaWRuJ3QgdXNlIGl0CgkJICogYW5kIHRoaXMgb25lIGRvZXMKCQkgKgoJCSAqLwoJCWlmKCFzdGF0ZXNbUFJFVlNUQVRFXS5zcGlvICYmIHN0YXRlc1tTVEFURV0uc3BpbykgewoJCQlTRVRQT1JUKERNQUNOVFJMMCwgMCk7CgkJCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxTUElPRU4pOwoJCQlpZihDVVJSRU5UX1NDKQoJCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IHNwaW9yZHk7CgkJfQoJCQoJCS8qCgkJICogaW5pdGlhbGl6ZSBmb3IgbmV3IHN0YXRlCgkJICoKCQkgKi8KCQlpZihQUkVWU1RBVEUhPVNUQVRFICYmIHN0YXRlc1tTVEFURV0uaW5pdCkKCQkJc3RhdGVzW1NUQVRFXS5pbml0KHNocG50KTsKCQkKCQkvKgoJCSAqIGhhbmRsZSBjdXJyZW50IHN0YXRlCgkJICoKCQkgKi8KCQlpZihzdGF0ZXNbU1RBVEVdLnJ1bikKCQkJc3RhdGVzW1NUQVRFXS5ydW4oc2hwbnQpOwoJCWVsc2UKCQkJcHJpbnRrKEVSUl9MRUFEICJ1bmV4cGVjdGVkIHN0YXRlICgleClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIFNUQVRFKTsKCQkKCQkvKgoJCSAqIHNldHVwIGNvbnRyb2xsZXIgdG8gaW50ZXJydXB0IG9uCgkJICogdGhlIG5leHQgZXhwZWN0ZWQgY29uZGl0aW9uIGFuZAoJCSAqIGxvb3AgaWYgaXQncyBhbHJlYWR5IHRoZXJlCgkJICoKCQkgKi8KCQlET19MT0NLKGZsYWdzKTsKCQlwZW5kaW5nPXNldHVwX2V4cGVjdGVkX2ludGVycnVwdHMoc2hwbnQpOwojaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCgkJSE9TVERBVEEoc2hwbnQpLT5jb3VudFtTVEFURV0rKzsKCQlpZihQUkVWU1RBVEUhPVNUQVRFKQoJCQlIT1NUREFUQShzaHBudCktPmNvdW50X3RyYW5zW1NUQVRFXSsrOwoJCUhPU1REQVRBKHNocG50KS0+dGltZVtTVEFURV0gKz0gamlmZmllcy1zdGFydDsKI2VuZGlmCgoJCURQUklOVEsoZGVidWdfcGhhc2VzLCBMRUFEICJlbmQgJXMgJXMoJXMpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBzdGF0ZXNbU1RBVEVdLm5hbWUsIHN0YXRlc1tQUkVWU1RBVEVdLm5hbWUsIHN0YXRlc1tMQVNUU1RBVEVdLm5hbWUpOwoJfSB3aGlsZShwZW5kaW5nKTsKCgkvKgoJICogZW5hYmxlIGludGVycnVwdHMgYW5kIGxlYXZlIGJvdHRvbS1oYWxmCgkgKgoJICovCglIT1NUREFUQShzaHBudCktPmluX2ludHItLTsKCVNFVEJJVFMoRE1BQ05UUkwwLCBJTlRFTik7CglET19VTkxPQ0soZmxhZ3MpOwp9CgoKLyogCiAqIER1bXAgdGhlIGN1cnJlbnQgZHJpdmVyIHN0YXR1cyBhbmQgcGFuaWMKICovCnN0YXRpYyB2b2lkIGFoYTE1MnhfZXJyb3Ioc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQsIGNoYXIgKm1zZykKewoJcHJpbnRrKEtFUk5fRU1FUkcgIlxuYWhhMTUyeCVkOiAlc1xuIiwgSE9TVE5PLCBtc2cpOwoJc2hvd19xdWV1ZXMoc2hwbnQpOwoJcGFuaWMoImFoYTE1MnggcGFuaWNcbiIpOwp9CgovKgogKiBEaXNwbGF5IHJlZ2lzdGVycyBvZiBBSUMtNjI2MAogKi8Kc3RhdGljIHZvaWQgZGlzcF9wb3J0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewojaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQoJaW50IHM7CgoJcHJpbnRrKCJcbiVzOiAlcyglcykgIiwKCQlDVVJSRU5UX1NDID8gImJ1c3kiIDogIndhaXRpbmciLAoJCXN0YXRlc1tTVEFURV0ubmFtZSwKCQlzdGF0ZXNbUFJFVlNUQVRFXS5uYW1lKTsKCglzID0gR0VUUE9SVChTQ1NJU0VRKTsKCXByaW50aygiU0NTSVNFUSggIik7CglpZiAocyAmIFRFTU9ERU8pCgkJcHJpbnRrKCJUQVJHRVQgTU9ERSAiKTsKCWlmIChzICYgRU5TRUxPKQoJCXByaW50aygiU0VMTyAiKTsKCWlmIChzICYgRU5TRUxJKQoJCXByaW50aygiU0VMSSAiKTsKCWlmIChzICYgRU5SRVNFTEkpCgkJcHJpbnRrKCJSRVNFTEkgIik7CglpZiAocyAmIEVOQVVUT0FUTk8pCgkJcHJpbnRrKCJBVVRPQVROTyAiKTsKCWlmIChzICYgRU5BVVRPQVROSSkKCQlwcmludGsoIkFVVE9BVE5JICIpOwoJaWYgKHMgJiBFTkFVVE9BVE5QKQoJCXByaW50aygiQVVUT0FUTlAgIik7CglpZiAocyAmIFNDU0lSU1RPKQoJCXByaW50aygiU0NTSVJTVE8gIik7CglwcmludGsoIik7Iik7CgoJcHJpbnRrKCIgU0NTSVNJRygiKTsKCXMgPSBHRVRQT1JUKFNDU0lTSUcpOwoJc3dpdGNoIChzICYgUF9NQVNLKSB7CgljYXNlIFBfREFUQU86CgkJcHJpbnRrKCJEQVRBIE9VVCIpOwoJCWJyZWFrOwoJY2FzZSBQX0RBVEFJOgoJCXByaW50aygiREFUQSBJTiIpOwoJCWJyZWFrOwoJY2FzZSBQX0NNRDoKCQlwcmludGsoIkNPTU1BTkQiKTsKCQlicmVhazsKCWNhc2UgUF9TVEFUVVM6CgkJcHJpbnRrKCJTVEFUVVMiKTsKCQlicmVhazsKCWNhc2UgUF9NU0dPOgoJCXByaW50aygiTUVTU0FHRSBPVVQiKTsKCQlicmVhazsKCWNhc2UgUF9NU0dJOgoJCXByaW50aygiTUVTU0FHRSBJTiIpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlwcmludGsoIippbnZhbGlkKiIpOwoJCWJyZWFrOwoJfQoKCXByaW50aygiKTsgIik7CgoJcHJpbnRrKCJJTlRTVEFUICglcyk7ICIsIFRFU1RISShETUFTVEFULCBJTlRTVEFUKSA/ICJoaSIgOiAibG8iKTsKCglwcmludGsoIlNTVEFUKCAiKTsKCXMgPSBHRVRQT1JUKFNTVEFUMCk7CglpZiAocyAmIFRBUkdFVCkKCQlwcmludGsoIlRBUkdFVCAiKTsKCWlmIChzICYgU0VMRE8pCgkJcHJpbnRrKCJTRUxETyAiKTsKCWlmIChzICYgU0VMREkpCgkJcHJpbnRrKCJTRUxESSAiKTsKCWlmIChzICYgU0VMSU5HTykKCQlwcmludGsoIlNFTElOR08gIik7CglpZiAocyAmIFNXUkFQKQoJCXByaW50aygiU1dSQVAgIik7CglpZiAocyAmIFNET05FKQoJCXByaW50aygiU0RPTkUgIik7CglpZiAocyAmIFNQSU9SRFkpCgkJcHJpbnRrKCJTUElPUkRZICIpOwoJaWYgKHMgJiBETUFET05FKQoJCXByaW50aygiRE1BRE9ORSAiKTsKCglzID0gR0VUUE9SVChTU1RBVDEpOwoJaWYgKHMgJiBTRUxUTykKCQlwcmludGsoIlNFTFRPICIpOwoJaWYgKHMgJiBBVE5UQVJHKQoJCXByaW50aygiQVROVEFSRyAiKTsKCWlmIChzICYgU0NTSVJTVEkpCgkJcHJpbnRrKCJTQ1NJUlNUSSAiKTsKCWlmIChzICYgUEhBU0VNSVMpCgkJcHJpbnRrKCJQSEFTRU1JUyAiKTsKCWlmIChzICYgQlVTRlJFRSkKCQlwcmludGsoIkJVU0ZSRUUgIik7CglpZiAocyAmIFNDU0lQRVJSKQoJCXByaW50aygiU0NTSVBFUlIgIik7CglpZiAocyAmIFBIQVNFQ0hHKQoJCXByaW50aygiUEhBU0VDSEcgIik7CglpZiAocyAmIFJFUUlOSVQpCgkJcHJpbnRrKCJSRVFJTklUICIpOwoJcHJpbnRrKCIpOyAiKTsKCgoJcHJpbnRrKCJTU1RBVCggIik7CgoJcyA9IEdFVFBPUlQoU1NUQVQwKSAmIEdFVFBPUlQoU0lNT0RFMCk7CgoJaWYgKHMgJiBUQVJHRVQpCgkJcHJpbnRrKCJUQVJHRVQgIik7CglpZiAocyAmIFNFTERPKQoJCXByaW50aygiU0VMRE8gIik7CglpZiAocyAmIFNFTERJKQoJCXByaW50aygiU0VMREkgIik7CglpZiAocyAmIFNFTElOR08pCgkJcHJpbnRrKCJTRUxJTkdPICIpOwoJaWYgKHMgJiBTV1JBUCkKCQlwcmludGsoIlNXUkFQICIpOwoJaWYgKHMgJiBTRE9ORSkKCQlwcmludGsoIlNET05FICIpOwoJaWYgKHMgJiBTUElPUkRZKQoJCXByaW50aygiU1BJT1JEWSAiKTsKCWlmIChzICYgRE1BRE9ORSkKCQlwcmludGsoIkRNQURPTkUgIik7CgoJcyA9IEdFVFBPUlQoU1NUQVQxKSAmIEdFVFBPUlQoU0lNT0RFMSk7CgoJaWYgKHMgJiBTRUxUTykKCQlwcmludGsoIlNFTFRPICIpOwoJaWYgKHMgJiBBVE5UQVJHKQoJCXByaW50aygiQVROVEFSRyAiKTsKCWlmIChzICYgU0NTSVJTVEkpCgkJcHJpbnRrKCJTQ1NJUlNUSSAiKTsKCWlmIChzICYgUEhBU0VNSVMpCgkJcHJpbnRrKCJQSEFTRU1JUyAiKTsKCWlmIChzICYgQlVTRlJFRSkKCQlwcmludGsoIkJVU0ZSRUUgIik7CglpZiAocyAmIFNDU0lQRVJSKQoJCXByaW50aygiU0NTSVBFUlIgIik7CglpZiAocyAmIFBIQVNFQ0hHKQoJCXByaW50aygiUEhBU0VDSEcgIik7CglpZiAocyAmIFJFUUlOSVQpCgkJcHJpbnRrKCJSRVFJTklUICIpOwoJcHJpbnRrKCIpOyAiKTsKCglwcmludGsoIlNYRlJDVEwwKCAiKTsKCglzID0gR0VUUE9SVChTWEZSQ1RMMCk7CglpZiAocyAmIFNDU0lFTikKCQlwcmludGsoIlNDU0lFTiAiKTsKCWlmIChzICYgRE1BRU4pCgkJcHJpbnRrKCJETUFFTiAiKTsKCWlmIChzICYgQ0gxKQoJCXByaW50aygiQ0gxICIpOwoJaWYgKHMgJiBDTFJTVENOVCkKCQlwcmludGsoIkNMUlNUQ05UICIpOwoJaWYgKHMgJiBTUElPRU4pCgkJcHJpbnRrKCJTUElPRU4gIik7CglpZiAocyAmIENMUkNIMSkKCQlwcmludGsoIkNMUkNIMSAiKTsKCXByaW50aygiKTsgIik7CgoJcHJpbnRrKCJTSUdOQUwoICIpOwoKCXMgPSBHRVRQT1JUKFNDU0lTSUcpOwoJaWYgKHMgJiBTSUdfQVROSSkKCQlwcmludGsoIkFUTkkgIik7CglpZiAocyAmIFNJR19TRUxJKQoJCXByaW50aygiU0VMSSAiKTsKCWlmIChzICYgU0lHX0JTWUkpCgkJcHJpbnRrKCJCU1lJICIpOwoJaWYgKHMgJiBTSUdfUkVRSSkKCQlwcmludGsoIlJFUUkgIik7CglpZiAocyAmIFNJR19BQ0tJKQoJCXByaW50aygiQUNLSSAiKTsKCXByaW50aygiKTsgIik7CgoJcHJpbnRrKCJTRUxJRCAoJTAyeCksICIsIEdFVFBPUlQoU0VMSUQpKTsKCglwcmludGsoIlNUQ05UICglZCksICIsIEdFVFNUQ05UKCkpOwoJCglwcmludGsoIlNTVEFUMiggIik7CgoJcyA9IEdFVFBPUlQoU1NUQVQyKTsKCWlmIChzICYgU09GRlNFVCkKCQlwcmludGsoIlNPRkZTRVQgIik7CglpZiAocyAmIFNFTVBUWSkKCQlwcmludGsoIlNFTVBUWSAiKTsKCWlmIChzICYgU0ZVTEwpCgkJcHJpbnRrKCJTRlVMTCAiKTsKCXByaW50aygiKTsgU0ZDTlQgKCVkKTsgIiwgcyAmIChTRlVMTCB8IFNGQ05UKSk7CgoJcyA9IEdFVFBPUlQoU1NUQVQzKTsKCXByaW50aygiU0NTSUNOVCAoJWQpLCBPRkZDTlQoJWQpLCAiLCAocyAmIDB4ZjApID4+IDQsIHMgJiAweDBmKTsKCglwcmludGsoIlNTVEFUNCggIik7CglzID0gR0VUUE9SVChTU1RBVDQpOwoJaWYgKHMgJiBTWU5DRVJSKQoJCXByaW50aygiU1lOQ0VSUiAiKTsKCWlmIChzICYgRldFUlIpCgkJcHJpbnRrKCJGV0VSUiAiKTsKCWlmIChzICYgRlJFUlIpCgkJcHJpbnRrKCJGUkVSUiAiKTsKCXByaW50aygiKTsgIik7CgoJcHJpbnRrKCJETUFDTlRSTDAoICIpOwoJcyA9IEdFVFBPUlQoRE1BQ05UUkwwKTsKCXByaW50aygiJXMgIiwgcyAmIF84QklUID8gIjhCSVQiIDogIjE2QklUIik7CglwcmludGsoIiVzICIsIHMgJiBETUEgPyAiRE1BIiA6ICJQSU8iKTsKCXByaW50aygiJXMgIiwgcyAmIFdSSVRFX1JFQUQgPyAiV1JJVEUiIDogIlJFQUQiKTsKCWlmIChzICYgRU5ETUEpCgkJcHJpbnRrKCJFTkRNQSAiKTsKCWlmIChzICYgSU5URU4pCgkJcHJpbnRrKCJJTlRFTiAiKTsKCWlmIChzICYgUlNURklGTykKCQlwcmludGsoIlJTVEZJRk8gIik7CglpZiAocyAmIFNXSU5UKQoJCXByaW50aygiU1dJTlQgIik7CglwcmludGsoIik7ICIpOwoKCXByaW50aygiRE1BU1RBVCggIik7CglzID0gR0VUUE9SVChETUFTVEFUKTsKCWlmIChzICYgQVRET05FKQoJCXByaW50aygiQVRET05FICIpOwoJaWYgKHMgJiBXT1JEUkRZKQoJCXByaW50aygiV09SRFJEWSAiKTsKCWlmIChzICYgREZJRk9GVUxMKQoJCXByaW50aygiREZJRk9GVUxMICIpOwoJaWYgKHMgJiBERklGT0VNUCkKCQlwcmludGsoIkRGSUZPRU1QICIpOwoJcHJpbnRrKCIpXG4iKTsKI2VuZGlmCn0KCi8qCiAqIGRpc3BsYXkgZW5hYmxlZCBpbnRlcnJ1cHRzCiAqLwpzdGF0aWMgdm9pZCBkaXNwX2VuaW50cihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewoJaW50IHM7CgoJcHJpbnRrKEtFUk5fREVCVUcgImVuYWJsZWQgaW50ZXJydXB0cyAoICIpOwoKCXMgPSBHRVRQT1JUKFNJTU9ERTApOwoJaWYgKHMgJiBFTlNFTERPKQoJCXByaW50aygiRU5TRUxETyAiKTsKCWlmIChzICYgRU5TRUxESSkKCQlwcmludGsoIkVOU0VMREkgIik7CglpZiAocyAmIEVOU0VMSU5HTykKCQlwcmludGsoIkVOU0VMSU5HTyAiKTsKCWlmIChzICYgRU5TV1JBUCkKCQlwcmludGsoIkVOU1dSQVAgIik7CglpZiAocyAmIEVOU0RPTkUpCgkJcHJpbnRrKCJFTlNET05FICIpOwoJaWYgKHMgJiBFTlNQSU9SRFkpCgkJcHJpbnRrKCJFTlNQSU9SRFkgIik7CglpZiAocyAmIEVORE1BRE9ORSkKCQlwcmludGsoIkVORE1BRE9ORSAiKTsKCglzID0gR0VUUE9SVChTSU1PREUxKTsKCWlmIChzICYgRU5TRUxUSU1PKQoJCXByaW50aygiRU5TRUxUSU1PICIpOwoJaWYgKHMgJiBFTkFUTlRBUkcpCgkJcHJpbnRrKCJFTkFUTlRBUkcgIik7CglpZiAocyAmIEVOUEhBU0VNSVMpCgkJcHJpbnRrKCJFTlBIQVNFTUlTICIpOwoJaWYgKHMgJiBFTkJVU0ZSRUUpCgkJcHJpbnRrKCJFTkJVU0ZSRUUgIik7CglpZiAocyAmIEVOU0NTSVBFUlIpCgkJcHJpbnRrKCJFTlNDU0lQRVJSICIpOwoJaWYgKHMgJiBFTlBIQVNFQ0hHKQoJCXByaW50aygiRU5QSEFTRUNIRyAiKTsKCWlmIChzICYgRU5SRVFJTklUKQoJCXByaW50aygiRU5SRVFJTklUICIpOwoJcHJpbnRrKCIpXG4iKTsKfQoKLyoKICogU2hvdyB0aGUgY29tbWFuZCBkYXRhIG9mIGEgY29tbWFuZAogKi8Kc3RhdGljIHZvaWQgc2hvd19jb21tYW5kKFNjc2lfQ21uZCAqcHRyKQp7CglzY21kX3ByaW50ayhLRVJOX0RFQlVHLCBwdHIsICIlcDogY21uZD0oIiwgcHRyKTsKCglfX3Njc2lfcHJpbnRfY29tbWFuZChwdHItPmNtbmQpOwoKCXByaW50ayhLRVJOX0RFQlVHICIpOyByZXF1ZXN0X2J1ZmZsZW49JWQ7IHJlc2lkPSVkOyBwaGFzZSB8IiwKCSAgICAgICBwdHItPnJlcXVlc3RfYnVmZmxlbiwgcHRyLT5yZXNpZCk7CgoJaWYgKHB0ci0+U0NwLnBoYXNlICYgbm90X2lzc3VlZCkKCQlwcmludGsoIm5vdCBpc3N1ZWR8Iik7CglpZiAocHRyLT5TQ3AucGhhc2UgJiBzZWxlY3RpbmcpCgkJcHJpbnRrKCJzZWxlY3Rpbmd8Iik7CglpZiAocHRyLT5TQ3AucGhhc2UgJiBpZGVudGlmaWVkKQoJCXByaW50aygiaWRlbnRpZmllZHwiKTsKCWlmIChwdHItPlNDcC5waGFzZSAmIGRpc2Nvbm5lY3RlZCkKCQlwcmludGsoImRpc2Nvbm5lY3RlZHwiKTsKCWlmIChwdHItPlNDcC5waGFzZSAmIGNvbXBsZXRlZCkKCQlwcmludGsoImNvbXBsZXRlZHwiKTsKCWlmIChwdHItPlNDcC5waGFzZSAmIHNwaW9yZHkpCgkJcHJpbnRrKCJzcGlvcmR5fCIpOwoJaWYgKHB0ci0+U0NwLnBoYXNlICYgc3luY25lZykKCQlwcmludGsoInN5bmNuZWd8Iik7CglpZiAocHRyLT5TQ3AucGhhc2UgJiBhYm9ydGVkKQoJCXByaW50aygiYWJvcnRlZHwiKTsKCWlmIChwdHItPlNDcC5waGFzZSAmIHJlc2V0dGVkKQoJCXByaW50aygicmVzZXR0ZWR8Iik7CglpZiggU0NEQVRBKHB0cikgKSB7CgkJcHJpbnRrKCI7IG5leHQ9MHglcFxuIiwgU0NORVhUKHB0cikpOwoJfSBlbHNlIHsKCQlwcmludGsoIjsgbmV4dD0oaG9zdCBzY3JpYmJsZSBOVUxMKVxuIik7Cgl9Cn0KCi8qCiAqIER1bXAgdGhlIHF1ZXVlZCBkYXRhCiAqLwpzdGF0aWMgdm9pZCBzaG93X3F1ZXVlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKewoJU2NzaV9DbW5kICpwdHI7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCURPX0xPQ0soZmxhZ3MpOwoJcHJpbnRrKEtFUk5fREVCVUcgIlxucXVldWUgc3RhdHVzOlxuaXNzdWVfU0M6XG4iKTsKCWZvciAocHRyID0gSVNTVUVfU0M7IHB0cjsgcHRyID0gU0NORVhUKHB0cikpCgkJc2hvd19jb21tYW5kKHB0cik7CglET19VTkxPQ0soZmxhZ3MpOwoKCXByaW50ayhLRVJOX0RFQlVHICJjdXJyZW50X1NDOlxuIik7CglpZiAoQ1VSUkVOVF9TQykKCQlzaG93X2NvbW1hbmQoQ1VSUkVOVF9TQyk7CgllbHNlCgkJcHJpbnRrKEtFUk5fREVCVUcgIm5vbmVcbiIpOwoKCXByaW50ayhLRVJOX0RFQlVHICJkaXNjb25uZWN0ZWRfU0M6XG4iKTsKCWZvciAocHRyID0gRElTQ09OTkVDVEVEX1NDOyBwdHI7IHB0ciA9IFNDREFUQShwdHIpID8gU0NORVhUKHB0cikgOiBOVUxMKQoJCXNob3dfY29tbWFuZChwdHIpOwoKCWRpc3BfcG9ydHMoc2hwbnQpOwoJZGlzcF9lbmludHIoc2hwbnQpOwp9CgojdW5kZWYgU1BSSU5URgojZGVmaW5lIFNQUklOVEYoYXJncy4uLikgcG9zICs9IHNwcmludGYocG9zLCAjIyBhcmdzKQoKc3RhdGljIGludCBnZXRfY29tbWFuZChjaGFyICpwb3MsIFNjc2lfQ21uZCAqIHB0cikKewoJY2hhciAqc3RhcnQgPSBwb3M7CglpbnQgaTsKCglTUFJJTlRGKCIweCUwOHg6IHRhcmdldD0lZDsgbHVuPSVkOyBjbW5kPSggIiwKCQkodW5zaWduZWQgaW50KSBwdHIsIHB0ci0+ZGV2aWNlLT5pZCwgcHRyLT5kZXZpY2UtPmx1bik7CgoJZm9yIChpID0gMDsgaSA8IENPTU1BTkRfU0laRShwdHItPmNtbmRbMF0pOyBpKyspCgkJU1BSSU5URigiMHglMDJ4ICIsIHB0ci0+Y21uZFtpXSk7CgoJU1BSSU5URigiKTsgcmVzaWQ9JWQ7IHJlc2lkdWFsPSVkOyBidWZmZXJzPSVkOyBwaGFzZSB8IiwKCQlwdHItPnJlc2lkLCBwdHItPlNDcC50aGlzX3Jlc2lkdWFsLCBwdHItPlNDcC5idWZmZXJzX3Jlc2lkdWFsKTsKCglpZiAocHRyLT5TQ3AucGhhc2UgJiBub3RfaXNzdWVkKQoJCVNQUklOVEYoIm5vdCBpc3N1ZWR8Iik7CglpZiAocHRyLT5TQ3AucGhhc2UgJiBzZWxlY3RpbmcpCgkJU1BSSU5URigic2VsZWN0aW5nfCIpOwoJaWYgKHB0ci0+U0NwLnBoYXNlICYgZGlzY29ubmVjdGVkKQoJCVNQUklOVEYoImRpc2Nvbm5lY3RlZHwiKTsKCWlmIChwdHItPlNDcC5waGFzZSAmIGFib3J0ZWQpCgkJU1BSSU5URigiYWJvcnRlZHwiKTsKCWlmIChwdHItPlNDcC5waGFzZSAmIGlkZW50aWZpZWQpCgkJU1BSSU5URigiaWRlbnRpZmllZHwiKTsKCWlmIChwdHItPlNDcC5waGFzZSAmIGNvbXBsZXRlZCkKCQlTUFJJTlRGKCJjb21wbGV0ZWR8Iik7CglpZiAocHRyLT5TQ3AucGhhc2UgJiBzcGlvcmR5KQoJCVNQUklOVEYoInNwaW9yZHl8Iik7CglpZiAocHRyLT5TQ3AucGhhc2UgJiBzeW5jbmVnKQoJCVNQUklOVEYoInN5bmNuZWd8Iik7CglTUFJJTlRGKCI7IG5leHQ9MHglcFxuIiwgU0NORVhUKHB0cikpOwoKCXJldHVybiAocG9zIC0gc3RhcnQpOwp9CgpzdGF0aWMgaW50IGdldF9wb3J0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgY2hhciAqcG9zKQp7CgljaGFyICpzdGFydCA9IHBvczsKCWludCBzOwoKCVNQUklOVEYoIlxuJXM6ICVzKCVzKSAiLCBDVVJSRU5UX1NDID8gIm9uIGJ1cyIgOiAid2FpdGluZyIsIHN0YXRlc1tTVEFURV0ubmFtZSwgc3RhdGVzW1BSRVZTVEFURV0ubmFtZSk7CgoJcyA9IEdFVFBPUlQoU0NTSVNFUSk7CglTUFJJTlRGKCJTQ1NJU0VRKCAiKTsKCWlmIChzICYgVEVNT0RFTykKCQlTUFJJTlRGKCJUQVJHRVQgTU9ERSAiKTsKCWlmIChzICYgRU5TRUxPKQoJCVNQUklOVEYoIlNFTE8gIik7CglpZiAocyAmIEVOU0VMSSkKCQlTUFJJTlRGKCJTRUxJICIpOwoJaWYgKHMgJiBFTlJFU0VMSSkKCQlTUFJJTlRGKCJSRVNFTEkgIik7CglpZiAocyAmIEVOQVVUT0FUTk8pCgkJU1BSSU5URigiQVVUT0FUTk8gIik7CglpZiAocyAmIEVOQVVUT0FUTkkpCgkJU1BSSU5URigiQVVUT0FUTkkgIik7CglpZiAocyAmIEVOQVVUT0FUTlApCgkJU1BSSU5URigiQVVUT0FUTlAgIik7CglpZiAocyAmIFNDU0lSU1RPKQoJCVNQUklOVEYoIlNDU0lSU1RPICIpOwoJU1BSSU5URigiKTsiKTsKCglTUFJJTlRGKCIgU0NTSVNJRygiKTsKCXMgPSBHRVRQT1JUKFNDU0lTSUcpOwoJc3dpdGNoIChzICYgUF9NQVNLKSB7CgljYXNlIFBfREFUQU86CgkJU1BSSU5URigiREFUQSBPVVQiKTsKCQlicmVhazsKCWNhc2UgUF9EQVRBSToKCQlTUFJJTlRGKCJEQVRBIElOIik7CgkJYnJlYWs7CgljYXNlIFBfQ01EOgoJCVNQUklOVEYoIkNPTU1BTkQiKTsKCQlicmVhazsKCWNhc2UgUF9TVEFUVVM6CgkJU1BSSU5URigiU1RBVFVTIik7CgkJYnJlYWs7CgljYXNlIFBfTVNHTzoKCQlTUFJJTlRGKCJNRVNTQUdFIE9VVCIpOwoJCWJyZWFrOwoJY2FzZSBQX01TR0k6CgkJU1BSSU5URigiTUVTU0FHRSBJTiIpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlTUFJJTlRGKCIqaW52YWxpZCoiKTsKCQlicmVhazsKCX0KCglTUFJJTlRGKCIpOyAiKTsKCglTUFJJTlRGKCJJTlRTVEFUICglcyk7ICIsIFRFU1RISShETUFTVEFULCBJTlRTVEFUKSA/ICJoaSIgOiAibG8iKTsKCglTUFJJTlRGKCJTU1RBVCggIik7CglzID0gR0VUUE9SVChTU1RBVDApOwoJaWYgKHMgJiBUQVJHRVQpCgkJU1BSSU5URigiVEFSR0VUICIpOwoJaWYgKHMgJiBTRUxETykKCQlTUFJJTlRGKCJTRUxETyAiKTsKCWlmIChzICYgU0VMREkpCgkJU1BSSU5URigiU0VMREkgIik7CglpZiAocyAmIFNFTElOR08pCgkJU1BSSU5URigiU0VMSU5HTyAiKTsKCWlmIChzICYgU1dSQVApCgkJU1BSSU5URigiU1dSQVAgIik7CglpZiAocyAmIFNET05FKQoJCVNQUklOVEYoIlNET05FICIpOwoJaWYgKHMgJiBTUElPUkRZKQoJCVNQUklOVEYoIlNQSU9SRFkgIik7CglpZiAocyAmIERNQURPTkUpCgkJU1BSSU5URigiRE1BRE9ORSAiKTsKCglzID0gR0VUUE9SVChTU1RBVDEpOwoJaWYgKHMgJiBTRUxUTykKCQlTUFJJTlRGKCJTRUxUTyAiKTsKCWlmIChzICYgQVROVEFSRykKCQlTUFJJTlRGKCJBVE5UQVJHICIpOwoJaWYgKHMgJiBTQ1NJUlNUSSkKCQlTUFJJTlRGKCJTQ1NJUlNUSSAiKTsKCWlmIChzICYgUEhBU0VNSVMpCgkJU1BSSU5URigiUEhBU0VNSVMgIik7CglpZiAocyAmIEJVU0ZSRUUpCgkJU1BSSU5URigiQlVTRlJFRSAiKTsKCWlmIChzICYgU0NTSVBFUlIpCgkJU1BSSU5URigiU0NTSVBFUlIgIik7CglpZiAocyAmIFBIQVNFQ0hHKQoJCVNQUklOVEYoIlBIQVNFQ0hHICIpOwoJaWYgKHMgJiBSRVFJTklUKQoJCVNQUklOVEYoIlJFUUlOSVQgIik7CglTUFJJTlRGKCIpOyAiKTsKCgoJU1BSSU5URigiU1NUQVQoICIpOwoKCXMgPSBHRVRQT1JUKFNTVEFUMCkgJiBHRVRQT1JUKFNJTU9ERTApOwoKCWlmIChzICYgVEFSR0VUKQoJCVNQUklOVEYoIlRBUkdFVCAiKTsKCWlmIChzICYgU0VMRE8pCgkJU1BSSU5URigiU0VMRE8gIik7CglpZiAocyAmIFNFTERJKQoJCVNQUklOVEYoIlNFTERJICIpOwoJaWYgKHMgJiBTRUxJTkdPKQoJCVNQUklOVEYoIlNFTElOR08gIik7CglpZiAocyAmIFNXUkFQKQoJCVNQUklOVEYoIlNXUkFQICIpOwoJaWYgKHMgJiBTRE9ORSkKCQlTUFJJTlRGKCJTRE9ORSAiKTsKCWlmIChzICYgU1BJT1JEWSkKCQlTUFJJTlRGKCJTUElPUkRZICIpOwoJaWYgKHMgJiBETUFET05FKQoJCVNQUklOVEYoIkRNQURPTkUgIik7CgoJcyA9IEdFVFBPUlQoU1NUQVQxKSAmIEdFVFBPUlQoU0lNT0RFMSk7CgoJaWYgKHMgJiBTRUxUTykKCQlTUFJJTlRGKCJTRUxUTyAiKTsKCWlmIChzICYgQVROVEFSRykKCQlTUFJJTlRGKCJBVE5UQVJHICIpOwoJaWYgKHMgJiBTQ1NJUlNUSSkKCQlTUFJJTlRGKCJTQ1NJUlNUSSAiKTsKCWlmIChzICYgUEhBU0VNSVMpCgkJU1BSSU5URigiUEhBU0VNSVMgIik7CglpZiAocyAmIEJVU0ZSRUUpCgkJU1BSSU5URigiQlVTRlJFRSAiKTsKCWlmIChzICYgU0NTSVBFUlIpCgkJU1BSSU5URigiU0NTSVBFUlIgIik7CglpZiAocyAmIFBIQVNFQ0hHKQoJCVNQUklOVEYoIlBIQVNFQ0hHICIpOwoJaWYgKHMgJiBSRVFJTklUKQoJCVNQUklOVEYoIlJFUUlOSVQgIik7CglTUFJJTlRGKCIpOyAiKTsKCglTUFJJTlRGKCJTWEZSQ1RMMCggIik7CgoJcyA9IEdFVFBPUlQoU1hGUkNUTDApOwoJaWYgKHMgJiBTQ1NJRU4pCgkJU1BSSU5URigiU0NTSUVOICIpOwoJaWYgKHMgJiBETUFFTikKCQlTUFJJTlRGKCJETUFFTiAiKTsKCWlmIChzICYgQ0gxKQoJCVNQUklOVEYoIkNIMSAiKTsKCWlmIChzICYgQ0xSU1RDTlQpCgkJU1BSSU5URigiQ0xSU1RDTlQgIik7CglpZiAocyAmIFNQSU9FTikKCQlTUFJJTlRGKCJTUElPRU4gIik7CglpZiAocyAmIENMUkNIMSkKCQlTUFJJTlRGKCJDTFJDSDEgIik7CglTUFJJTlRGKCIpOyAiKTsKCglTUFJJTlRGKCJTSUdOQUwoICIpOwoKCXMgPSBHRVRQT1JUKFNDU0lTSUcpOwoJaWYgKHMgJiBTSUdfQVROSSkKCQlTUFJJTlRGKCJBVE5JICIpOwoJaWYgKHMgJiBTSUdfU0VMSSkKCQlTUFJJTlRGKCJTRUxJICIpOwoJaWYgKHMgJiBTSUdfQlNZSSkKCQlTUFJJTlRGKCJCU1lJICIpOwoJaWYgKHMgJiBTSUdfUkVRSSkKCQlTUFJJTlRGKCJSRVFJICIpOwoJaWYgKHMgJiBTSUdfQUNLSSkKCQlTUFJJTlRGKCJBQ0tJICIpOwoJU1BSSU5URigiKTsgIik7CgoJU1BSSU5URigiU0VMSUQoJTAyeCksICIsIEdFVFBPUlQoU0VMSUQpKTsKCglTUFJJTlRGKCJTVENOVCglZCksICIsIEdFVFNUQ05UKCkpOwoKCVNQUklOVEYoIlNTVEFUMiggIik7CgoJcyA9IEdFVFBPUlQoU1NUQVQyKTsKCWlmIChzICYgU09GRlNFVCkKCQlTUFJJTlRGKCJTT0ZGU0VUICIpOwoJaWYgKHMgJiBTRU1QVFkpCgkJU1BSSU5URigiU0VNUFRZICIpOwoJaWYgKHMgJiBTRlVMTCkKCQlTUFJJTlRGKCJTRlVMTCAiKTsKCVNQUklOVEYoIik7IFNGQ05UICglZCk7ICIsIHMgJiAoU0ZVTEwgfCBTRkNOVCkpOwoKCXMgPSBHRVRQT1JUKFNTVEFUMyk7CglTUFJJTlRGKCJTQ1NJQ05UICglZCksIE9GRkNOVCglZCksICIsIChzICYgMHhmMCkgPj4gNCwgcyAmIDB4MGYpOwoKCVNQUklOVEYoIlNTVEFUNCggIik7CglzID0gR0VUUE9SVChTU1RBVDQpOwoJaWYgKHMgJiBTWU5DRVJSKQoJCVNQUklOVEYoIlNZTkNFUlIgIik7CglpZiAocyAmIEZXRVJSKQoJCVNQUklOVEYoIkZXRVJSICIpOwoJaWYgKHMgJiBGUkVSUikKCQlTUFJJTlRGKCJGUkVSUiAiKTsKCVNQUklOVEYoIik7ICIpOwoKCVNQUklOVEYoIkRNQUNOVFJMMCggIik7CglzID0gR0VUUE9SVChETUFDTlRSTDApOwoJU1BSSU5URigiJXMgIiwgcyAmIF84QklUID8gIjhCSVQiIDogIjE2QklUIik7CglTUFJJTlRGKCIlcyAiLCBzICYgRE1BID8gIkRNQSIgOiAiUElPIik7CglTUFJJTlRGKCIlcyAiLCBzICYgV1JJVEVfUkVBRCA/ICJXUklURSIgOiAiUkVBRCIpOwoJaWYgKHMgJiBFTkRNQSkKCQlTUFJJTlRGKCJFTkRNQSAiKTsKCWlmIChzICYgSU5URU4pCgkJU1BSSU5URigiSU5URU4gIik7CglpZiAocyAmIFJTVEZJRk8pCgkJU1BSSU5URigiUlNURklGTyAiKTsKCWlmIChzICYgU1dJTlQpCgkJU1BSSU5URigiU1dJTlQgIik7CglTUFJJTlRGKCIpOyAiKTsKCglTUFJJTlRGKCJETUFTVEFUKCAiKTsKCXMgPSBHRVRQT1JUKERNQVNUQVQpOwoJaWYgKHMgJiBBVERPTkUpCgkJU1BSSU5URigiQVRET05FICIpOwoJaWYgKHMgJiBXT1JEUkRZKQoJCVNQUklOVEYoIldPUkRSRFkgIik7CglpZiAocyAmIERGSUZPRlVMTCkKCQlTUFJJTlRGKCJERklGT0ZVTEwgIik7CglpZiAocyAmIERGSUZPRU1QKQoJCVNQUklOVEYoIkRGSUZPRU1QICIpOwoJU1BSSU5URigiKVxuIik7CgoJU1BSSU5URigiZW5hYmxlZCBpbnRlcnJ1cHRzKCAiKTsKCglzID0gR0VUUE9SVChTSU1PREUwKTsKCWlmIChzICYgRU5TRUxETykKCQlTUFJJTlRGKCJFTlNFTERPICIpOwoJaWYgKHMgJiBFTlNFTERJKQoJCVNQUklOVEYoIkVOU0VMREkgIik7CglpZiAocyAmIEVOU0VMSU5HTykKCQlTUFJJTlRGKCJFTlNFTElOR08gIik7CglpZiAocyAmIEVOU1dSQVApCgkJU1BSSU5URigiRU5TV1JBUCAiKTsKCWlmIChzICYgRU5TRE9ORSkKCQlTUFJJTlRGKCJFTlNET05FICIpOwoJaWYgKHMgJiBFTlNQSU9SRFkpCgkJU1BSSU5URigiRU5TUElPUkRZICIpOwoJaWYgKHMgJiBFTkRNQURPTkUpCgkJU1BSSU5URigiRU5ETUFET05FICIpOwoKCXMgPSBHRVRQT1JUKFNJTU9ERTEpOwoJaWYgKHMgJiBFTlNFTFRJTU8pCgkJU1BSSU5URigiRU5TRUxUSU1PICIpOwoJaWYgKHMgJiBFTkFUTlRBUkcpCgkJU1BSSU5URigiRU5BVE5UQVJHICIpOwoJaWYgKHMgJiBFTlBIQVNFTUlTKQoJCVNQUklOVEYoIkVOUEhBU0VNSVMgIik7CglpZiAocyAmIEVOQlVTRlJFRSkKCQlTUFJJTlRGKCJFTkJVU0ZSRUUgIik7CglpZiAocyAmIEVOU0NTSVBFUlIpCgkJU1BSSU5URigiRU5TQ1NJUEVSUiAiKTsKCWlmIChzICYgRU5QSEFTRUNIRykKCQlTUFJJTlRGKCJFTlBIQVNFQ0hHICIpOwoJaWYgKHMgJiBFTlJFUUlOSVQpCgkJU1BSSU5URigiRU5SRVFJTklUICIpOwoJU1BSSU5URigiKVxuIik7CgoJcmV0dXJuIChwb3MgLSBzdGFydCk7Cn0KCnN0YXRpYyBpbnQgYWhhMTUyeF9zZXRfaW5mbyhjaGFyICpidWZmZXIsIGludCBsZW5ndGgsIHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQp7CglpZighc2hwbnQgfHwgIWJ1ZmZlciB8fCBsZW5ndGg8OCB8fCBzdHJuY21wKCJhaGExNTJ4ICIsIGJ1ZmZlciwgOCkhPTApCgkJcmV0dXJuIC1FSU5WQUw7CgojaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQoJaWYobGVuZ3RoPjE0ICYmIHN0cm5jbXAoImRlYnVnICIsIGJ1ZmZlcis4LCA2KT09MCkgewoJCWludCBkZWJ1ZyA9IEhPU1REQVRBKHNocG50KS0+ZGVidWc7CgoJCUhPU1REQVRBKHNocG50KS0+ZGVidWcgPSBzaW1wbGVfc3RydG91bChidWZmZXIrMTQsIE5VTEwsIDApOwoKCQlwcmludGsoS0VSTl9JTkZPICJhaGExNTJ4JWQ6IGRlYnVnZ2luZyBvcHRpb25zIHNldCB0byAweCUwNHggKHdlcmUgMHglMDR4KVxuIiwgSE9TVE5PLCBIT1NUREFUQShzaHBudCktPmRlYnVnLCBkZWJ1Zyk7Cgl9IGVsc2UKI2VuZGlmCiNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKCWlmKGxlbmd0aD4xMyAmJiBzdHJuY21wKCJyZXNldCIsIGJ1ZmZlcis4LCA1KT09MCkgewoJCWludCBpOwoKCQlIT1NUREFUQShzaHBudCktPnRvdGFsX2NvbW1hbmRzPTA7CgkJSE9TVERBVEEoc2hwbnQpLT5kaXNjb25uZWN0aW9ucz0wOwoJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X2FueV9hY3Rpb249MDsKCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9vbGRfY29tbWFuZD0wOwoJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X25ld19jb21tYW5kPTA7CgkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfZG9uZV9jb21tYW5kPTA7CgkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhfY2hlY2tfY29uZGl0aW9uPTA7CgkJZm9yIChpID0gaWRsZTsgaTxtYXhzdGF0ZTsgaSsrKSB7CgkJCUhPU1REQVRBKHNocG50KS0+Y291bnRbaV09MDsKCQkJSE9TVERBVEEoc2hwbnQpLT5jb3VudF90cmFuc1tpXT0wOwoJCQlIT1NUREFUQShzaHBudCktPnRpbWVbaV09MDsKCQl9CgoJCXByaW50ayhLRVJOX0lORk8gImFoYTE1MnglZDogc3RhdHMgcmVzZXRlZC5cbiIsIEhPU1ROTyk7CgoJfSBlbHNlCiNlbmRpZgoJewoJCXJldHVybiAtRUlOVkFMOwoJfQoKCglyZXR1cm4gbGVuZ3RoOwp9CgojdW5kZWYgU1BSSU5URgojZGVmaW5lIFNQUklOVEYoYXJncy4uLikgXAoJZG8geyBpZihwb3MgPCBidWZmZXIgKyBsZW5ndGgpIHBvcyArPSBzcHJpbnRmKHBvcywgIyMgYXJncyk7IH0gd2hpbGUoMCkKCnN0YXRpYyBpbnQgYWhhMTUyeF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LAoJCSAgICAgIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQp7CglpbnQgaTsKCWNoYXIgKnBvcyA9IGJ1ZmZlcjsKCVNjc2lfQ21uZCAqcHRyOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCB0aGlzbGVuZ3RoOwoKCURQUklOVEsoZGVidWdfcHJvY2luZm8sIAoJICAgICAgIEtFUk5fREVCVUcgImFoYTE1MnhfcHJvY19pbmZvOiBidWZmZXI9JXAgb2Zmc2V0PSVsZCBsZW5ndGg9JWQgaG9zdG5vPSVkIGlub3V0PSVkXG4iLAoJICAgICAgIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHNocG50LT5ob3N0X25vLCBpbm91dCk7CgoKCWlmIChpbm91dCkKCQlyZXR1cm4gYWhhMTUyeF9zZXRfaW5mbyhidWZmZXIsIGxlbmd0aCwgc2hwbnQpOwoKCVNQUklOVEYoQUhBMTUyWF9SRVZJRCAiXG4iKTsKCglTUFJJTlRGKCJpb3BvcnRzIDB4JTA0bHggdG8gMHglMDRseFxuIiwKCQlzaHBudC0+aW9fcG9ydCwgc2hwbnQtPmlvX3BvcnQgKyBzaHBudC0+bl9pb19wb3J0IC0gMSk7CglTUFJJTlRGKCJpbnRlcnJ1cHQgMHglMDJ4XG4iLCBzaHBudC0+aXJxKTsKCVNQUklOVEYoImRpc2Nvbm5lY3Rpb24vcmVjb25uZWN0aW9uICVzXG4iLAoJCVJFQ09OTkVDVCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwoJU1BSSU5URigicGFyaXR5IGNoZWNraW5nICVzXG4iLAoJCVBBUklUWSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwoJU1BSSU5URigic3luY2hyb25vdXMgdHJhbnNmZXJzICVzXG4iLAoJCVNZTkNIUk9OT1VTID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CglTUFJJTlRGKCIlZCBjb21tYW5kcyBjdXJyZW50bHkgcXVldWVkXG4iLCBIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKTsKCglpZihTWU5DSFJPTk9VUykgewoJCVNQUklOVEYoInN5bmNocm9ub3VzbHkgb3BlcmF0aW5nIHRhcmdldHMgKHRpY2s9NTAgbnMpOlxuIik7CgkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKCQkJaWYgKEhPU1REQVRBKHNocG50KS0+c3luY3JhdGVbaV0gJiAweDdmKQoJCQkJU1BSSU5URigidGFyZ2V0ICVkOiBwZXJpb2QgJWRULyVkbnM7IHJlcS9hY2sgb2Zmc2V0ICVkXG4iLAoJCQkJCWksCgkJCQkJKCgoSE9TVERBVEEoc2hwbnQpLT5zeW5jcmF0ZVtpXSAmIDB4NzApID4+IDQpICsgMiksCgkJCQkJKCgoSE9TVERBVEEoc2hwbnQpLT5zeW5jcmF0ZVtpXSAmIDB4NzApID4+IDQpICsgMikgKiA1MCwKCQkJCSAgICBIT1NUREFUQShzaHBudCktPnN5bmNyYXRlW2ldICYgMHgwZik7Cgl9CiNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCiNkZWZpbmUgUERFQlVHKGZsYWdzLHR4dCkgXAoJaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGZsYWdzKSBTUFJJTlRGKCIoJXMpICIsIHR4dCk7CgoJU1BSSU5URigiZW5hYmxlZCBkZWJ1Z2dpbmcgb3B0aW9uczogIik7CgoJUERFQlVHKGRlYnVnX3Byb2NpbmZvLCAicHJvY2luZm8iKTsKCVBERUJVRyhkZWJ1Z19xdWV1ZSwgInF1ZXVlIik7CglQREVCVUcoZGVidWdfaW50ciwgImludGVycnVwdCIpOwoJUERFQlVHKGRlYnVnX3NlbGVjdGlvbiwgInNlbGVjdGlvbiIpOwoJUERFQlVHKGRlYnVnX21zZ28sICJtZXNzYWdlIG91dCIpOwoJUERFQlVHKGRlYnVnX21zZ2ksICJtZXNzYWdlIGluIik7CglQREVCVUcoZGVidWdfc3RhdHVzLCAic3RhdHVzIik7CglQREVCVUcoZGVidWdfY21kLCAiY29tbWFuZCIpOwoJUERFQlVHKGRlYnVnX2RhdGFpLCAiZGF0YSBpbiIpOwoJUERFQlVHKGRlYnVnX2RhdGFvLCAiZGF0YSBvdXQiKTsKCVBERUJVRyhkZWJ1Z19laCwgImVoIik7CglQREVCVUcoZGVidWdfbG9ja3MsICJsb2NrcyIpOwoJUERFQlVHKGRlYnVnX3BoYXNlcywgInBoYXNlcyIpOwoKCVNQUklOVEYoIlxuIik7CiNlbmRpZgoKCVNQUklOVEYoIlxucXVldWUgc3RhdHVzOlxuIik7CglET19MT0NLKGZsYWdzKTsKCWlmIChJU1NVRV9TQykgewoJCVNQUklOVEYoIm5vdCB5ZXQgaXNzdWVkIGNvbW1hbmRzOlxuIik7CgkJZm9yIChwdHIgPSBJU1NVRV9TQzsgcHRyOyBwdHIgPSBTQ05FWFQocHRyKSkKCQkJcG9zICs9IGdldF9jb21tYW5kKHBvcywgcHRyKTsKCX0gZWxzZQoJCVNQUklOVEYoIm5vIG5vdCB5ZXQgaXNzdWVkIGNvbW1hbmRzXG4iKTsKCURPX1VOTE9DSyhmbGFncyk7CgoJaWYgKENVUlJFTlRfU0MpIHsKCQlTUFJJTlRGKCJjdXJyZW50IGNvbW1hbmQ6XG4iKTsKCQlwb3MgKz0gZ2V0X2NvbW1hbmQocG9zLCBDVVJSRU5UX1NDKTsKCX0gZWxzZQoJCVNQUklOVEYoIm5vIGN1cnJlbnQgY29tbWFuZFxuIik7CgoJaWYgKERJU0NPTk5FQ1RFRF9TQykgewoJCVNQUklOVEYoImRpc2Nvbm5lY3RlZCBjb21tYW5kczpcbiIpOwoJCWZvciAocHRyID0gRElTQ09OTkVDVEVEX1NDOyBwdHI7IHB0ciA9IFNDTkVYVChwdHIpKQoJCQlwb3MgKz0gZ2V0X2NvbW1hbmQocG9zLCBwdHIpOwoJfSBlbHNlCgkJU1BSSU5URigibm8gZGlzY29ubmVjdGVkIGNvbW1hbmRzXG4iKTsKCglwb3MgKz0gZ2V0X3BvcnRzKHNocG50LCBwb3MpOwoKI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQoJU1BSSU5URigic3RhdGlzdGljczpcbiIKCSAgICAgICAgInRvdGFsIGNvbW1hbmRzOiAgICAgICAgICAgICAgICVkXG4iCgkgICAgICAgICJkaXNjb25uZWN0aW9uczogICAgICAgICAgICAgICAlZFxuIgoJCSJidXNmcmVlIHdpdGggY2hlY2sgY29uZGl0aW9uOiAlZFxuIgoJCSJidXNmcmVlIHdpdGhvdXQgb2xkIGNvbW1hbmQ6ICAlZFxuIgoJCSJidXNmcmVlIHdpdGhvdXQgbmV3IGNvbW1hbmQ6ICAlZFxuIgoJCSJidXNmcmVlIHdpdGhvdXQgZG9uZSBjb21tYW5kOiAlZFxuIgoJCSJidXNmcmVlIHdpdGhvdXQgYW55IGFjdGlvbjogICAlZFxuIgoJCSJzdGF0ZSAgICAgICIKCQkidHJhbnNpdGlvbnMgICIKCQkiY291bnQgICAgICAgICIKCQkidGltZVxuIiwKCQlIT1NUREFUQShzaHBudCktPnRvdGFsX2NvbW1hbmRzLAoJCUhPU1REQVRBKHNocG50KS0+ZGlzY29ubmVjdGlvbnMsCgkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhfY2hlY2tfY29uZGl0aW9uLAoJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X29sZF9jb21tYW5kLAoJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X25ld19jb21tYW5kLAoJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X2RvbmVfY29tbWFuZCwKCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9hbnlfYWN0aW9uKTsKCWZvcihpPTA7IGk8bWF4c3RhdGU7IGkrKykgewoJCVNQUklOVEYoIiUtMTBzICUtMTJkICUtMTJkICUtMTJsZFxuIiwKCQkgICAgICAgIHN0YXRlc1tpXS5uYW1lLAoJCQlIT1NUREFUQShzaHBudCktPmNvdW50X3RyYW5zW2ldLAoJCQlIT1NUREFUQShzaHBudCktPmNvdW50W2ldLAoJCQlIT1NUREFUQShzaHBudCktPnRpbWVbaV0pOwoJfQojZW5kaWYKCglEUFJJTlRLKGRlYnVnX3Byb2NpbmZvLCBLRVJOX0RFQlVHICJhaGExNTJ4X3Byb2NfaW5mbzogcG9zPSVwXG4iLCBwb3MpOwoKCXRoaXNsZW5ndGggPSBwb3MgLSAoYnVmZmVyICsgb2Zmc2V0KTsKCURQUklOVEsoZGVidWdfcHJvY2luZm8sIEtFUk5fREVCVUcgImFoYTE1MnhfcHJvY19pbmZvOiBsZW5ndGg9JWQgdGhpc2xlbmd0aD0lZFxuIiwgbGVuZ3RoLCB0aGlzbGVuZ3RoKTsKCglpZih0aGlzbGVuZ3RoPDApIHsKCQlEUFJJTlRLKGRlYnVnX3Byb2NpbmZvLCBLRVJOX0RFQlVHICJhaGExNTJ4X3Byb2NfaW5mbzogb3V0cHV0IHRvbyBzaG9ydFxuIik7CgkJKnN0YXJ0ID0gTlVMTDsKCQlyZXR1cm4gMDsKCX0KCgl0aGlzbGVuZ3RoID0gdGhpc2xlbmd0aDxsZW5ndGggPyB0aGlzbGVuZ3RoIDogbGVuZ3RoOwoKCURQUklOVEsoZGVidWdfcHJvY2luZm8sIEtFUk5fREVCVUcgImFoYTE1MnhfcHJvY19pbmZvOiByZXR1cm4gJWRcbiIsIHRoaXNsZW5ndGgpOwoKCSpzdGFydCA9IGJ1ZmZlciArIG9mZnNldDsKCXJldHVybiB0aGlzbGVuZ3RoIDwgbGVuZ3RoID8gdGhpc2xlbmd0aCA6IGxlbmd0aDsKfQoKc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgYWhhMTUyeF9kcml2ZXJfdGVtcGxhdGUgPSB7CgkubW9kdWxlCQkJCT0gVEhJU19NT0RVTEUsCgkubmFtZQkJCQk9IEFIQTE1MlhfUkVWSUQsCgkucHJvY19uYW1lCQkJPSAiYWhhMTUyeCIsCgkucHJvY19pbmZvCQkJPSBhaGExNTJ4X3Byb2NfaW5mbywKCS5xdWV1ZWNvbW1hbmQJCQk9IGFoYTE1MnhfcXVldWUsCgkuZWhfYWJvcnRfaGFuZGxlcgkJPSBhaGExNTJ4X2Fib3J0LAoJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gYWhhMTUyeF9kZXZpY2VfcmVzZXQsCgkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gYWhhMTUyeF9idXNfcmVzZXQsCgkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCQk9IGFoYTE1MnhfaG9zdF9yZXNldCwKCS5iaW9zX3BhcmFtCQkJPSBhaGExNTJ4X2Jpb3NwYXJhbSwKCS5jYW5fcXVldWUJCQk9IDEsCgkudGhpc19pZAkJCT0gNywKCS5zZ190YWJsZXNpemUJCQk9IFNHX0FMTCwKCS5jbWRfcGVyX2x1bgkJCT0gMSwKCS51c2VfY2x1c3RlcmluZwkJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAp9OwoKI2lmICFkZWZpbmVkKFBDTUNJQSkKc3RhdGljIGludCBzZXR1cF9jb3VudDsKc3RhdGljIHN0cnVjdCBhaGExNTJ4X3NldHVwIHNldHVwWzJdOwoKLyogcG9zc2libGUgaS9vIGFkZHJlc3NlcyBmb3IgdGhlIEFJQy02MjYwOyBkZWZhdWx0IGZpcnN0ICovCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tdID0geyAweDM0MCwgMHgxNDAgfTsKCiNpZiAhZGVmaW5lZChTS0lQX0JJT1NURVNUKQovKiBwb3NzaWJsZSBsb2NhdGlvbnMgZm9yIHRoZSBBZGFwdGVjIEJJT1M7IGRlZmF1bHRzIGZpcnN0ICovCnN0YXRpYyB1bnNpZ25lZCBpbnQgYWRkcmVzc2VzW10gPQp7CgkweGRjMDAwLAkJLyogZGVmYXVsdCBmaXJzdCAqLwoJMHhjODAwMCwKCTB4Y2MwMDAsCgkweGQwMDAwLAoJMHhkNDAwMCwKCTB4ZDgwMDAsCgkweGUwMDAwLAoJMHhlYjgwMCwJCS8qIFZUZWNoIFBsYXRpbnVtIFNNUCAqLwoJMHhmMDAwMCwKfTsKCi8qIHNpZ25hdHVyZXMgZm9yIHZhcmlvdXMgQUlDLTZbMjNdNjAgYmFzZWQgY29udHJvbGxlcnMuCiAgIFRoZSBwb2ludCBpbiBkZXRlY3Rpbmcgc2lnbmF0dXJlcyBpcyB0byBhdm9pZCB1c2VsZXNzIGFuZCBtYXliZQogICBoYXJtZnVsIHByb2JlcyBvbiBwb3J0cy4gSSdtIG5vdCBzdXJlIHRoYXQgYWxsIGxpc3RlZCBib2FyZHMgcGFzcwogICBhdXRvLWNvbmZpZ3VyYXRpb24uIEZvciB0aG9zZSB3aGljaCBmYWlsIHRoZSBCSU9TIHNpZ25hdHVyZSBpcwogICBvYnNvbGV0ZSwgYmVjYXVzZSB1c2VyIGludGVydmVudGlvbiB0byBzdXBwbHkgdGhlIGNvbmZpZ3VyYXRpb24gaXMKICAgbmVlZGVkIGFueXdheS4gIE1heSBiZSBhbiBpbmZvcm1hdGlvbiB3aGV0aGVyIG9yIG5vdCB0aGUgQklPUyBzdXBwb3J0cwogICBleHRlbmRlZCB0cmFuc2xhdGlvbiBjb3VsZCBiZSBhbHNvIHVzZWZ1bCBoZXJlLiAqLwpzdGF0aWMgc3RydWN0IHNpZ25hdHVyZSB7Cgl1bnNpZ25lZCBjaGFyICpzaWduYXR1cmU7CglpbnQgc2lnX29mZnNldDsKCWludCBzaWdfbGVuZ3RoOwp9IHNpZ25hdHVyZXNbXSA9CnsKCXsgIkFkYXB0ZWMgQUhBLTE1MjAgQklPUyIsCTB4MTAyZSwgMjEgfSwKCQkvKiBBZGFwdGVjIDE1MnggKi8KCXsgIkFkYXB0ZWMgQUhBLTE1MjBCIiwJCTB4MDAwYiwgMTcgfSwKCQkvKiBBZGFwdGVjIDE1MnggcmV2IEIgKi8KCXsgIkFkYXB0ZWMgQUhBLTE1MjBCIiwJCTB4MDAyNiwgMTcgfSwKCQkvKiBJb21lZ2EgSmF6IEpldCBJU0EgKEFJQzYzNzBRKSAqLwoJeyAiQWRhcHRlYyBBU1ctQjYyNiBCSU9TIiwJMHgxMDI5LCAyMSB9LAoJCS8qIG9uLWJvYXJkIGNvbnRyb2xsZXIgKi8KCXsgIkFkYXB0ZWMgQklPUzogQVNXLUI2MjYiLAkweDAwMGYsIDIyIH0sCgkJLyogb24tYm9hcmQgY29udHJvbGxlciAqLwoJeyAiQWRhcHRlYyBBU1ctQjYyNiBTMiIsCTB4MmU2YywgMTkgfSwKCQkvKiBvbi1ib2FyZCBjb250cm9sbGVyICovCgl7ICJBZGFwdGVjIEJJT1M6QUlDLTYzNjAiLAkweDAwMGMsIDIxIH0sCgkJLyogb24tYm9hcmQgY29udHJvbGxlciAqLwoJeyAiU2NzaVBybyBTUC0zNjAgQklPUyIsCTB4Mjg3MywgMTkgfSwKCQkvKiBTY3NpUHJvLUNvbnRyb2xsZXIgICovCgl7ICJHQS00MDAgTE9DQUwgQlVTIFNDU0kgQklPUyIsIDB4MTAyZSwgMjYgfSwKCQkvKiBHaWdhYnl0ZSBMb2NhbC1CdXMtU0NTSSAqLwoJeyAiQWRhcHRlYyBCSU9TOkFWQS0yODJYIiwJMHgwMDBjLCAyMSB9LAoJCS8qIEFkYXB0ZWMgMjgyeCAqLwoJeyAiQWRhcHRlYyBJQk0gRG9jayBJSSBTQ1NJIiwgICAweDJlZGQsIDI0IH0sCgkJLyogSUJNIFRoaW5rcGFkIERvY2sgSUkgKi8KCXsgIkFkYXB0ZWMgQklPUzpBSEEtMTUzMlAiLCAgICAgMHgwMDFjLCAyMiB9LAoJCS8qIElCTSBUaGlua3BhZCBEb2NrIElJIFNDU0kgKi8KCXsgIkRUQzM1MjBBIEhvc3QgQWRhcHRlciBCSU9TIiwgMHgzMThhLCAyNiB9LAoJCS8qIERUQyAzNTIwQSBJU0EgU0NTSSAqLwp9OwojZW5kaWYgLyogIVNLSVBfQklPU1RFU1QgKi8KCi8qCiAqIFRlc3QsIGlmIHBvcnRfYmFzZSBpcyB2YWxpZC4KICoKICovCnN0YXRpYyBpbnQgYWhhMTUyeF9wb3J0dGVzdChpbnQgaW9fcG9ydCkKewoJaW50IGk7CgoJU0VUUE9SVChpb19wb3J0ICsgT19ETUFDTlRSTDEsIDApOwkvKiByZXNldCBzdGFjayBwb2ludGVyICovCglmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKCQlTRVRQT1JUKGlvX3BvcnQgKyBPX1NUQUNLLCBpKTsKCglTRVRQT1JUKGlvX3BvcnQgKyBPX0RNQUNOVFJMMSwgMCk7CS8qIHJlc2V0IHN0YWNrIHBvaW50ZXIgKi8KCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBHRVRQT1JUKGlvX3BvcnQgKyBPX1NUQUNLKSA9PSBpOyBpKyspCgkJOwoKCXJldHVybiAoaSA9PSAxNik7Cn0KCnN0YXRpYyBpbnQgdGMxNTUwX3BvcnR0ZXN0KGludCBpb19wb3J0KQp7CglpbnQgaTsKCglTRVRQT1JUKGlvX3BvcnQgKyBPX1RDX0RNQUNOVFJMMSwgMCk7CS8qIHJlc2V0IHN0YWNrIHBvaW50ZXIgKi8KCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQoJCVNFVFBPUlQoaW9fcG9ydCArIE9fU1RBQ0ssIGkpOwoKCVNFVFBPUlQoaW9fcG9ydCArIE9fVENfRE1BQ05UUkwxLCAwKTsJLyogcmVzZXQgc3RhY2sgcG9pbnRlciAqLwoJZm9yIChpID0gMDsgaSA8IDE2ICYmIEdFVFBPUlQoaW9fcG9ydCArIE9fVENfU1RBQ0spID09IGk7IGkrKykKCQk7CgoJcmV0dXJuIChpID09IDE2KTsKfQoKCnN0YXRpYyBpbnQgY2hlY2tzZXR1cChzdHJ1Y3QgYWhhMTUyeF9zZXR1cCAqc2V0dXApCnsKCWludCBpOwoJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydHMpICYmIChzZXR1cC0+aW9fcG9ydCAhPSBwb3J0c1tpXSk7IGkrKykKCQk7CgoJaWYgKGkgPT0gQVJSQVlfU0laRShwb3J0cykpCgkJcmV0dXJuIDA7CgoJaWYgKCByZXF1ZXN0X3JlZ2lvbihzZXR1cC0+aW9fcG9ydCwgSU9fUkFOR0UsICJhaGExNTJ4Iik9PTAgKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBpbyBwb3J0IDB4JXggYnVzeS5cbiIsIHNldHVwLT5pb19wb3J0KTsKCQlyZXR1cm4gMDsKCX0KCglpZiggYWhhMTUyeF9wb3J0dGVzdChzZXR1cC0+aW9fcG9ydCkgKSB7CgkJc2V0dXAtPnRjMTU1MD0wOwoJfSBlbHNlIGlmKCB0YzE1NTBfcG9ydHRlc3Qoc2V0dXAtPmlvX3BvcnQpICkgewoJCXNldHVwLT50YzE1NTA9MTsKCX0gZWxzZSB7CgkJcmVsZWFzZV9yZWdpb24oc2V0dXAtPmlvX3BvcnQsIElPX1JBTkdFKTsKCQlyZXR1cm4gMDsKCX0KCglyZWxlYXNlX3JlZ2lvbihzZXR1cC0+aW9fcG9ydCwgSU9fUkFOR0UpOwoKCWlmICgoc2V0dXAtPmlycSA8IElSUV9NSU4pIHx8IChzZXR1cC0+aXJxID4gSVJRX01BWCkpCgkJcmV0dXJuIDA7CgoJaWYgKChzZXR1cC0+c2NzaWlkIDwgMCkgfHwgKHNldHVwLT5zY3NpaWQgPiA3KSkKCQlyZXR1cm4gMDsKCglpZiAoKHNldHVwLT5yZWNvbm5lY3QgPCAwKSB8fCAoc2V0dXAtPnJlY29ubmVjdCA+IDEpKQoJCXJldHVybiAwOwoKCWlmICgoc2V0dXAtPnBhcml0eSA8IDApIHx8IChzZXR1cC0+cGFyaXR5ID4gMSkpCgkJcmV0dXJuIDA7CgoJaWYgKChzZXR1cC0+c3luY2hyb25vdXMgPCAwKSB8fCAoc2V0dXAtPnN5bmNocm9ub3VzID4gMSkpCgkJcmV0dXJuIDA7CgoJaWYgKChzZXR1cC0+ZXh0X3RyYW5zIDwgMCkgfHwgKHNldHVwLT5leHRfdHJhbnMgPiAxKSkKCQlyZXR1cm4gMDsKCgoJcmV0dXJuIDE7Cn0KCgpzdGF0aWMgaW50IF9faW5pdCBhaGExNTJ4X2luaXQodm9pZCkKewoJaW50IGksIGosIG9rOwojaWYgZGVmaW5lZChBVVRPQ09ORikKCWFoYTE1MnhfY29uZmlnIGNvbmY7CiNlbmRpZgojaWZkZWYgX19JU0FQTlBfXwoJc3RydWN0IHBucF9kZXYgKmRldj1OVUxMLCAqcG5wZGV2WzJdID0ge05VTEwsIE5VTEx9OwojZW5kaWYKCglpZiAoIHNldHVwX2NvdW50ICkgewoJCXByaW50ayhLRVJOX0lORk8gImFoYTE1Mng6IHByb2Nlc3NpbmcgY29tbWFuZGxpbmU6ICIpOwoKCQlmb3IgKGkgPSAwOyBpPHNldHVwX2NvdW50OyBpKyspIHsKCQkJaWYgKCFjaGVja3NldHVwKCZzZXR1cFtpXSkpIHsKCQkJCXByaW50ayhLRVJOX0VSUiAiXG5haGExNTJ4OiAlc1xuIiwgc2V0dXBbaV0uY29uZik7CgkJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGludmFsaWQgbGluZVxuIik7CgkJCX0KCQl9CgkJcHJpbnRrKCJva1xuIik7Cgl9CgojaWYgZGVmaW5lZChTRVRVUDApCglpZiAoc2V0dXBfY291bnQgPCBBUlJBWV9TSVpFKHNldHVwKSkgewoJCXN0cnVjdCBhaGExNTJ4X3NldHVwIG92ZXJyaWRlID0gU0VUVVAwOwoKCQlpZiAoc2V0dXBfY291bnQgPT0gMCB8fCAob3ZlcnJpZGUuaW9fcG9ydCAhPSBzZXR1cFswXS5pb19wb3J0KSkgewoJCQlpZiAoIWNoZWNrc2V0dXAoJm92ZXJyaWRlKSkgewoJCQkJcHJpbnRrKEtFUk5fRVJSICJcbmFoYTE1Mng6IGludmFsaWQgb3ZlcnJpZGUgU0VUVVAwPXsweCV4LCVkLCVkLCVkLCVkLCVkLCVkLCVkfVxuIiwKCQkJCSAgICAgICBvdmVycmlkZS5pb19wb3J0LAoJCQkJICAgICAgIG92ZXJyaWRlLmlycSwKCQkJCSAgICAgICBvdmVycmlkZS5zY3NpaWQsCgkJCQkgICAgICAgb3ZlcnJpZGUucmVjb25uZWN0LAoJCQkJICAgICAgIG92ZXJyaWRlLnBhcml0eSwKCQkJCSAgICAgICBvdmVycmlkZS5zeW5jaHJvbm91cywKCQkJCSAgICAgICBvdmVycmlkZS5kZWxheSwKCQkJCSAgICAgICBvdmVycmlkZS5leHRfdHJhbnMpOwoJCQl9IGVsc2UKCQkJCXNldHVwW3NldHVwX2NvdW50KytdID0gb3ZlcnJpZGU7CgkJfQoJfQojZW5kaWYKCiNpZiBkZWZpbmVkKFNFVFVQMSkKCWlmIChzZXR1cF9jb3VudCA8IEFSUkFZX1NJWkUoc2V0dXApKSB7CgkJc3RydWN0IGFoYTE1Mnhfc2V0dXAgb3ZlcnJpZGUgPSBTRVRVUDE7CgoJCWlmIChzZXR1cF9jb3VudCA9PSAwIHx8IChvdmVycmlkZS5pb19wb3J0ICE9IHNldHVwWzBdLmlvX3BvcnQpKSB7CgkJCWlmICghY2hlY2tzZXR1cCgmb3ZlcnJpZGUpKSB7CgkJCQlwcmludGsoS0VSTl9FUlIgIlxuYWhhMTUyeDogaW52YWxpZCBvdmVycmlkZSBTRVRVUDE9ezB4JXgsJWQsJWQsJWQsJWQsJWQsJWQsJWR9XG4iLAoJCQkJICAgICAgIG92ZXJyaWRlLmlvX3BvcnQsCgkJCQkgICAgICAgb3ZlcnJpZGUuaXJxLAoJCQkJICAgICAgIG92ZXJyaWRlLnNjc2lpZCwKCQkJCSAgICAgICBvdmVycmlkZS5yZWNvbm5lY3QsCgkJCQkgICAgICAgb3ZlcnJpZGUucGFyaXR5LAoJCQkJICAgICAgIG92ZXJyaWRlLnN5bmNocm9ub3VzLAoJCQkJICAgICAgIG92ZXJyaWRlLmRlbGF5LAoJCQkJICAgICAgIG92ZXJyaWRlLmV4dF90cmFucyk7CgkJCX0gZWxzZQoJCQkJc2V0dXBbc2V0dXBfY291bnQrK10gPSBvdmVycmlkZTsKCQl9Cgl9CiNlbmRpZgoKI2lmIGRlZmluZWQoTU9EVUxFKQoJaWYgKHNldHVwX2NvdW50PEFSUkFZX1NJWkUoc2V0dXApICYmIChhaGExNTJ4WzBdIT0wIHx8IGlvWzBdIT0wIHx8IGlycVswXSE9MCkpIHsKCQlpZihhaGExNTJ4WzBdIT0wKSB7CgkJCXNldHVwW3NldHVwX2NvdW50XS5jb25mICAgICAgICA9ICIiOwoJCQlzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCAgICAgPSBhaGExNTJ4WzBdOwoJCQlzZXR1cFtzZXR1cF9jb3VudF0uaXJxICAgICAgICAgPSBhaGExNTJ4WzFdOwoJCQlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkICAgICAgPSBhaGExNTJ4WzJdOwoJCQlzZXR1cFtzZXR1cF9jb3VudF0ucmVjb25uZWN0ICAgPSBhaGExNTJ4WzNdOwoJCQlzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5ICAgICAgPSBhaGExNTJ4WzRdOwoJCQlzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMgPSBhaGExNTJ4WzVdOwoJCQlzZXR1cFtzZXR1cF9jb3VudF0uZGVsYXkgICAgICAgPSBhaGExNTJ4WzZdOwoJCQlzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zICAgPSBhaGExNTJ4WzddOwojaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQoJCQlzZXR1cFtzZXR1cF9jb3VudF0uZGVidWcgICAgICAgPSBhaGExNTJ4WzhdOwojZW5kaWYKCSAgCX0gZWxzZSBpZihpb1swXSE9MCB8fCBpcnFbMF0hPTApIHsKCQkJaWYoaW9bMF0hPTApICBzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCA9IGlvWzBdOwoJCQlpZihpcnFbMF0hPTApIHNldHVwW3NldHVwX2NvdW50XS5pcnEgICAgID0gaXJxWzBdOwoKCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQgICAgICA9IHNjc2lpZFswXTsKCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5yZWNvbm5lY3QgICA9IHJlY29ubmVjdFswXTsKCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgICAgICA9IHBhcml0eVswXTsKCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cyA9IHN5bmNbMF07CgkgICAgCQlzZXR1cFtzZXR1cF9jb3VudF0uZGVsYXkgICAgICAgPSBkZWxheVswXTsKCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgICA9IGV4dHRyYW5zWzBdOwojaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQoJCQlzZXR1cFtzZXR1cF9jb3VudF0uZGVidWcgICAgICAgPSBkZWJ1Z1swXTsKI2VuZGlmCgkJfQoKICAgICAgICAgIAlpZiAoY2hlY2tzZXR1cCgmc2V0dXBbc2V0dXBfY291bnRdKSkKCQkJc2V0dXBfY291bnQrKzsKCQllbHNlCgkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogaW52YWxpZCBtb2R1bGUgcGFyYW1zIGlvPTB4JXgsIGlycT0lZCxzY3NpaWQ9JWQscmVjb25uZWN0PSVkLHBhcml0eT0lZCxzeW5jPSVkLGRlbGF5PSVkLGV4dHRyYW5zPSVkXG4iLAoJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQsCgkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uaXJxLAoJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnNjc2lpZCwKCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5yZWNvbm5lY3QsCgkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5LAoJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzLAoJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5LAoJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLmV4dF90cmFucyk7Cgl9CgoJaWYgKHNldHVwX2NvdW50PEFSUkFZX1NJWkUoc2V0dXApICYmIChhaGExNTJ4MVswXSE9MCB8fCBpb1sxXSE9MCB8fCBpcnFbMV0hPTApKSB7CgkJaWYoYWhhMTUyeDFbMF0hPTApIHsKCQkJc2V0dXBbc2V0dXBfY291bnRdLmNvbmYgICAgICAgID0gIiI7CgkJCXNldHVwW3NldHVwX2NvdW50XS5pb19wb3J0ICAgICA9IGFoYTE1MngxWzBdOwoJCQlzZXR1cFtzZXR1cF9jb3VudF0uaXJxICAgICAgICAgPSBhaGExNTJ4MVsxXTsKCQkJc2V0dXBbc2V0dXBfY291bnRdLnNjc2lpZCAgICAgID0gYWhhMTUyeDFbMl07CgkJCXNldHVwW3NldHVwX2NvdW50XS5yZWNvbm5lY3QgICA9IGFoYTE1MngxWzNdOwoJCQlzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5ICAgICAgPSBhaGExNTJ4MVs0XTsKCQkJc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzID0gYWhhMTUyeDFbNV07CgkJCXNldHVwW3NldHVwX2NvdW50XS5kZWxheSAgICAgICA9IGFoYTE1MngxWzZdOwoJCQlzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zICAgPSBhaGExNTJ4MVs3XTsKI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlYnVnICAgICAgID0gYWhhMTUyeDFbOF07CiNlbmRpZgoJICAJfSBlbHNlIGlmKGlvWzFdIT0wIHx8IGlycVsxXSE9MCkgewoJCQlpZihpb1sxXSE9MCkgIHNldHVwW3NldHVwX2NvdW50XS5pb19wb3J0ID0gaW9bMV07CgkJCWlmKGlycVsxXSE9MCkgc2V0dXBbc2V0dXBfY291bnRdLmlycSAgICAgPSBpcnFbMV07CgoJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLnNjc2lpZCAgICAgID0gc2NzaWlkWzFdOwoJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gcmVjb25uZWN0WzFdOwoJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLnBhcml0eSAgICAgID0gcGFyaXR5WzFdOwoJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzID0gc3luY1sxXTsKCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5kZWxheSAgICAgICA9IGRlbGF5WzFdOwoJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLmV4dF90cmFucyAgID0gZXh0dHJhbnNbMV07CiNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCgkJCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyAgICAgICA9IGRlYnVnWzFdOwojZW5kaWYKCQl9CgkJaWYgKGNoZWNrc2V0dXAoJnNldHVwW3NldHVwX2NvdW50XSkpCgkJCXNldHVwX2NvdW50Kys7CgkJZWxzZQoJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGludmFsaWQgbW9kdWxlIHBhcmFtcyBpbz0weCV4LCBpcnE9JWQsc2NzaWlkPSVkLHJlY29ubmVjdD0lZCxwYXJpdHk9JWQsc3luYz0lZCxkZWxheT0lZCxleHR0cmFucz0lZFxuIiwKCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5pb19wb3J0LAoJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLmlycSwKCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQsCgkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0ucmVjb25uZWN0LAoJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnBhcml0eSwKCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cywKCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5kZWxheSwKCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMpOwoJfQojZW5kaWYKCiNpZmRlZiBfX0lTQVBOUF9fCglmb3IoaT0wOyBzZXR1cF9jb3VudDxBUlJBWV9TSVpFKHNldHVwKSAmJiBpZF90YWJsZVtpXS52ZW5kb3I7IGkrKykgewoJCXdoaWxlICggc2V0dXBfY291bnQ8QVJSQVlfU0laRShzZXR1cCkgJiYKCQkJKGRldj1wbnBfZmluZF9kZXYoTlVMTCwgaWRfdGFibGVbaV0udmVuZG9yLCBpZF90YWJsZVtpXS5mdW5jdGlvbiwgZGV2KSkgKSB7CgkJCWlmIChwbnBfZGV2aWNlX2F0dGFjaChkZXYpIDwgMCkKCQkJCWNvbnRpbnVlOwoKCQkJaWYgKHBucF9hY3RpdmF0ZV9kZXYoZGV2KSA8IDApIHsKCQkJCXBucF9kZXZpY2VfZGV0YWNoKGRldik7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKCFwbnBfcG9ydF92YWxpZChkZXYsIDApKSB7CgkJCQlwbnBfZGV2aWNlX2RldGFjaChkZXYpOwoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmIChzZXR1cF9jb3VudD09MSAmJiBwbnBfcG9ydF9zdGFydChkZXYsIDApPT1zZXR1cFswXS5pb19wb3J0KSB7CgkJCQlwbnBfZGV2aWNlX2RldGFjaChkZXYpOwoJCQkJY29udGludWU7CgkJCX0KCgkJCXNldHVwW3NldHVwX2NvdW50XS5pb19wb3J0ICAgICA9IHBucF9wb3J0X3N0YXJ0KGRldiwgMCk7CgkJCXNldHVwW3NldHVwX2NvdW50XS5pcnEgICAgICAgICA9IHBucF9pcnEoZGV2LCAwKTsKCQkJc2V0dXBbc2V0dXBfY291bnRdLnNjc2lpZCAgICAgID0gNzsKCQkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gMTsKCQkJc2V0dXBbc2V0dXBfY291bnRdLnBhcml0eSAgICAgID0gMTsKCQkJc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzID0gMTsKCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ICAgICAgID0gREVMQVlfREVGQVVMVDsKCQkJc2V0dXBbc2V0dXBfY291bnRdLmV4dF90cmFucyAgID0gMDsKI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlYnVnICAgICAgID0gREVCVUdfREVGQVVMVDsKI2VuZGlmCiNpZiBkZWZpbmVkKF9fSVNBUE5QX18pCgkJCXBucGRldltzZXR1cF9jb3VudF0gICAgICAgICAgICA9IGRldjsKI2VuZGlmCgkJCXByaW50ayAoS0VSTl9JTkZPCgkJCQkiYWhhMTUyeDogZm91bmQgSVNBUG5QIGFkYXB0ZXIgYXQgaW89MHglMDN4LCBpcnE9JWRcbiIsCgkJCQlzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCwgc2V0dXBbc2V0dXBfY291bnRdLmlycSk7CgkJCXNldHVwX2NvdW50Kys7CgkJfQoJfQojZW5kaWYKCiNpZiBkZWZpbmVkKEFVVE9DT05GKQoJaWYgKHNldHVwX2NvdW50PEFSUkFZX1NJWkUoc2V0dXApKSB7CiNpZiAhZGVmaW5lZChTS0lQX0JJT1NURVNUKQoJCW9rID0gMDsKCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZGRyZXNzZXMpICYmICFvazsgaSsrKSB7CgkJCXZvaWQgX19pb21lbSAqcCA9IGlvcmVtYXAoYWRkcmVzc2VzW2ldLCAweDQwMDApOwoJCQlpZiAoIXApCgkJCQljb250aW51ZTsKCQkJZm9yIChqID0gMDsgajxBUlJBWV9TSVpFKHNpZ25hdHVyZXMpICYmICFvazsgaisrKQoJCQkJb2sgPSBjaGVja19zaWduYXR1cmUocCArIHNpZ25hdHVyZXNbal0uc2lnX29mZnNldCwKCQkJCQkJCQlzaWduYXR1cmVzW2pdLnNpZ25hdHVyZSwgc2lnbmF0dXJlc1tqXS5zaWdfbGVuZ3RoKTsKCQkJaW91bm1hcChwKTsKCQl9CgkJaWYgKCFvayAmJiBzZXR1cF9jb3VudCA9PSAwKQoJCQlyZXR1cm4gMDsKCgkJcHJpbnRrKEtFUk5fSU5GTyAiYWhhMTUyeDogQklPUyB0ZXN0OiBwYXNzZWQsICIpOwojZWxzZQoJCXByaW50ayhLRVJOX0lORk8gImFoYTE1Mng6ICIpOwojZW5kaWYJCQkJLyogIVNLSVBfQklPU1RFU1QgKi8KCgkJb2sgPSAwOwoJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvcnRzKSAmJiBzZXR1cF9jb3VudCA8IDI7IGkrKykgewoJCQlpZiAoKHNldHVwX2NvdW50ID09IDEpICYmIChzZXR1cFswXS5pb19wb3J0ID09IHBvcnRzW2ldKSkKCQkJCWNvbnRpbnVlOwoKCQkJaWYgKCByZXF1ZXN0X3JlZ2lvbihwb3J0c1tpXSwgSU9fUkFOR0UsICJhaGExNTJ4Iik9PTAgKSB7CgkJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGlvIHBvcnQgMHgleCBidXN5LlxuIiwgcG9ydHNbaV0pOwoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmIChhaGExNTJ4X3BvcnR0ZXN0KHBvcnRzW2ldKSkgewoJCQkJc2V0dXBbc2V0dXBfY291bnRdLnRjMTU1MCAgPSAwOwoKCQkJCWNvbmYuY2ZfcG9ydCA9CgkJCQkgICAgKEdFVFBPUlQocG9ydHNbaV0gKyBPX1BPUlRBKSA8PCA4KSArIEdFVFBPUlQocG9ydHNbaV0gKyBPX1BPUlRCKTsKCQkJfSBlbHNlIGlmICh0YzE1NTBfcG9ydHRlc3QocG9ydHNbaV0pKSB7CgkJCQlzZXR1cFtzZXR1cF9jb3VudF0udGMxNTUwICA9IDE7CgoJCQkJY29uZi5jZl9wb3J0ID0KCQkJCSAgICAoR0VUUE9SVChwb3J0c1tpXSArIE9fVENfUE9SVEEpIDw8IDgpICsgR0VUUE9SVChwb3J0c1tpXSArIE9fVENfUE9SVEIpOwoJCQl9IGVsc2UgewoJCQkJcmVsZWFzZV9yZWdpb24ocG9ydHNbaV0sIElPX1JBTkdFKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlyZWxlYXNlX3JlZ2lvbihwb3J0c1tpXSwgSU9fUkFOR0UpOwoKCQkJb2srKzsKCQkJc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQgPSBwb3J0c1tpXTsKCQkJc2V0dXBbc2V0dXBfY291bnRdLmlycSA9IElSUV9NSU4gKyBjb25mLmNmX2lycTsKCQkJc2V0dXBbc2V0dXBfY291bnRdLnNjc2lpZCA9IGNvbmYuY2ZfaWQ7CgkJCXNldHVwW3NldHVwX2NvdW50XS5yZWNvbm5lY3QgPSBjb25mLmNmX3RhcmRpc2M7CgkJCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgPSAhY29uZi5jZl9wYXJpdHk7CgkJCXNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cyA9IGNvbmYuY2Zfc3luY25lZzsKCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ID0gREVMQVlfREVGQVVMVDsKCQkJc2V0dXBbc2V0dXBfY291bnRdLmV4dF90cmFucyA9IDA7CiNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCgkJCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyA9IERFQlVHX0RFRkFVTFQ7CiNlbmRpZgoJCQlzZXR1cF9jb3VudCsrOwoKCQl9CgoJCWlmIChvaykKCQkJcHJpbnRrKCJhdXRvIGNvbmZpZ3VyYXRpb246IG9rLCAiKTsKCX0KI2VuZGlmCgoJcHJpbnRrKCIlZCBjb250cm9sbGVyKHMpIGNvbmZpZ3VyZWRcbiIsIHNldHVwX2NvdW50KTsKCglmb3IgKGk9MDsgaTxzZXR1cF9jb3VudDsgaSsrKSB7CgkJaWYgKCByZXF1ZXN0X3JlZ2lvbihzZXR1cFtpXS5pb19wb3J0LCBJT19SQU5HRSwgImFoYTE1MngiKSApIHsKCQkJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBhaGExNTJ4X3Byb2JlX29uZSgmc2V0dXBbaV0pOwoKCQkJaWYoICFzaHBudCApIHsKCQkJCXJlbGVhc2VfcmVnaW9uKHNldHVwW2ldLmlvX3BvcnQsIElPX1JBTkdFKTsKI2lmIGRlZmluZWQoX19JU0FQTlBfXykKCQkJfSBlbHNlIGlmKCBwbnBkZXZbaV0gKSB7CgkJCQlIT1NUREFUQShzaHBudCktPnBucGRldj1wbnBkZXZbaV07CgkJCQlwbnBkZXZbaV09TlVMTDsKI2VuZGlmCgkJCX0KCQl9IGVsc2UgewoJCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGlvIHBvcnQgMHgleCBidXN5LlxuIiwgc2V0dXBbaV0uaW9fcG9ydCk7CgkJfQoKI2lmIGRlZmluZWQoX19JU0FQTlBfXykKCQlpZiggcG5wZGV2W2ldICkKCQkJcG5wX2RldmljZV9kZXRhY2gocG5wZGV2W2ldKTsKI2VuZGlmCgl9CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBhaGExNTJ4X2V4aXQodm9pZCkKewoJc3RydWN0IGFoYTE1MnhfaG9zdGRhdGEgKmhkOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoaGQsICZhaGExNTJ4X2hvc3RfbGlzdCwgaG9zdF9saXN0KSB7CgkJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjb250YWluZXJfb2YoKHZvaWQgKiloZCwgc3RydWN0IFNjc2lfSG9zdCwgaG9zdGRhdGEpOwoKCQlhaGExNTJ4X3JlbGVhc2Uoc2hvc3QpOwoJfQp9Cgptb2R1bGVfaW5pdChhaGExNTJ4X2luaXQpOwptb2R1bGVfZXhpdChhaGExNTJ4X2V4aXQpOwoKI2lmICFkZWZpbmVkKE1PRFVMRSkKc3RhdGljIGludCBfX2luaXQgYWhhMTUyeF9zZXR1cChjaGFyICpzdHIpCnsKI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKCWludCBpbnRzWzExXTsKI2Vsc2UKCWludCBpbnRzWzEwXTsKI2VuZGlmCglnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwoKCWlmKHNldHVwX2NvdW50Pj1BUlJBWV9TSVpFKHNldHVwKSkgewoJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogeW91IGNhbiBvbmx5IGNvbmZpZ3VyZSB1cCB0byB0d28gY29udHJvbGxlcnNcbiIpOwoJCXJldHVybiAxOwoJfQoKCXNldHVwW3NldHVwX2NvdW50XS5jb25mICAgICAgICA9IHN0cjsKCXNldHVwW3NldHVwX2NvdW50XS5pb19wb3J0ICAgICA9IGludHNbMF0gPj0gMSA/IGludHNbMV0gOiAweDM0MDsKCXNldHVwW3NldHVwX2NvdW50XS5pcnEgICAgICAgICA9IGludHNbMF0gPj0gMiA/IGludHNbMl0gOiAxMTsKCXNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQgICAgICA9IGludHNbMF0gPj0gMyA/IGludHNbM10gOiA3OwoJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gaW50c1swXSA+PSA0ID8gaW50c1s0XSA6IDE7CglzZXR1cFtzZXR1cF9jb3VudF0ucGFyaXR5ICAgICAgPSBpbnRzWzBdID49IDUgPyBpbnRzWzVdIDogMTsKCXNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cyA9IGludHNbMF0gPj0gNiA/IGludHNbNl0gOiAxOwoJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ICAgICAgID0gaW50c1swXSA+PSA3ID8gaW50c1s3XSA6IERFTEFZX0RFRkFVTFQ7CglzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zICAgPSBpbnRzWzBdID49IDggPyBpbnRzWzhdIDogMDsKI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyAgICAgICA9IGludHNbMF0gPj0gOSA/IGludHNbOV0gOiBERUJVR19ERUZBVUxUOwoJaWYgKGludHNbMF0gPiA5KSB7CgkJcHJpbnRrKEtFUk5fTk9USUNFICJhaGExNTJ4OiB1c2FnZTogYWhhMTUyeD08SU9CQVNFPlssPElSUT5bLDxTQ1NJIElEPiIKCQkgICAgICAgIlssPFJFQ09OTkVDVD5bLDxQQVJJVFk+Wyw8U1lOQ0hST05PVVM+Wyw8REVMQVk+Wyw8RVhUX1RSQU5TPlssPERFQlVHPl1dXV1dXV1dXG4iKTsKI2Vsc2UKCWlmIChpbnRzWzBdID4gOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qfSovCgkJcHJpbnRrKEtFUk5fTk9USUNFICJhaGExNTJ4OiB1c2FnZTogYWhhMTUyeD08SU9CQVNFPlssPElSUT5bLDxTQ1NJIElEPiIKCQkgICAgICAgIlssPFJFQ09OTkVDVD5bLDxQQVJJVFk+Wyw8U1lOQ0hST05PVVM+Wyw8REVMQVk+Wyw8RVhUX1RSQU5TPl1dXV1dXV1cbiIpOwojZW5kaWYKCX0gZWxzZSB7CgkJc2V0dXBfY291bnQrKzsKCQlyZXR1cm4gMDsKCX0KCglyZXR1cm4gMTsKfQpfX3NldHVwKCJhaGExNTJ4PSIsIGFoYTE1Mnhfc2V0dXApOwojZW5kaWYKCiNlbmRpZiAvKiAhUENNQ0lBICovCg==