Li4gTWV0YWZ1bmN0aW9ucy9Db25jZXB0cy8vVGFnIERpc3BhdGNoZWQgTWV0YWZ1bmN0aW9uIHw1MAoKVGFnIERpc3BhdGNoZWQgTWV0YWZ1bmN0aW9uCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKU3VtbWFyeQotLS0tLS0tCgpBIHxUYWcgRGlzcGF0Y2hlZCBNZXRhZnVuY3Rpb258IGlzIGEgfE1ldGFmdW5jdGlvbnwgdGhhdCBlbXBsb3lzIGEKKnRhZyBkaXNwYXRjaGluZyogdGVjaG5pcXVlIGluIGl0cyBpbXBsZW1lbnRhdGlvbiB0byBidWlsZCBhbgppbmZyYXN0cnVjdHVyZSBmb3IgZWFzeSBvdmVycmlkaW5nL2V4dGVuc3Rpb24gb2YgdGhlIG1ldGFmdW5jdGlvbidzCmJlaGF2aW9yLiAKCgpOb3RhdGlvbgotLS0tLS0tLQoKLi4gX2B0YWctbWV0YWZ1bmN0aW9uYDoKCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgU3ltYm9sICAgICAgICAgICAgICAgICAgICB8IExlZ2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgfGBgbmFtZWBgfCAgICAgICAgICAgICAgICB8IEEgcGxhY2Vob2xkZXIgdG9rZW4gZm9yIHRoZSBzcGVjaWZpYyBtZXRhZnVuY3Rpb24ncyBuYW1lLiB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgfGBgdGFnLW1ldGFmdW5jdGlvbmBgfCAgICB8IEEgcGxhY2Vob2xkZXIgdG9rZW4gZm9yIHRoZSB0YWcgbWV0YWZ1bmN0aW9uJ3MgbmFtZS4gICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgfGBgdGFnYGB8ICAgICAgICAgICAgICAgICB8IEEgcGxhY2Vob2xkZXIgdG9rZW4gZm9yIG9uZSBvZiBwb3NzaWJsZSB0YWcgdHlwZXMgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldHVybmVkIGJ5IHRoZSB0YWcgbWV0YWZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgouLiB8YGBuYW1lYGB8IHJlcGxhY2U6OiAqbmFtZSoKLi4gfGBgdGFnLW1ldGFmdW5jdGlvbmBgfCByZXBsYWNlOjogKnRhZy1tZXRhZnVuY3Rpb24qCi4uIHxgYHRhZ2BgfCByZXBsYWNlOjogKnRhZyoKCgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUYWcgPiBzdHJ1Y3QgKm5hbWUqXF9pbXBsOyAKCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFgKICAgICAgICAqWywgLi4uXSoKICAgICAgICA+CiAgICBzdHJ1Y3QgKm5hbWUqCiAgICAgICAgOiAqbmFtZSpcX2ltcGw8IHR5cGVuYW1lICp0YWctbWV0YWZ1bmN0aW9uKlw8WD46OnR5cGUgPgogICAgICAgICAgICA6OnRlbXBsYXRlIGFwcGx5PFggKlssIC4uLl0qPgogICAgewogICAgfTsKCiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVGFnID4gc3RydWN0ICpuYW1lKlxfaW1wbAogICAgewogICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBYICpbLCAuLi5dKiA+IHN0cnVjdCBhcHBseQogICAgICAgIHsKICAgICAgICAgICAgLy8gKmRlZmF1bHQgaW1wbGVtZW50YXRpb24qCiAgICAgICAgfTsKICAgIH07CgogICAgdGVtcGxhdGU8PiBzdHJ1Y3QgKm5hbWUqXF9pbXBsPCp0YWcqPgogICAgewogICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBYICpbLCAuLi5dKiA+IHN0cnVjdCBhcHBseQogICAgICAgIHsKICAgICAgICAgICAgLy8gKnRhZy1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbioKICAgICAgICB9OwogICAgfTsKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKVGhlIHVzdWFsIG1lY2hhbmlzbSBmb3Igb3ZlcnJpZGluZyBhIG1ldGFmdW5jdGlvbidzIGJlaGF2aW9yIGlzIGNsYXNzIAp0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB8LS18IGdpdmVuIGEgbGlicmFyeS1kZWZpbmVkIG1ldGFmdW5jdGlvbiBgYGZgYCwKaXQncyBwb3NzaWJsZSB0byB3cml0ZSBhIHNwZWNpYWxpemF0aW9uIG9mIGBgZmBgIGZvciBhIHNwZWNpZmljIHR5cGUgCmBgdXNlcl90eXBlYGAgdGhhdCB3b3VsZCBoYXZlIHRoZSByZXF1aXJlZCBzZW1hbnRpY3MgWyNzcGVjXV8uCgpXaGlsZSB0aGlzIG1lY2hhbmlzbSBpcyBhbHdheXMgYXZhaWxhYmxlLCBpdCdzIG5vdCBhbHdheXMgdGhlIG1vc3QKY29udmVuaWVudCBvbmUsIGVzcGVjaWFsbHkgaWYgaXQgaXMgZGVzaXJhYmxlIHRvIHNwZWNpYWxpemUgYSAKbWV0YWZ1bmN0aW9uJ3MgYmVoYXZpb3IgZm9yIGEgKmZhbWlseSogb2YgcmVsYXRlZCB0eXBlcy4gQSB0eXBpY2FsIApleGFtcGxlIG9mIGl0IGlzIG51bWJlcmVkIGZvcm1zIG9mIHNlcXVlbmNlIGNsYXNzZXMgaW4gTVBMIGl0c2VsZiAKKGBgbGlzdDBgYCwgLi4uLCBgYGxpc3Q1MGBgLCBldCBhbC4pLCBhbmQgc2VxdWVuY2UgY2xhc3NlcyBpbiBnZW5lcmFsLgoKQSB8VGFnIERpc3BhdGNoZWQgTWV0YWZ1bmN0aW9ufCBpcyBhIGNvbmNlcHQgbmFtZSBmb3IgYW4gaW5zdGFuY2Ugb2YKdGhlIG1ldGFmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBpbmZyYXN0cnVjdHVyZSBiZWluZyBlbXBsb3llZCBieSB0aGUKbGlicmFyeSB0byBtYWtlIGl0IGVhc2llciBmb3IgdXNlcnMgYW5kIGltcGxlbWVudG9ycyB0byBvdmVycmlkZSB0aGUKYmVoYXZpb3Igb2YgbGlicmFyeSdzIG1ldGFmdW5jdGlvbnMgb3BlcmF0aW5nIG9uIGZhbWlsaWVzIG9mIHNwZWNpZmljCnR5cGVzLgoKVGhlIGluZnJhc3RydWN0dXJlIGlzIGJ1aWx0IG9uIGEgdmFyaWF0aW9uIG9mIHRoZSB0ZWNobmlxdWUgY29tbW9ubHkKa25vd24gYXMgKnRhZyBkaXNwYXRjaGluZyogKGhlbmNlIHRoZSBjb25jZXB0IG5hbWUpLCAKYW5kIGludm9sdmVzIHRocmVlIGVudGl0aWVzOiBhIG1ldGFmdW5jdGlvbiBpdHNlbGYsIGFuIGFzc29jaWF0ZWQgCnRhZy1wcm9kdWNpbmcgfHRhZy1tZXRhZnVuY3Rpb258LCBhbmQgdGhlIG1ldGFmdW5jdGlvbidzIAppbXBsZW1lbnRhdGlvbiwgaW4gdGhlIGZvcm0gb2YgYSB8TWV0YWZ1bmN0aW9uIENsYXNzfCB0ZW1wbGF0ZSAKcGFyYW1ldHJpemVkIGJ5IGEgYGBUYWdgYCB0eXBlIHBhcmFtZXRlci4gVGhlIG1ldGFmdW5jdGlvbiByZWRpcmVjdHMKdG8gaXRzIGltcGxlbWVudGF0aW9uIGNsYXNzIHRlbXBsYXRlIGJ5IGludm9raW5nIGl0cyBzcGVjaWFsaXphdGlvbiAKb24gYSB0YWcgdHlwZSBwcm9kdWNlZCBieSB0aGUgdGFnIG1ldGFmdW5jdGlvbiB3aXRoIHRoZSBvcmlnaW5hbCAKbWV0YWZ1bmN0aW9uJ3MgcGFyYW1ldGVycy4KCgouLiBbI3NwZWNdIFVzdWFsbHkgc3VjaCB1c2VyLWRlZmluZWQgc3BlY2lhbGl6YXRpb24gaXMgc3RpbGwgcmVxdWlyZWQgCiAgIHRvIHByZXNlcnZlIHRoZSBgYGZgYCdzIG9yaWdpbmFsIGludmFyaWFudHMgYW5kIGNvbXBsZXhpdHkgcmVxdWlyZW1lbnRzLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgI2luY2x1ZGUgPGJvb3N0L21wbC9zaXplLmhwcD4KCiAgIG5hbWVzcGFjZSB1c2VyIHsKCiAgIHN0cnVjdCBiaXRzZXRfdGFnOwoKICAgc3RydWN0IGJpdHNldDAKICAgewogICAgICAgdHlwZWRlZiBiaXRzZXRfdGFnIHRhZzsKICAgICAgIC8vIC4uLgogICB9OwoKICAgdGVtcGxhdGU8IHR5cGVuYW1lIEIwID4gc3RydWN0IGJpdHNldDEKICAgewogICAgICAgdHlwZWRlZiBiaXRzZXRfdGFnIHRhZzsKICAgICAgIC8vIC4uLgogICB9OwoKICAgdGVtcGxhdGU8IHR5cGVuYW1lIEIwLCAqLi4uLCogdHlwZW5hbWUgQlwgKm4qID4gc3RydWN0IGJpdHNldFwgKm4qCiAgIHsKICAgICAgIHR5cGVkZWYgYml0c2V0X3RhZyB0YWc7CiAgICAgICAvLyAuLi4KICAgfTsKCiAgIH0gLy8gbmFtZXNwYWNlIHVzZXIKCiAgIG5hbWVzcGFjZSBib29zdCB7IG5hbWVzcGFjZSBtcGwgewogICB0ZW1wbGF0ZTw+IHN0cnVjdCBzaXplX2ltcGw8dXNlcjo6Yml0c2V0X3RhZz4KICAgewogICAgICAgdGVtcGxhdGU8IHR5cGVuYW1lIEJpdHNldCA+IHN0cnVjdCBhcHBseQogICAgICAgewogICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQml0c2V0OjpzaXplIHR5cGU7CiAgICAgICB9OwogICB9OwogICB9fQoKCk1vZGVscwotLS0tLS0tCgoqIHxzZXF1ZW5jZV90YWd8CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxNZXRhZnVuY3Rpb258LCB8TWV0YWZ1bmN0aW9uIENsYXNzfCwgfE51bWVyaWMgTWV0YWZ1bmN0aW9ufAoKCi4uIHx0YWctbWV0YWZ1bmN0aW9ufCByZXBsYWNlOjogYHRhZyBtZXRhZnVuY3Rpb25zYF8KLi4gX2B0YWcgbWV0YWZ1bmN0aW9uc2A6IGB0YWctbWV0YWZ1bmN0aW9uYF8KCi4uIHx0YWcgZGlzcGF0Y2hlZHwgcmVwbGFjZTo6IGB0YWcgZGlzcGF0Y2hlZGBfCi4uIF9gdGFnIGRpc3BhdGNoZWRgOiBgVGFnIERpc3BhdGNoZWQgTWV0YWZ1bmN0aW9uYF8KCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==