Li4gTWV0YWZ1bmN0aW9ucy9Db21wb3NpdGlvbiBhbmQgQXJndW1lbnQgQmluZGluZy8vYXJnIHw1MAoKYXJnCj09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgCiAgICB0ZW1wbGF0ZTwgaW50IG4gPiBzdHJ1Y3QgYXJnOwoKICAgIHRlbXBsYXRlPD4gc3RydWN0IGFyZzwxPgogICAgewogICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBBMSxcIHwuLi58IHR5cGVuYW1lIEFcICpuKiA9IHx1bnNwZWNpZmllZHwgPgogICAgICAgIHN0cnVjdCBhcHBseQogICAgICAgIHsKICAgICAgICAgICAgdHlwZWRlZiBBMSB0eXBlOwogICAgICAgIH07CiAgICB9OwoKICAgIHwuLi58CgogICAgdGVtcGxhdGU8PiBzdHJ1Y3QgYXJnPFwgKm4qXD4KICAgIHsKICAgICAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgQTEsXCB8Li4ufCB0eXBlbmFtZSBBXCAqbiogPgogICAgICAgIHN0cnVjdCBhcHBseQogICAgICAgIHsKICAgICAgICAgICAgdHlwZWRlZiBBXCAqbiogdHlwZTsKICAgICAgICB9OwogICAgfTsKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKYGBhcmc8bj5gYCBzcGVjaWFsaXphdGlvbiBpcyBhIHxNZXRhZnVuY3Rpb24gQ2xhc3N8IHRoYXQgcmV0dXJuIHRoZSBgYG5gYFwgdGggb2YgaXRzIGFyZ3VtZW50cy4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvYXJnLmhwcD4KCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBuYGAgICAgICAgICB8IEFuIGludGVncmFsIGNvbnN0YW50ICAgICAgICAgICAgICB8IEEgbnVtYmVyIG9mIGFyZ3VtZW50IHRvIHJldHVybi4gICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgaW50ZWdyYWwgY29uc3RhbnQgYGBuYGAgaW4gdGhlIHJhbmdlIFsxLCB8Qk9PU1RfTVBMX0xJTUlUX01FVEFGVU5DVElPTl9BUklUWXxcXSBhbmQKYXJiaXRyYXJ5IHR5cGVzIHxhMS4uLmFufDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGFwcGx5X3dyYXBcICpuKlw8IGFyZzxcICpuKlwgPixhMSxcIHwuLi58XGFcICpuKiA+Ojp0eXBlIHg7Cgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6U2VtYW50aWNzOgogICAgYGB4YGAgaXMgaWRlbnRpY2FsIHRvIGBgYW5gYC4KCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGFwcGx5X3dyYXBcIGBgNWBgXDwgYXJnPDE+LGJvb2wsY2hhcixzaG9ydCxpbnQsbG9uZyA+Ojp0eXBlIHQxOwogICAgdHlwZWRlZiBhcHBseV93cmFwXCBgYDVgYFw8IGFyZzwzPixib29sLGNoYXIsc2hvcnQsaW50LGxvbmcgPjo6dHlwZSB0MzsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGlzX3NhbWU8IHQxLCBib29sID4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgdDMsIHNob3J0ID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxDb21wb3NpdGlvbiBhbmQgQXJndW1lbnQgQmluZGluZ3wsIHxQbGFjZWhvbGRlcnN8LCB8bGFtYmRhfCwgfGJpbmR8LCB8YXBwbHl8LCB8YXBwbHlfd3JhcHwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==