LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaWZuZGVmIF9VX0JPT1RfSTM4Nl9IXwojZGVmaW5lIF9VX0JPT1RfSTM4Nl9IXwkxCgovKiBmb3IgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMsIHNlZSBzdGFydC5TICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9zdGFydDsJICAgIC8qIGNvZGUgc3RhcnQgKGluIGZsYXNoKSAqLwpleHRlcm4gdWxvbmcgaTM4NmJvb3RfZW5kOwkgICAgLyogY29kZSBlbmQgKGluIGZsYXNoKSAqLwpleHRlcm4gdWxvbmcgaTM4NmJvb3Rfcm9tZGF0YV9zdGFydDsvKiBkYXRhc2VnbWVudCBpbiBmbGFzaCAoYWxzbyBjb2RlK3JvZGF0YSBlbmQpICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9yb21kYXRhX2Rlc3Q7IC8qIGRhdGEgbG9jYXRpb24gc2VnbWVudCBpbiByYW0gKi8KZXh0ZXJuIHVsb25nIGkzODZib290X3JvbWRhdGFfc2l6ZTsgLyogc2l6ZSBvZiBkYXRhIHNlZ21lbnQgKi8KZXh0ZXJuIHVsb25nIGkzODZib290X2Jzc19zdGFydDsgICAgLyogYnNzIHN0YXJ0ICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9ic3Nfc2l6ZTsgICAgIC8qIGJzcyBzaXplICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9zdGFja19lbmQ7ICAgIC8qIGZpcnN0IHVzYWJsZSBSQU0gYWRkcmVzcyBhZnRlciBic3MgYW5kIHN0YWNrICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9yYW1fZW5kOyAgICAgIC8qIGVuZCBvZiByYW0gKi8KCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9yZWFsbW9kZTsgICAgIC8qIHN0YXJ0IG9mIHJlYWxtb2RlIGVudHJ5IGNvZGUgKi8KZXh0ZXJuIHVsb25nIGkzODZib290X3JlYWxtb2RlX3NpemU7Lyogc2l6ZSBvZiByZWFsbW9kZSBlbnRyeSBjb2RlICovCmV4dGVybiB1bG9uZyBpMzg2Ym9vdF9iaW9zOyAgICAgICAgIC8qIHN0YXJ0IG9mIEJJT1MgZW11bGF0aW9uIGNvZGUgKi8KZXh0ZXJuIHVsb25nIGkzODZib290X2Jpb3Nfc2l6ZTsgICAgLyogc2l6ZSBvZiBCSU9TIGVtdWxhdGlvbiBjb2RlICovCgoKLyogY3B1Ly4uLi9jcHUuYyAqLwppbnQgY3B1X2luaXQodm9pZCk7CgovKiBjcHUvLi4uL3RpbWVyLmMgKi8Kdm9pZCB0aW1lcl9pc3Iodm9pZCAqKTsKdHlwZWRlZiB2b2lkICh0aW1lcl9mbmNfdCkgKHZvaWQpOwppbnQgcmVnaXN0ZXJfdGltZXJfaXNyICh0aW1lcl9mbmNfdCAqaXNyX2Z1bmMpOwoKLyogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIC0gY2FuIGJlIGluIGNwdS9pMzg2LywgbGliX2kzODYvLCBvciAkKEJPQVJEKS8gKi8KaW50IHRpbWVyX2luaXQodm9pZCk7CgovKiBjcHUvLi4uL2ludGVycnVwdHMuYyAqLwppbnQgY3B1X2luaXRfaW50ZXJydXB0cyh2b2lkKTsKCi8qIGJvYXJkLy4uLi8uLi4gKi8KaW50IGJvYXJkX2luaXQodm9pZCk7CmludCBkcmFtX2luaXQodm9pZCk7Cgp2b2lkIGlzYV91bm1hcF9yb20odTMyIGFkZHIpOwp1MzIgaXNhX21hcF9yb20odTMyIGJ1c19hZGRyLCBpbnQgc2l6ZSk7CgovKiBsaWJfaTM4Ni8uLi4gKi8KaW50IHZpZGVvX2Jpb3NfaW5pdCh2b2lkKTsKaW50IHZpZGVvX2luaXQodm9pZCk7CgoKI2VuZGlmCS8qIF9VX0JPT1RfSTM4Nl9IXyAqLwo=