LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCi8qCiAqIERvcyBmbG9wcHkgc3VwcG9ydAogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8Y29tbWFuZC5oPgojaW5jbHVkZSA8ZmRjLmg+CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGRvX2Zkb3Nib290IC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkb19mZG9zYm9vdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKICAgIGNoYXIgKm5hbWU7CiAgICBjaGFyICplcDsKICAgIGludCBzaXplOwogICAgaW50IHJjb2RlID0gMDsKICAgIGNoYXIgYnVmIFsxMl07CiAgICBpbnQgZHJpdmUgPSBDT05GSUdfU1lTX0ZEQ19EUklWRV9OVU1CRVI7CgogICAgLyogcHJlLXNldCBsb2FkX2FkZHIgKi8KICAgIGlmICgoZXAgPSBnZXRlbnYoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGVwLCBOVUxMLCAxNik7CiAgICB9CgogICAgLyogcHJlLXNldCBCb290IGZpbGUgbmFtZSAqLwogICAgaWYgKChuYW1lID0gZ2V0ZW52KCJib290ZmlsZSIpKSA9PSBOVUxMKSB7CgluYW1lID0gInVJbWFnZSI7CiAgICB9CgogICAgc3dpdGNoIChhcmdjKSB7CiAgICBjYXNlIDE6CglicmVhazsKICAgIGNhc2UgMjoKCS8qIG9ubHkgb25lIGFyZyAtIGFjY2VwdCB0d28gZm9ybXM6CgkgKiBqdXN0IGxvYWQgYWRkcmVzcywgb3IganVzdCBib290IGZpbGUgbmFtZS4KCSAqIFRoZSBsYXR0ZXIgZm9ybSBtdXN0IGJlIHdyaXR0ZW4gImZpbGVuYW1lIiBoZXJlLgoJICovCglpZiAoYXJndlsxXVswXSA9PSAnIicpIHsJLyoganVzdCBib290IGZpbGVuYW1lICovCgkgICAgbmFtZSA9IGFyZ3YgWzFdOwoJfSBlbHNlIHsJCQkvKiBsb2FkIGFkZHJlc3MJKi8KCSAgICBsb2FkX2FkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7Cgl9CglicmVhazsKICAgIGNhc2UgMzoKCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKCW5hbWUgPSBhcmd2IFsyXTsKCWJyZWFrOwogICAgZGVmYXVsdDoKCXJldHVybiBjbWRfdXNhZ2UoY21kdHApOwogICAgfQoKICAgIC8qIEluaXQgcGh5c2ljYWwgbGF5ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKCFmZGNfZmRvc19pbml0IChkcml2ZSkpIHsKCXJldHVybiAoLTEpOwogICAgfQoKICAgIC8qIE9wZW4gZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKGRvc19vcGVuIChuYW1lKSA8IDApIHsKCXByaW50ZiAoIlVuYWJsZSB0byBvcGVuICVzXG4iLCBuYW1lKTsKCXJldHVybiAxOwogICAgfQogICAgaWYgKChzaXplID0gZG9zX3JlYWQgKGxvYWRfYWRkcikpIDwgMCkgewoJcHJpbnRmICgiYm9vdCBlcnJvclxuIik7CglyZXR1cm4gMTsKICAgIH0KICAgIGZsdXNoX2NhY2hlIChsb2FkX2FkZHIsIHNpemUpOwoKICAgIHNwcmludGYoYnVmLCAiJXgiLCBzaXplKTsKICAgIHNldGVudigiZmlsZXNpemUiLCBidWYpOwoKICAgIHByaW50ZigiRmxvcHB5IERPUyBsb2FkIGNvbXBsZXRlOiAlZCBieXRlcyBsb2FkZWQgdG8gMHglbHhcbiIsCgkgICBzaXplLCBsb2FkX2FkZHIpOwoKICAgIC8qIENoZWNrIGlmIHdlIHNob3VsZCBhdHRlbXB0IGFuIGF1dG8tc3RhcnQgKi8KICAgIGlmIChnZXRlbnZfeWVzbm8oImF1dG9zdGFydCIpKSB7CgljaGFyICpsb2NhbF9hcmdzWzJdOwoJbG9jYWxfYXJnc1swXSA9IGFyZ3ZbMF07Cglsb2NhbF9hcmdzWzFdID0gTlVMTDsKCXByaW50ZiAoIkF1dG9tYXRpYyBib290IG9mIGltYWdlIGF0IGFkZHIgMHglMDhsWCAuLi5cbiIsIGxvYWRfYWRkcik7CglyY29kZSA9IGRvX2Jvb3RtIChjbWR0cCwgMCwgMSwgbG9jYWxfYXJncyk7CiAgICB9CiAgICByZXR1cm4gcmNvZGU7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogZG9fZmRvc2xzIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkb19mZG9zbHMoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiAgICBjaGFyICpwYXRoID0gIiI7CiAgICBpbnQgZHJpdmUgPSBDT05GSUdfU1lTX0ZEQ19EUklWRV9OVU1CRVI7CgogICAgc3dpdGNoIChhcmdjKSB7CiAgICBjYXNlIDE6CglicmVhazsKICAgIGNhc2UgMjoKCXBhdGggPSBhcmd2IFsxXTsKCWJyZWFrOwogICAgfQoKICAgIC8qIEluaXQgcGh5c2ljYWwgbGF5ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKCFmZGNfZmRvc19pbml0IChkcml2ZSkpIHsKCXJldHVybiAoLTEpOwogICAgfQogICAgLyogT3BlbiBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAoZG9zX29wZW4gKHBhdGgpIDwgMCkgewoJcHJpbnRmICgiVW5hYmxlIHRvIG9wZW4gJXNcbiIsIHBhdGgpOwoJcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gKGRvc19kaXIgKCkpOwp9CgpVX0JPT1RfQ01EKAoJZmRvc2Jvb3QsCTMsCTAsCWRvX2Zkb3Nib290LAoJImJvb3QgZnJvbSBhIGRvcyBmbG9wcHkgZmlsZSIsCgkiW2xvYWRBZGRyXSBbZmlsZW5hbWVdIgopOwoKVV9CT09UX0NNRCgKCWZkb3NscywJMiwJMCwJZG9fZmRvc2xzLAoJImxpc3QgZmlsZXMgaW4gYSBkaXJlY3RvcnkiLAoJIltkaXJlY3RvcnldIgopOwo=