LyoKICogVkdBIGVtdWxhdGlvbgogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS8V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2lmbmRlZiBfX1dJTkVfVkdBX0gKI2RlZmluZSBfX1dJTkVfVkdBX0gKCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgoKLyogZ3JhcGhpY3MgbW9kZSAqLwppbnQgVkdBX1NldE1vZGUodW5zaWduZWQgWHJlcyx1bnNpZ25lZCBZcmVzLHVuc2lnbmVkIERlcHRoKTsKaW50IFZHQV9HZXRNb2RlKHVuc2lnbmVkKkhlaWdodCx1bnNpZ25lZCpXaWR0aCx1bnNpZ25lZCpEZXB0aCk7CnZvaWQgVkdBX1NldFBhbGV0dGUoUEFMRVRURUVOVFJZKnBhbCxpbnQgc3RhcnQsaW50IGxlbik7CnZvaWQgVkdBX1NldENvbG9yMTYoaW50IHJlZyxpbnQgY29sb3IpOwpjaGFyIFZHQV9HZXRDb2xvcjE2KGludCByZWcpOwp2b2lkIFZHQV9TZXQxNlBhbGV0dGUoY2hhciAqVGFibGUpOwp2b2lkIFZHQV9HZXQxNlBhbGV0dGUoY2hhciAqVGFibGUpOwp2b2lkIFZHQV9TZXRRdWFkUGFsZXR0ZShSR0JRVUFEKmNvbG9yLGludCBzdGFydCxpbnQgbGVuKTsKTFBTVFIgVkdBX0xvY2sodW5zaWduZWQqUGl0Y2gsdW5zaWduZWQqSGVpZ2h0LHVuc2lnbmVkKldpZHRoLHVuc2lnbmVkKkRlcHRoKTsKdm9pZCBWR0FfVW5sb2NrKHZvaWQpOwp2b2lkIFZHQV9TZXRXaW5kb3dTdGFydChpbnQgc3RhcnQpOwppbnQgIFZHQV9HZXRXaW5kb3dTdGFydCh2b2lkKTsKdm9pZCBWR0FfU2hvd01vdXNlKEJPT0wgc2hvdyk7CgovKiB0ZXh0IG1vZGUgKi8Kdm9pZCBWR0FfSW5pdEFscGhhTW9kZSh1bnNpZ25lZCpYcmVzLHVuc2lnbmVkKllyZXMpOwp2b2lkIFZHQV9TZXRBbHBoYU1vZGUodW5zaWduZWQgWHJlcyx1bnNpZ25lZCBZcmVzKTsKQk9PTCBWR0FfR2V0QWxwaGFNb2RlKHVuc2lnbmVkKlhyZXMsdW5zaWduZWQqWXJlcyk7CnZvaWQgVkdBX1NldEN1cnNvclNoYXBlKHVuc2lnbmVkIGNoYXIgc3RhcnRfb3B0aW9ucyx1bnNpZ25lZCBjaGFyIGVuZCk7CnZvaWQgVkdBX1NldEN1cnNvclBvcyh1bnNpZ25lZCBYLHVuc2lnbmVkIFkpOwp2b2lkIFZHQV9HZXRDdXJzb3JQb3ModW5zaWduZWQqWCx1bnNpZ25lZCpZKTsKdm9pZCBWR0FfV3JpdGVDaGFycyh1bnNpZ25lZCBYLHVuc2lnbmVkIFksdW5zaWduZWQgY2gsaW50IGF0dHIsaW50IGNvdW50KTsKdm9pZCBWR0FfUHV0Q2hhcihCWVRFIGFzY2lpKTsKdm9pZCBWR0FfU2V0VGV4dEF0dHJpYnV0ZShCWVRFIGF0dHIpOwp2b2lkIFZHQV9DbGVhclRleHQodW5zaWduZWQgcm93MSwgdW5zaWduZWQgY29sMSwKICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcm93MiwgdW5zaWduZWQgY29sMiwKICAgICAgICAgICAgICAgICAgQllURSBhdHRyKTsKdm9pZCBWR0FfU2Nyb2xsVXBUZXh0KHVuc2lnbmVkIHJvdzEsIHVuc2lnbmVkIGNvbDEsCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJvdzIsIHVuc2lnbmVkIGNvbDIsCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpbmVzLCBCWVRFIGF0dHIpOwp2b2lkIFZHQV9TY3JvbGxEb3duVGV4dCh1bnNpZ25lZCByb3cxLCB1bnNpZ25lZCBjb2wxLAogICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJvdzIsIHVuc2lnbmVkIGNvbDIsCiAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGluZXMsIEJZVEUgYXR0cik7CnZvaWQgVkdBX0dldENoYXJhY3RlckF0Q3Vyc29yKEJZVEUgKmFzY2lpLCBCWVRFICphdHRyKTsKCi8qIGNvbnRyb2wgKi8Kdm9pZCBWR0FfaW9wb3J0X291dChXT1JEIHBvcnQsIEJZVEUgdmFsKTsKQllURSBWR0FfaW9wb3J0X2luKFdPUkQgcG9ydCk7CnZvaWQgVkdBX0NsZWFuKHZvaWQpOwoKI2VuZGlmIC8qIF9fV0lORV9WR0FfSCAqLwo=