IyBqbmRuLW1hbmFnZW1lbnQKClRoaXMgcHJvamVjdCBjb25zaXN0cyBvZiB0b29scyBmb3IgbWFuYWdpbmcgYW4gTkROIGZvcndhcmRpbmcgZGFlbW9uIChORkQpLiBJdCByZWxpZXMgb24gdGhlIFtORE4gUHJvdG9jb2xdKGh0dHBzOi8vbmFtZWQtZGF0YS5uZXQpIGFuZCBpdHMgYXNzb2NpYXRlZCBbY2xpZW50IGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9uYW1lZC1kYXRhL2puZG4pLiBJdCBpbXBsZW1lbnRzIHRoZSBORkQgbWFuYWdlbWVudCBzcGVjaWZpY2F0aW9uIG91dGxpbmVkIGF0IGh0dHA6Ly9yZWRtaW5lLm5hbWVkLWRhdGEubmV0L3Byb2plY3RzL25mZC93aWtpL01hbmFnZW1lbnQuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBsaWJyYXJ5IGRvZXMgbm90IHlldCBpbXBsZW1lbnQgYWxsIG9mIHRoZSBjb21tYW5kcyBpbiB0aGUgbWFuYWdlbWVudCBzcGVjaWZpY2F0aW9uLgoKIyMgSW5zdGFsbApXaXRoIE1hdmVuLCBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIFBPTToKYGBgCjxkZXBlbmRlbmN5PgogIDxncm91cElkPmNvbS5pbnRlbC5qbmRuLm1hbmFnZW1lbnQ8L2dyb3VwSWQ+Cgk8YXJ0aWZhY3RJZD5qbmRuLW1hbmFnZW1lbnQ8L2FydGlmYWN0SWQ+Cgk8dmVyc2lvbj5SRUxFQVNFPC92ZXJzaW9uPiA8IS0tIG9yIGEgc3BlY2lmaWMgdmVyc2lvbiAtLT4KPC9kZXBlbmRlbmN5PgpgYGAKCiMjIFVzZQpXaXRoIGEgRmFjZSB0aGF0IGhhcyBjb21tYW5kIHNpZ25pbmcgaW5mb3JtYXRpb24gc2V0LCBjYWxsIGFueSBvZiB0aGUgZm9sbG93aW5nIHN0YXRpYyBtZXRob2RzOgogLSBfX05GRC5waW5nTG9jYWwoRmFjZSBmb3J3YXJkZXIpX186IHBpbmcgYSBsb2NhbCBORkQgd2l0aCAvbG9jYWxob3N0L25mZCB0byB2ZXJpZnkgaWYgaXQgZXhpc3RzLgogLSBfX05GRC5nZXRGYWNlTGlzdChGYWNlIGZvcndhcmRlcilfXzogcmV0cmlldmUgYWxsIGNvbm5lY3RlZCBmYWNlcy4KIC0gX19ORkQuZ2V0RmliTGlzdChGYWNlIGZvcndhcmRlcilfXzogcmV0cmlldmUgYWxsIGZvcndhcmRpbmcgZW50cmllcyBpbiB0aGUgRm9yd2FyZGluZyBJbmZvcm1hdGlvbiBCYXNlIChGSUIpLgogLSBfX05GRC5nZXRSaWJMaXN0KEZhY2UgZm9yd2FyZGVyKV9fOiByZXRyaWV2ZSBhbGwgcm91dGluZyBlbnRyaWVzIGluIHRoZSBSb3V0aW5nIEluZm9ybWF0aW9uIEJhc2UgKFJJQikuCiAtIF9fTkZELmNyZWF0ZUZhY2UoRmFjZSBmb3J3YXJkZXIsIFN0cmluZyB1cmkpX186IGNyZWF0ZSBhIG5ldyBmYWNlIG9uIHRoZSBORkQgb3BlbmVkIHRvIHRoZSBnaXZlbiBVUkkuCiAtIF9fTkZELnJlZ2lzdGVyKEZhY2UgZm9yd2FyZGVyLCAuLi4pX186IGluY2x1ZGVzIHNldmVyYWwgc2ltaWxhciBtZXRob2RzIGZvciByZWdpc3RlcmluZyBhIG5ldyByb3V0ZSBvbiB0aGUgTkZELgogLSBfX05GRC51bnJlZ2lzdGVyKEZhY2UgZm9yd2FyZGVyLCBOYW1lIHJvdXRlKV9fOiB1bnJlZ2lzdGVyIGEgcm91dGUgYnkgbmFtZS4KIC0gX19ORkQuc2V0U3RyYXRlZ3koRmFjZSBmb3J3YXJkZXIsIE5hbWUgcHJlZml4LCBOYW1lIHN0cmF0ZWd5KV9fOiBzZXQgdGhlIGZvcndhcmRpbmcgc3RyYXRlZ3kgZm9yIHRoZSBnaXZlbiBwcmVmaXguCgojIyBMaWNlbnNlCqkgQ29weXJpZ2h0IEludGVsIENvcnBvcmF0aW9uLiBMaWNlbnNlZCB1bmRlciBMR1BMdjMsIHNlZSBbTElDRU5TRV0oaHR0cHM6Ly9naXRodWIuY29tLzAxb3JnL2puZG4tbWFuYWdlbWVudC9ibG9iL21hc3Rlci9MSUNFTlNFKS4K