LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiAoQykgQ29weXJpZ2h0IDIwMDUKICogTWFydGluIEtyYXVzZSBUUS1TeXN0ZW1zIEdtYkggbWFydGluLmtyYXVzZUB0cXMuZGUKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBCYXNpYyB2aWRlbyBzdXBwb3J0IGZvciBTTUkgU001MDEgIlZveWFnZXIiIGdyYXBoaWMgY29udHJvbGxlcgogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KCiNpZmRlZiBDT05GSUdfVklERU9fU001MDEKCiNpbmNsdWRlIDx2aWRlb19mYi5oPgojaW5jbHVkZSA8c201MDEuaD4KCiNkZWZpbmUgcmVhZDgocHRyUmVnKSAgICAgICAgICAgICAgICBcCiAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoc201MDEuaXNhQmFzZSArIHB0clJlZykKCiNkZWZpbmUgd3JpdGU4KHB0clJlZyx2YWx1ZSkgXAogICAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHNtNTAxLmlzYUJhc2UgKyBwdHJSZWcpID0gdmFsdWUKCiNkZWZpbmUgcmVhZDE2KHB0clJlZykgXAogICAgKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoc201MDEuaXNhQmFzZSArIHB0clJlZykpCgojZGVmaW5lIHdyaXRlMTYocHRyUmVnLHZhbHVlKSBcCiAgICAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShzbTUwMS5pc2FCYXNlICsgcHRyUmVnKSA9IHZhbHVlKQoKI2RlZmluZSByZWFkMzIocHRyUmVnKSBcCiAgICAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoc201MDEuaXNhQmFzZSArIHB0clJlZykpCgojZGVmaW5lIHdyaXRlMzIocHRyUmVnLCB2YWx1ZSkgXAogICAgKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKHNtNTAxLmlzYUJhc2UgKyBwdHJSZWcpID0gdmFsdWUpCgpHcmFwaGljRGV2aWNlIHNtNTAxOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBTbWlTZXRSZWdzIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnN0YXRpYyB2b2lkIFNtaVNldFJlZ3MgKHZvaWQpCnsKCS8qCgkgKiBUaGUgY29udGVudCBvZiB0aGUgY2hpcHNldCByZWdpc3RlciBkZXBlbmRzIG9uIHRoZSBib2FyZCAoY2xvY2tzLAoJICogLi4uKQoJICovCgljb25zdCBTTUlfUkVHUyAqcHJlZyA9IGJvYXJkX2dldF9yZWdzICgpOwoJd2hpbGUgKHByZWctPkluZGV4KSB7CgkJd3JpdGUzMiAocHJlZy0+SW5kZXgsIHByZWctPlZhbHVlKTsKCQkvKgoJCSAqIEluc2VydCBhIGRlbGF5IGJldHdlZW4KCQkgKi8KCQl1ZGVsYXkgKDEwMDApOwoJCXByZWcgKys7Cgl9Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogdmlkZW9faHdfaW5pdCAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwp2b2lkICp2aWRlb19od19pbml0ICh2b2lkKQp7Cgl1bnNpZ25lZCBpbnQgKnZtLCBpOwoKCW1lbXNldCAoJnNtNTAxLCAwLCBzaXplb2YgKEdyYXBoaWNEZXZpY2UpKTsKCgkvKgoJICogSW5pdGlhbGl6YXRpb24gb2YgdGhlIGFjY2VzcyB0byB0aGUgZ3JhcGhpYyBjaGlwc2V0IFJldHJlaXZlIGJhc2UKCSAqIGFkZHJlc3Mgb2YgdGhlIGNoaXBzZXQgKHNlZSBib2FyZC9SUFhDbGFzc2ljL2VjY3guYykKCSAqLwoJaWYgKChzbTUwMS5pc2FCYXNlID0gYm9hcmRfdmlkZW9faW5pdCAoKSkgPT0gMCkgewoJCXJldHVybiAoTlVMTCk7Cgl9CgoJaWYgKChzbTUwMS5mcmFtZUFkcnMgPSBib2FyZF92aWRlb19nZXRfZmIgKCkpID09IDApIHsKCQlyZXR1cm4gKE5VTEwpOwoJfQoKCXNtNTAxLndpblNpemVYID0gYm9hcmRfZ2V0X3dpZHRoICgpOwoJc201MDEud2luU2l6ZVkgPSBib2FyZF9nZXRfaGVpZ2h0ICgpOwoKI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX1NNNTAxXzhCUFApCglzbTUwMS5nZGZJbmRleCA9IEdERl9fOEJJVF9JTkRFWDsKCXNtNTAxLmdkZkJ5dGVzUFAgPSAxOwoKI2VsaWYgZGVmaW5lZChDT05GSUdfVklERU9fU001MDFfMTZCUFApCglzbTUwMS5nZGZJbmRleCA9IEdERl8xNkJJVF81NjVSR0I7CglzbTUwMS5nZGZCeXRlc1BQID0gMjsKCiNlbGlmIGRlZmluZWQoQ09ORklHX1ZJREVPX1NNNTAxXzMyQlBQKQoJc201MDEuZ2RmSW5kZXggPSBHREZfMzJCSVRfWDg4OFJHQjsKCXNtNTAxLmdkZkJ5dGVzUFAgPSA0OwojZWxzZQojZXJyb3IgVW5zdXBwb3J0ZWQgU001MDEgQlBQCiNlbmRpZgoKCXNtNTAxLm1lbVNpemUgPSBzbTUwMS53aW5TaXplWCAqIHNtNTAxLndpblNpemVZICogc201MDEuZ2RmQnl0ZXNQUDsKCgkvKiBMb2FkIFNtaSByZWdpc3RlcnMgKi8KCVNtaVNldFJlZ3MgKCk7CgoJLyogKHNlZSBib2FyZC9SUFhDbGFzc2ljL1JQWENsYXNzaWMuYykgKi8KCWJvYXJkX3ZhbGlkYXRlX3NjcmVlbiAoc201MDEuaXNhQmFzZSk7CgoJLyogQ2xlYXIgdmlkZW8gbWVtb3J5ICovCglpID0gc201MDEubWVtU2l6ZS80OwoJdm0gPSAodW5zaWduZWQgaW50ICopc201MDEuZnJhbWVBZHJzOwoJd2hpbGUoaS0tKQoJCSp2bSsrID0gMDsKCglyZXR1cm4gKCZzbTUwMSk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogdmlkZW9fc2V0X2x1dCAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwp2b2lkIHZpZGVvX3NldF9sdXQgKAoJdW5zaWduZWQgaW50IGluZGV4LCAgICAgICAgICAgLyogY29sb3IgbnVtYmVyICovCgl1bnNpZ25lZCBjaGFyIHIsICAgICAgICAgICAgICAvKiByZWQgKi8KCXVuc2lnbmVkIGNoYXIgZywgICAgICAgICAgICAgIC8qIGdyZWVuICovCgl1bnNpZ25lZCBjaGFyIGIgICAgICAgICAgICAgICAvKiBibHVlICovCgkpCnsKfQoKI2VuZGlmIC8qIENPTkZJR19WSURFT19TTTUwMSAqLwo=