Li4gTWV0YWZ1bmN0aW9ucy9Db21wb3NpdGlvbiBhbmQgQXJndW1lbnQgQmluZGluZy8vXzEsXzIsLi4uX24gfDEwCgpQbGFjZWhvbGRlcnMKPT09PT09PT09PT09Ci4uIF9gcGxhY2Vob2xkZXJgOgoKClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgewogICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IF87CiAgICB0eXBlZGVmIGFyZzwxPiAgICAgIF8xOwogICAgdHlwZWRlZiBhcmc8Mj4gICAgICBfMjsKICAgIHwuLi58CiAgICB0eXBlZGVmIGFyZzxcICpuKlwgPiAgICAgIF9cICpuKlwgOwogICAgfQogICAgCiAgICB1c2luZyBwbGFjZWhvbGRlcnM6Ol87CiAgICB1c2luZyBwbGFjZWhvbGRlcnM6Ol8xOwogICAgdXNpbmcgcGxhY2Vob2xkZXJzOjpfMjsKICAgIHwuLi58CiAgICB1c2luZyBwbGFjZWhvbGRlcnM6Ol9cICpuKlwgOwogICAgCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKQSBwbGFjZWhvbGRlciBpbiBhIGZvcm0gYGBfYGBcICpuKiBpcyBzaW1wbHkgYSBzeW5vbnltIGZvciB0aGUgY29ycmVzcG9uZGluZyAKYGBhcmc8bj5gYCBzcGVjaWFsaXphdGlvbi4gVGhlIHVubmFtZWQgcGxhY2Vob2xkZXIgYGBfYGAgKHVuZGVyc2NvcmUpIGNhcnJpZXMgCmBzcGVjaWFsIG1lYW5pbmdgX18gaW4gYmluZCBhbmQgbGFtYmRhIGV4cHJlc3Npb25zLCBhbmQgZG9lcyBub3QgaGF2ZSAKZGVmaW5lZCBzZW1hbnRpY3Mgb3V0c2lkZSBvZiB0aGVzZSBjb250ZXh0cy4KClBsYWNlaG9sZGVyIG5hbWVzIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSBpbiB0aGUgdXNlciBuYW1lc3BhY2UgdGhyb3VnaCAKYGB1c2luZyBuYW1lc3BhY2UgbXBsOjpwbGFjZWhvbGRlcnM7YGAgZGlyZWN0aXZlLgoKX18gYGJpbmQgc2VtYW50aWNzYF8KCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9wbGFjZWhvbGRlcnMuaHBwPgoKfE5vdGU6fCBUaGUgaW5jbHVkZSBtaWdodCBiZSBvbWl0dGVkIHdoZW4gdXNpbmcgcGxhY2Vob2xkZXJzIHRvIGNvbnN0cnVjdCBhIHxMYW1iZGEKRXhwcmVzc2lvbnwgZm9yIHBhc3NpbmcgaXQgdG8gTVBMJ3Mgb3duIGFsZ29yaXRobSBvciBtZXRhZnVuY3Rpb246IGFueSBsaWJyYXJ5IApjb21wb25lbnQgdGhhdCBpcyBkb2N1bWVudGVkIHRvIGFjY2VwdCBhIGxhbWJkYSBleHByZXNzaW9uIG1ha2VzIHRoZSBwbGFjZWhvbGRlcnMgCmltcGxpY2l0bHkgYXZhaWxhYmxlIGZvciB0aGUgdXNlciBjb2RlIHwtLSBlbmQgbm90ZXwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCk5vbmUuCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgaW50ZWdyYWwgY29uc3RhbnQgYGBuYGAgaW4gdGhlIHJhbmdlIFsxLCB8Qk9PU1RfTVBMX0xJTUlUX01FVEFGVU5DVElPTl9BUklUWXxcXSBhbmQKYXJiaXRyYXJ5IHR5cGVzIHxhMS4uLmFufDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBhcHBseV93cmFwXCAqbipcPF9cICpuKlwsYTEsXCB8Li4ufFxhXCAqbipcID46OnR5cGUgeDsKCjpSZXR1cm4gdHlwZToKICAgIEEgdHlwZS4KCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvCiAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHR5cGVkZWYgYXBwbHlfd3JhcFwgKm4qXDwgYXJnPFwgKm4qXCA+LGExLFwgfC4uLnxcYVwgKm4qID46OnR5cGUgeDsKICAgIAoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgYXBwbHlfd3JhcFwgYGA1YGBcPCBfMSxib29sLGNoYXIsc2hvcnQsaW50LGxvbmcgPjo6dHlwZSB0MTsKICAgIHR5cGVkZWYgYXBwbHlfd3JhcFwgYGA1YGBcPCBfMyxib29sLGNoYXIsc2hvcnQsaW50LGxvbmcgPjo6dHlwZSB0MzsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGlzX3NhbWU8IHQxLCBib29sID4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgdDMsIHNob3J0ID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxDb21wb3NpdGlvbiBhbmQgQXJndW1lbnQgQmluZGluZ3wsIHxhcmd8LCB8bGFtYmRhfCwgfGJpbmR8LCB8YXBwbHl8LCB8YXBwbHlfd3JhcHwKCgouLiB8cGxhY2Vob2xkZXJ8IHJlcGxhY2U6OiBgcGxhY2Vob2xkZXJgXwoKLi4gfF8xfCByZXBsYWNlOjogYF8xYF8KLi4gfF8yfCByZXBsYWNlOjogYF8yYF8KLi4gfF8zfCByZXBsYWNlOjogYF8zYF8KLi4gfF80fCByZXBsYWNlOjogYF80YF8KLi4gfF81fCByZXBsYWNlOjogYF81YF8KCi4uIF9gXzFgOiBgUGxhY2Vob2xkZXJzYF8KLi4gX2BfMmA6IGBQbGFjZWhvbGRlcnNgXwouLiBfYF8zYDogYFBsYWNlaG9sZGVyc2BfCi4uIF9gXzRgOiBgUGxhY2Vob2xkZXJzYF8KLi4gX2BfNWA6IGBQbGFjZWhvbGRlcnNgXwoKLi4gfF8xLF8yLC4uLl9ufCByZXBsYWNlOjogfF8xfCwgfF8yfCwgfF8zfCxcIHwuLi58CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=