LyogY2FjaGUuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgTFJVIGNhY2hlCiAqCiAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICoKICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KICoKICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgogKgogKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAogKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogKi8KCiNpZm5kZWYgUFlTUUxJVEVfQ0FDSEVfSAojZGVmaW5lIFBZU1FMSVRFX0NBQ0hFX0gKI2luY2x1ZGUgIlB5dGhvbi5oIgoKLyogVGhlIExSVSBjYWNoZSBpcyBpbXBsZW1lbnRlZCBhcyBhIGNvbWJpbmF0aW9uIG9mIGEgZG91Ymx5LWxpbmtlZCB3aXRoIGEKICogZGljdGlvbmFyeS4gVGhlIGxpc3QgaXRlbXMgYXJlIG9mIHR5cGUgJ05vZGUnIGFuZCB0aGUgZGljdGlvbmFyeSBoYXMgdGhlCiAqIG5vZGVzIGFzIHZhbHVlcy4gKi8KCnR5cGVkZWYgc3RydWN0IF9weXNxbGl0ZV9Ob2RlCnsKICAgIFB5T2JqZWN0X0hFQUQKICAgIFB5T2JqZWN0KiBrZXk7CiAgICBQeU9iamVjdCogZGF0YTsKICAgIGxvbmcgY291bnQ7CiAgICBzdHJ1Y3QgX3B5c3FsaXRlX05vZGUqIHByZXY7CiAgICBzdHJ1Y3QgX3B5c3FsaXRlX05vZGUqIG5leHQ7Cn0gcHlzcWxpdGVfTm9kZTsKCnR5cGVkZWYgc3RydWN0CnsKICAgIFB5T2JqZWN0X0hFQUQKICAgIGludCBzaXplOwoKICAgIC8qIGEgZGljdGlvbmFyeSBtYXBwaW5nIGtleXMgdG8gTm9kZSBlbnRyaWVzICovCiAgICBQeU9iamVjdCogbWFwcGluZzsKCiAgICAvKiB0aGUgZmFjdG9yeSBjYWxsYWJsZSAqLwogICAgUHlPYmplY3QqIGZhY3Rvcnk7CgogICAgcHlzcWxpdGVfTm9kZSogZmlyc3Q7CiAgICBweXNxbGl0ZV9Ob2RlKiBsYXN0OwoKICAgIC8qIGlmIHNldCwgZGVjcmVtZW50IHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHdoZW4gdGhlIENhY2hlIGlzIGRlYWxsb2NhdGVkLgogICAgICogdGhpcyBpcyBhbG1vc3QgYWx3YXlzIGRlc2lyYWJsZSwgYnV0IG5vdCBpbiB0aGUgcHlzcWxpdGUgY29udGV4dCAqLwogICAgaW50IGRlY3JlZl9mYWN0b3J5Owp9IHB5c3FsaXRlX0NhY2hlOwoKZXh0ZXJuIFB5VHlwZU9iamVjdCBweXNxbGl0ZV9Ob2RlVHlwZTsKZXh0ZXJuIFB5VHlwZU9iamVjdCBweXNxbGl0ZV9DYWNoZVR5cGU7CgppbnQgcHlzcWxpdGVfbm9kZV9pbml0KHB5c3FsaXRlX05vZGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKdm9pZCBweXNxbGl0ZV9ub2RlX2RlYWxsb2MocHlzcWxpdGVfTm9kZSogc2VsZik7CgppbnQgcHlzcWxpdGVfY2FjaGVfaW5pdChweXNxbGl0ZV9DYWNoZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOwp2b2lkIHB5c3FsaXRlX2NhY2hlX2RlYWxsb2MocHlzcWxpdGVfQ2FjaGUqIHNlbGYpOwpQeU9iamVjdCogcHlzcWxpdGVfY2FjaGVfZ2V0KHB5c3FsaXRlX0NhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CgppbnQgcHlzcWxpdGVfY2FjaGVfc2V0dXBfdHlwZXModm9pZCk7CgojZW5kaWYK