LyoKICogRGVidWdnZXIgQWxwaGEgc3BlY2lmaWMgZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAyMDA0IFZpbmNlbnQgQulyb24KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgImRlYnVnZ2VyLmgiCgojaWYgZGVmaW5lZChfX0FMUEhBX18pCgpzdGF0aWMgdW5zaWduZWQgYmVfYWxwaGFfZ2V0X2FkZHIoSEFORExFIGhUaHJlYWQsIGNvbnN0IENPTlRFWFQqIGN0eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gYmVfY3B1X2FkZHIgYmNhLCBBRERSRVNTKiBhZGRyKQp7CiAgICBkYmdfcHJpbnRmKCJub3QgZG9uZVxuIik7CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyB2b2lkIGJlX2FscGhhX3NpbmdsZV9zdGVwKENPTlRFWFQqIGN0eCwgdW5zaWduZWQgZW5hYmxlKQp7CiAgICBkYmdfcHJpbnRmKCJub3QgZG9uZVxuIik7Cn0KCnN0YXRpYyB2b2lkIGJlX2FscGhhX3ByaW50X2NvbnRleHQoSEFORExFIGhUaHJlYWQsIGNvbnN0IENPTlRFWFQqIGN0eCkKewogICAgZGJnX3ByaW50ZigiQ29udGV4dCBwcmludGluZyBmb3IgQWxwaGEgbm90IGRvbmUgeWV0XG4iKTsKfQoKc3RhdGljIHZvaWQgYmVfYWxwaGFfcHJpbnRfc2VnbWVudF9pbmZvKEhBTkRMRSBoVGhyZWFkLCBjb25zdCBDT05URVhUKiBjdHgpCnsKfQoKc3RhdGljIHN0cnVjdCBkYmdfaW50ZXJuYWxfdmFyIGJlX2FscGhhX2N0eFtdID0KewogICAgezAsICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiZ19pdHlwZV9ub25lfQp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBkYmdfaW50ZXJuYWxfdmFyKiBiZV9hbHBoYV9pbml0X3JlZ2lzdGVycyhDT05URVhUKiBjdHgpCnsKICAgIGRiZ19wcmludGYoIm5vdCBkb25lXG4iKTsKICAgIHJldHVybiBiZV9hbHBoYV9jdHg7Cn0KCnN0YXRpYyB1bnNpZ25lZCBiZV9hbHBoYV9pc19zdGVwX292ZXJfaW5zbih2b2lkKiBpbnNuKQp7CiAgICBkYmdfcHJpbnRmKCJub3QgZG9uZVxuIik7CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyB1bnNpZ25lZCBiZV9hbHBoYV9pc19mdW5jdGlvbl9yZXR1cm4odm9pZCogaW5zbikKewogICAgZGJnX3ByaW50Zigibm90IGRvbmVcbiIpOwogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgdW5zaWduZWQgYmVfYWxwaGFfaXNfYnJlYWtfaW5zbih2b2lkKiBpbnNuKQp7CiAgICBkYmdfcHJpbnRmKCJub3QgZG9uZVxuIik7CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyB1bnNpZ25lZCBiZV9hbHBoYV9pc19mdW5jX2NhbGwodm9pZCogaW5zbiwgdm9pZCoqIGluc25fY2FsbGVlKQp7CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyB2b2lkIGJlX2FscGhhX2Rpc2FzbV9vbmVfaW5zbihBRERSRVNTKiBhZGRyLCBpbnQgZGlzcGxheSkKewogICAgZGJnX3ByaW50ZigiRGlzYXNtIE5JWVxuIik7Cn0KCnN0YXRpYyB1bnNpZ25lZCBiZV9hbHBoYV9pbnNlcnRfWHBvaW50KEhBTkRMRSBoUHJvY2Vzcywgc3RydWN0IGJlX3Byb2Nlc3NfaW8qIHBpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCogY3R4LCBlbnVtIGJlX3hwb2ludF90eXBlIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFkZHIsIHVuc2lnbmVkIGxvbmcqIHZhbCwgdW5zaWduZWQgc2l6ZSkKewogICAgdW5zaWduZWQgbG9uZyAgICAgICB4YnA7CiAgICB1bnNpZ25lZCBsb25nICAgICAgIHN6OwoKICAgIHN3aXRjaCAodHlwZSkKICAgIHsKICAgIGNhc2UgYmVfeHBvaW50X2JyZWFrOgogICAgICAgIGlmICghc2l6ZSkgcmV0dXJuIDA7CiAgICAgICAgaWYgKCFwaW8tPnJlYWQoaFByb2Nlc3MsIGFkZHIsIHZhbCwgNCwgJnN6KSB8fCBzeiAhPSA0KSByZXR1cm4gMDsKICAgICAgICB4YnAgPSAweDdkODIxMDA4OyAvKiA3ZCA4MiAxMCAwOCAuLi4gaW4gYmlnIGVuZGlhbiAqLwogICAgICAgIGlmICghcGlvLT53cml0ZShoUHJvY2VzcywgYWRkciwgJnhicCwgNCwgJnN6KSB8fCBzeiAhPSA0KSByZXR1cm4gMDsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgZGJnX3ByaW50ZigiVW5rbm93bi91bnN1cHBvcnRlZCBicCB0eXBlICVjXG4iLCB0eXBlKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiAxOwp9CgpzdGF0aWMgdW5zaWduZWQgYmVfYWxwaGFfcmVtb3ZlX1hwb2ludChIQU5ETEUgaFByb2Nlc3MsIENPTlRFWFQqIGN0eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGJlX3hwb2ludF90eXBlIHR5cGUsIHZvaWQqIGFkZHIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHVuc2lnbmVkIHNpemUpCnsKICAgIGRiZ19wcmludGYoIm5vdCBkb25lXG4iKTsKICAgIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIHVuc2lnbmVkIGJlX2FscGhhX2lzX3dhdGNocG9pbnRfc2V0KGNvbnN0IENPTlRFWFQqIGN0eCwgdW5zaWduZWQgaWR4KQp7CiAgICBkYmdfcHJpbnRmKCJub3QgZG9uZVxuIik7CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyB2b2lkIGJlX2FscGhhX2NsZWFyX3dhdGNocG9pbnQoQ09OVEVYVCogY3R4LCB1bnNpZ25lZCBpZHgpCnsKICAgIGRiZ19wcmludGYoIm5vdCBkb25lXG4iKTsKfQoKc3RhdGljIGludCBiZV9hbHBoYV9hZGp1c3RfcGNfZm9yX2JyZWFrKENPTlRFWFQqIGN0eCwgQk9PTCB3YXkpCnsKICAgIGRiZ19wcmludGYoIm5vdCBkb25lXG4iKTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IGJlX2FscGhhX2ZldGNoX2ludGVnZXIoY29uc3Qgc3RydWN0IGRiZ19sdmFsdWUqIGx2YWx1ZSwgdW5zaWduZWQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGV4dF9zaWduLCBsb25nIGxvbmcgaW50KiByZXQpCnsKICAgIGRiZ19wcmludGYoIm5vdCBkb25lXG4iKTsKICAgIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIGludCBiZV9hbHBoYV9mZXRjaF9mbG9hdChjb25zdCBzdHJ1Y3QgZGJnX2x2YWx1ZSogbHZhbHVlLCB1bnNpZ25lZCBzaXplLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSogcmV0KQp7CiAgICBkYmdfcHJpbnRmKCJub3QgZG9uZVxuIik7CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0cnVjdCBiYWNrZW5kX2NwdSBiZV9hbHBoYSA9CnsKICAgIGJlX2NwdV9saW5lYXJpemUsCiAgICBiZV9jcHVfYnVpbGRfYWRkciwKICAgIGJlX2FscGhhX2dldF9hZGRyLAogICAgYmVfYWxwaGFfc2luZ2xlX3N0ZXAsCiAgICBiZV9hbHBoYV9wcmludF9jb250ZXh0LAogICAgYmVfYWxwaGFfcHJpbnRfc2VnbWVudF9pbmZvLAogICAgYmVfYWxwaGFfaW5pdF9yZWdpc3RlcnMsCiAgICBiZV9hbHBoYV9pc19zdGVwX292ZXJfaW5zbiwKICAgIGJlX2FscGhhX2lzX2Z1bmN0aW9uX3JldHVybiwKICAgIGJlX2FscGhhX2lzX2JyZWFrX2luc24sCiAgICBiZV9hbHBoYV9pc19mdW5jX2NhbGwsCiAgICBiZV9hbHBoYV9kaXNhc21fb25lX2luc24sCiAgICBiZV9hbHBoYV9pbnNlcnRfWHBvaW50LAogICAgYmVfYWxwaGFfcmVtb3ZlX1hwb2ludCwKICAgIGJlX2FscGhhX2lzX3dhdGNocG9pbnRfc2V0LAogICAgYmVfYWxwaGFfY2xlYXJfd2F0Y2hwb2ludCwKICAgIGJlX2FscGhhX2FkanVzdF9wY19mb3JfYnJlYWssCiAgICBiZV9hbHBoYV9mZXRjaF9pbnRlZ2VyLAogICAgYmVfYWxwaGFfZmV0Y2hfZmxvYXQsCn07CiNlbmRpZgo=