LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIEBmaWxlIG5ldHNubXBfZGF0YV9saXN0LmgKICoKICogQGFkZHRvZ3JvdXAgYWdlbnQKICogQGFkZHRvZ3JvdXAgbGlicmFyeSAqCiAqCiAqICRJZCQKICoKICogRXh0ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGluIG5ldHNubXBfZGF0YV9saXN0LmMuCiAqCiAqIEB7CiAqLwoKI2lmbmRlZiBEQVRBX0xJU1RfSAojZGVmaW5lIERBVEFfTElTVF9ICgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9pbXBsLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3Rvb2xzLmg+CgogICAgdHlwZWRlZiB2b2lkICAgIChOZXRzbm1wX0ZyZWVfTGlzdF9EYXRhKSAodm9pZCAqKTsKICAgIHR5cGVkZWYgaW50ICAgICAoTmV0c25tcF9TYXZlX0xpc3RfRGF0YSkgKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sIHZvaWQgKik7CiAgICB0eXBlZGVmIHZvaWQgKiAgKE5ldHNubXBfUmVhZF9MaXN0X0RhdGEpIChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuKTsKCi8qKiBAc3RydWN0IG5ldHNubXBfZGF0YV9saXN0X3MKICogdXNlZCB0byBpdGVyYXRlIHRocm91Z2ggbGlzdHMgb2YgZGF0YQogKi8KICAgIHR5cGVkZWYgc3RydWN0IG5ldHNubXBfZGF0YV9saXN0X3MgewogICAgICAgIHN0cnVjdCBuZXRzbm1wX2RhdGFfbGlzdF9zICpuZXh0OwogICAgICAgIGNoYXIgICAgICAgICAgICpuYW1lOwogCS8qKiBUaGUgcG9pbnRlciB0byB0aGUgZGF0YSBwYXNzZWQgb24uICovCiAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGE7CiAgICAgICAgLyoqIG11c3Qga25vdyBob3cgdG8gZnJlZSBuZXRzbm1wX2RhdGFfbGlzdC0+ZGF0YSAqLwogICAgICAgIE5ldHNubXBfRnJlZV9MaXN0X0RhdGEgKmZyZWVfZnVuYzsKICAgIH0gbmV0c25tcF9kYXRhX2xpc3Q7CgogICAgdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9kYXRhX2xpc3Rfc2F2ZWluZm9fcyB7CiAgICAgICBuZXRzbm1wX2RhdGFfbGlzdCAqKmRhdGFsaXN0OwogICAgICAgY29uc3QgY2hhciAqdHlwZTsKICAgICAgIGNvbnN0IGNoYXIgKnRva2VuOwogICAgICAgTmV0c25tcF9TYXZlX0xpc3RfRGF0YSAqZGF0YV9saXN0X3NhdmVfcHRyOwogICAgICAgTmV0c25tcF9SZWFkX0xpc3RfRGF0YSAqZGF0YV9saXN0X3JlYWRfcHRyOwogICAgICAgTmV0c25tcF9GcmVlX0xpc3RfRGF0YSAqZGF0YV9saXN0X2ZyZWVfcHRyOwogICAgfSBuZXRzbm1wX2RhdGFfbGlzdF9zYXZlaW5mbzsKCiAgICBORVRTTk1QX0lNUE9SVAogICAgbmV0c25tcF9kYXRhX2xpc3QgKgogICAgICBuZXRzbm1wX2NyZWF0ZV9kYXRhX2xpc3QoY29uc3QgY2hhciAqLCB2b2lkICosIE5ldHNubXBfRnJlZV9MaXN0X0RhdGEqICk7CiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9kYXRhX2xpc3RfYWRkX25vZGUobmV0c25tcF9kYXRhX2xpc3QgKipoZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZGF0YV9saXN0ICpub2RlKTsKICAgIG5ldHNubXBfZGF0YV9saXN0ICoKICAgICAgbmV0c25tcF9kYXRhX2xpc3RfYWRkX2RhdGEobmV0c25tcF9kYXRhX2xpc3QgKipoZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRzbm1wX0ZyZWVfTGlzdF9EYXRhICogYmVlcik7CiAgICBORVRTTk1QX0lNUE9SVAogICAgdm9pZCAgICAgICAgICAgKm5ldHNubXBfZ2V0X2xpc3RfZGF0YShuZXRzbm1wX2RhdGFfbGlzdCAqaGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbm9kZSk7CiAgICBORVRTTk1QX0lNUE9SVAogICAgdm9pZCAgICAgICAgICAgIG5ldHNubXBfZnJlZV9saXN0X2RhdGEobmV0c25tcF9kYXRhX2xpc3QgKmhlYWQpOyAgICAvKiBzaW5nbGUgKi8KICAgIE5FVFNOTVBfSU1QT1JUCiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9mcmVlX2FsbF9saXN0X2RhdGEobmV0c25tcF9kYXRhX2xpc3QgKmhlYWQpOyAgICAgICAgLyogbXVsdGlwbGUgKi8KICAgIE5FVFNOTVBfSU1QT1JUCiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9yZW1vdmVfbGlzdF9ub2RlKG5ldHNubXBfZGF0YV9saXN0ICoqcmVhbGhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwogICAgTkVUU05NUF9JTVBPUlQKICAgIG5ldHNubXBfZGF0YV9saXN0ICoKICAgIG5ldHNubXBfZ2V0X2xpc3Rfbm9kZShuZXRzbm1wX2RhdGFfbGlzdCAqaGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKCiAgICAvKiogZGVwcmVjaWF0ZWQ6IHVzZSBuZXRzbm1wX2RhdGFfbGlzdF9hZGRfbm9kZSgpICovCiAgICBORVRTTk1QX0lNUE9SVAogICAgdm9pZCAgICAgICAgICAgIG5ldHNubXBfYWRkX2xpc3RfZGF0YShuZXRzbm1wX2RhdGFfbGlzdCAqKmhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZGF0YV9saXN0ICpub2RlKTsKCgogICAgdm9pZAogICAgbmV0c25tcF9yZWdpc3Rlcl9zYXZlX2xpc3QobmV0c25tcF9kYXRhX2xpc3QgKipkYXRhbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKnRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0c25tcF9TYXZlX0xpc3RfRGF0YSAqZGF0YV9saXN0X3NhdmVfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0c25tcF9SZWFkX0xpc3RfRGF0YSAqZGF0YV9saXN0X3JlYWRfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0c25tcF9GcmVlX0xpc3RfRGF0YSAqZGF0YV9saXN0X2ZyZWVfcHRyKTsKICAgIGludAogICAgbmV0c25tcF9zYXZlX2FsbF9kYXRhKG5ldHNubXBfZGF0YV9saXN0ICpoZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKnRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHNubXBfU2F2ZV9MaXN0X0RhdGEgKiBkYXRhX2xpc3Rfc2F2ZV9wdHIpOwogICAgU05NUENhbGxiYWNrIG5ldHNubXBfc2F2ZV9hbGxfZGF0YV9jYWxsYmFjazsKICAgIHZvaWQgbmV0c25tcF9yZWFkX2RhdGFfY2FsbGJhY2soY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpOwojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKI2VuZGlmCi8qKiBAfSAqLwo=