LyoKICogU3VwcG9ydCBmb3IgdHlwZSBQQ0kgY29uZmlndXJhdGlvbiBjeWNsZXMuCiAqIGJhc2VkIG9uIHBjaV9pbmRpcmVjdC5jCiAqCiAqIENvcHlyaWdodCAoQykgMjAwMiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgoKI2lmZGVmIENPTkZJR19QQ0kKCiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPHBjaS5oPgoKI2RlZmluZSBjZmdfcmVhZCh2YWwsIGFkZHIsIG9wKQkqdmFsID0gb3AoKGludCkoYWRkcikpCiNkZWZpbmUgY2ZnX3dyaXRlKHZhbCwgYWRkciwgb3ApCW9wKCh2YWwpLCAoaW50KShhZGRyKSkKCiNkZWZpbmUgVFlQRTFfUENJX09QKHJ3LCBzaXplLCB0eXBlLCBvcCwgbWFzaykJCQkgXApzdGF0aWMgaW50CQkJCQkJCQkgXAp0eXBlMV8jI3J3IyNfY29uZmlnXyMjc2l6ZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIAkJIFwKCQkJICAgICAgcGNpX2Rldl90IGRldiwgaW50IG9mZnNldCwgdHlwZSB2YWwpCSBcCnsJCQkJCQkJCQkgXAoJb3V0bChkZXYgfCAob2Zmc2V0ICYgMHhmYykgfCAweDgwMDAwMDAwLCAoaW50KWhvc2UtPmNmZ19hZGRyKTsgCSBcCgljZmdfIyNydyh2YWwsIGhvc2UtPmNmZ19kYXRhICsgKG9mZnNldCAmIG1hc2spLCBvcCk7CSBcCglyZXR1cm4gMDsgICAgCQkJCQkgCQkgXAp9CgoKVFlQRTFfUENJX09QKHJlYWQsIGJ5dGUsIHU4ICosIGluYiwgMykKVFlQRTFfUENJX09QKHJlYWQsIHdvcmQsIHUxNiAqLCBpbncsIDIpClRZUEUxX1BDSV9PUChyZWFkLCBkd29yZCwgdTMyICosIGlubCwgMCkKClRZUEUxX1BDSV9PUCh3cml0ZSwgYnl0ZSwgdTgsIG91dGIsIDMpClRZUEUxX1BDSV9PUCh3cml0ZSwgd29yZCwgdTE2LCBvdXR3LCAyKQpUWVBFMV9QQ0lfT1Aod3JpdGUsIGR3b3JkLCB1MzIsIG91dGwsIDApCgp2b2lkIHBjaV9zZXR1cF90eXBlMShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQp7CglwY2lfc2V0X29wcyhob3NlLAoJCSAgICB0eXBlMV9yZWFkX2NvbmZpZ19ieXRlLAoJCSAgICB0eXBlMV9yZWFkX2NvbmZpZ193b3JkLAoJCSAgICB0eXBlMV9yZWFkX2NvbmZpZ19kd29yZCwKCQkgICAgdHlwZTFfd3JpdGVfY29uZmlnX2J5dGUsCgkJICAgIHR5cGUxX3dyaXRlX2NvbmZpZ193b3JkLAoJCSAgICB0eXBlMV93cml0ZV9jb25maWdfZHdvcmQpOwoKCWhvc2UtPmNmZ19hZGRyID0gKHVuc2lnbmVkIGludCAqKSBjZmdfYWRkcjsKCWhvc2UtPmNmZ19kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgY2ZnX2RhdGE7Cn0KCiNlbmRpZgo=