Mw0NCn2EhGMevQAA4wAAAAAAAAAAAAAAAAwAAABAAAAAc8gBAABkAFoAZAFkAmwBWgFkAWQCbAJaAmQBZAJsA1oDZAFkAmwEWgRkAWQCbAVaBWQBZAJsBloGZAFkAmwHWgdkAWQCbAhaCGQBZAJsCVoJZANaCmUEagtqDGQEZAWDAloNZQRqC2oMZAZkB4MCWg5kCFoPZAlkCmkBWhBkCmQKZAtkC2QLZAycBVoRZA1kC2kBWhJlBWoTZA6DAVoUZQVqE2QPgwFaFWQQZBFkEmUPZBNkFGQVZgdaFmRGZBdkGIQBWhdkGWQahABaGGRHZBxkHYQBWhlkSGQeZB+EAVoaZElkIGQhhAFaG2RKZCJkI4QBWhxkS2QkZCWEAVodZExkJmQnhAFaHmQoZCmEAFofZCpkK4QAWiBkTWQsZC2EAVohZC5kL4QAWiJkMGQxhABaI2QyZDOEAFokZDRkNYQAWiVkNmQ3hABaJmQ4ZDmEAFonZDpkO4QAWihkPGQ9hABaKXkQZAFkPmwqbStaKwEAVwBuJgQAZSxrCpABcpQBAAEAAQBHAGQ/ZECEAGRAZS2DA1orWQBuAlgARwBkQWRChABkQmUtgwNaLmUugwBaL2RDZESEAFowZTFkRWsCkAFyxGUwgwABAGQCUwApTmH7AgAAClRoZSBgYGRpc3Ryb2BgIHBhY2thZ2UgKGBgZGlzdHJvYGAgc3RhbmRzIGZvciBMaW51eCBEaXN0cmlidXRpb24pIHByb3ZpZGVzCmluZm9ybWF0aW9uIGFib3V0IHRoZSBMaW51eCBkaXN0cmlidXRpb24gaXQgcnVucyBvbiwgc3VjaCBhcyBhIHJlbGlhYmxlCm1hY2hpbmUtcmVhZGFibGUgZGlzdHJvIElELCBvciB2ZXJzaW9uIGluZm9ybWF0aW9uLgoKSXQgaXMgdGhlIHJlY29tbWVuZGVkIHJlcGxhY2VtZW50IGZvciBQeXRob24ncyBvcmlnaW5hbAo6cHk6ZnVuYzpgcGxhdGZvcm0ubGludXhfZGlzdHJpYnV0aW9uYCBmdW5jdGlvbiwgYnV0IGl0IHByb3ZpZGVzIG11Y2ggbW9yZQpmdW5jdGlvbmFsaXR5LiBBbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBiZWNhbWUgbmVjZXNzYXJ5IGJlY2F1c2UgUHl0aG9uCjMuNSBkZXByZWNhdGVkIHRoaXMgZnVuY3Rpb24sIGFuZCBQeXRob24gMy44IHJlbW92ZWQgaXQgYWx0b2dldGhlci4gSXRzCnByZWRlY2Vzc29yIGZ1bmN0aW9uIDpweTpmdW5jOmBwbGF0Zm9ybS5kaXN0YCB3YXMgYWxyZWFkeSBkZXByZWNhdGVkIHNpbmNlClB5dGhvbiAyLjYgYW5kIHJlbW92ZWQgaW4gUHl0aG9uIDMuOC4gU3RpbGwsIHRoZXJlIGFyZSBtYW55IGNhc2VzIGluIHdoaWNoCmFjY2VzcyB0byBPUyBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24gaXMgbmVlZGVkLiBTZWUgYFB5dGhvbiBpc3N1ZSAxMzIyCjxodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEzMjI+YF8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCukAAAAATnoFMS42LjBaC1VOSVhDT05GRElSegQvZXRjWg1VTklYVVNSTElCRElSeggvdXNyL2xpYnoKb3MtcmVsZWFzZdoCb2xaBm9yYWNsZVoEcmhlbCkFWhZlbnRlcnByaXNlZW50ZXJwcmlzZWFzWhplbnRlcnByaXNlZW50ZXJwcmlzZXNlcnZlclobcmVkaGF0ZW50ZXJwcmlzZXdvcmtzdGF0aW9uWhZyZWRoYXRlbnRlcnByaXNlc2VydmVyWhtyZWRoYXRlbnRlcnByaXNlY29tcHV0ZW5vZGXaBnJlZGhhdHpBKD86W14pXSpcKSguKilcKCk/ICooPzpTVEwgKT8oW1xkLitcLWEtel0qXGQpICooPzplc2FlbGVyICopPyguKyl6GyhcdyspWy1fXShyZWxlYXNlfHZlcnNpb24pJFoOZGViaWFuX3ZlcnNpb256C2xzYi1yZWxlYXNlegtvZW0tcmVsZWFzZXoOc3lzdGVtLXJlbGVhc2V6DXBsZXNrLXJlbGVhc2V6EGlyZWRtYWlsLXJlbGVhc2VUYwEAAAAAAAAAAQAAAAUAAABDAAAAcxoAAAB0AGoBZAF0AmQCZAONAwEAdANqBHwAgwFTACkEYUcFAAAKICAgIC4uIGRlcHJlY2F0ZWQ6OiAxLjYuMAoKICAgICAgICA6ZnVuYzpgZGlzdHJvLmxpbnV4X2Rpc3RyaWJ1dGlvbigpYCBpcyBkZXByZWNhdGVkLiBJdCBzaG91bGQgb25seSBiZQogICAgICAgIHVzZWQgYXMgYSBjb21wYXRpYmlsaXR5IHNoaW0gd2l0aCBQeXRob24ncwogICAgICAgIDpweTpmdW5jOmBwbGF0Zm9ybS5saW51eF9kaXN0cmlidXRpb24oKWAuIFBsZWFzZSB1c2UgOmZ1bmM6YGRpc3Ryby5pZGAsCiAgICAgICAgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYCBhbmQgOmZ1bmM6YGRpc3Ryby5uYW1lYCBpbnN0ZWFkLgoKICAgIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24gYXMgYSB0dXBsZQogICAgYGAoaWRfbmFtZSwgdmVyc2lvbiwgY29kZW5hbWUpYGAgd2l0aCBpdGVtcyBhcyBmb2xsb3dzOgoKICAgICogYGBpZF9uYW1lYGA6ICBJZiAqZnVsbF9kaXN0cmlidXRpb25fbmFtZSogaXMgZmFsc2UsIHRoZSByZXN1bHQgb2YKICAgICAgOmZ1bmM6YGRpc3Ryby5pZGAuIE90aGVyd2lzZSwgdGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm5hbWVgLgoKICAgICogYGB2ZXJzaW9uYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAuCgogICAgKiBgYGNvZGVuYW1lYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uY29kZW5hbWVgLgoKICAgIFRoZSBpbnRlcmZhY2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9yaWdpbmFsCiAgICA6cHk6ZnVuYzpgcGxhdGZvcm0ubGludXhfZGlzdHJpYnV0aW9uYCBmdW5jdGlvbiwgc3VwcG9ydGluZyBhIHN1YnNldCBvZgogICAgaXRzIHBhcmFtZXRlcnMuCgogICAgVGhlIGRhdGEgaXQgcmV0dXJucyBtYXkgbm90IGV4YWN0bHkgYmUgdGhlIHNhbWUsIGJlY2F1c2UgaXQgdXNlcyBtb3JlIGRhdGEKICAgIHNvdXJjZXMgdGhhbiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sIGFuZCB0aGF0IG1heSBsZWFkIHRvIGRpZmZlcmVudCBkYXRhIGlmCiAgICB0aGUgT1MgZGlzdHJpYnV0aW9uIGlzIG5vdCBjb25zaXN0ZW50IGFjcm9zcyBtdWx0aXBsZSBkYXRhIHNvdXJjZXMgaXQKICAgIHByb3ZpZGVzICh0aGVyZSBhcmUgaW5kZWVkIHN1Y2ggZGlzdHJpYnV0aW9ucyAuLi4pLgoKICAgIEFub3RoZXIgcmVhc29uIGZvciBkaWZmZXJlbmNlcyBpcyB0aGUgZmFjdCB0aGF0IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYAogICAgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlIGRpc3RybyBJRCBzdHJpbmcgdG8gYSByZWxpYWJsZSBtYWNoaW5lLXJlYWRhYmxlIHZhbHVlCiAgICBmb3IgYSBudW1iZXIgb2YgcG9wdWxhciBPUyBkaXN0cmlidXRpb25zLgogICAgespkaXN0cm8ubGludXhfZGlzdHJpYnV0aW9uKCkgaXMgZGVwcmVjYXRlZC4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyBhIGNvbXBhdGliaWxpdHkgc2hpbSB3aXRoIFB5dGhvbidzIHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbigpLiBQbGVhc2UgdXNlIGRpc3Ryby5pZCgpLCBkaXN0cm8udmVyc2lvbigpIGFuZCBkaXN0cm8ubmFtZSgpIGluc3RlYWQu6QIAAAApAdoKc3RhY2tsZXZlbCkF2gh3YXJuaW5nc9oEd2FybtoSRGVwcmVjYXRpb25XYXJuaW5n2gdfZGlzdHJv2hJsaW51eF9kaXN0cmlidXRpb24pAdoWZnVsbF9kaXN0cmlidXRpb25fbmFtZakAcgwAAAD6gy9ob21lL3VldGxoci9Eb2N1bWVudHMvU2VybW9QbG90X2JhY2tlbmQvZHJhZnRfU1JBTV9ibGFja2JveC9VRVRSVl9FU29DX3YyL3ZlbnYvbGliNjQvcHl0aG9uMy42L3NpdGUtcGFja2FnZXMvcGlwL192ZW5kb3IvZGlzdHJvLnB5cgoAAACIAAAAcwoAAAAAIQQBAgMCAQgCcgoAAABjAAAAAAAAAAAAAAAAAQAAAEMAAABzCAAAAHQAagGDAFMAKQFhRAsAAAogICAgUmV0dXJuIHRoZSBkaXN0cm8gSUQgb2YgdGhlIGN1cnJlbnQgZGlzdHJpYnV0aW9uLCBhcyBhCiAgICBtYWNoaW5lLXJlYWRhYmxlIHN0cmluZy4KCiAgICBGb3IgYSBudW1iZXIgb2YgT1MgZGlzdHJpYnV0aW9ucywgdGhlIHJldHVybmVkIGRpc3RybyBJRCB2YWx1ZSBpcwogICAgKnJlbGlhYmxlKiwgaW4gdGhlIHNlbnNlIHRoYXQgaXQgaXMgZG9jdW1lbnRlZCBhbmQgdGhhdCBpdCBkb2VzIG5vdCBjaGFuZ2UKICAgIGFjcm9zcyByZWxlYXNlcyBvZiB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIFRoaXMgcGFja2FnZSBtYWludGFpbnMgdGhlIGZvbGxvd2luZyByZWxpYWJsZSBkaXN0cm8gSUQgdmFsdWVzOgoKICAgID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgRGlzdHJvIElEICAgICAgIERpc3RyaWJ1dGlvbgogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAidWJ1bnR1IiAgICAgICAgVWJ1bnR1CiAgICAiZGViaWFuIiAgICAgICAgRGViaWFuCiAgICAicmhlbCIgICAgICAgICAgUmVkSGF0IEVudGVycHJpc2UgTGludXgKICAgICJjZW50b3MiICAgICAgICBDZW50T1MKICAgICJmZWRvcmEiICAgICAgICBGZWRvcmEKICAgICJzbGVzIiAgICAgICAgICBTVVNFIExpbnV4IEVudGVycHJpc2UgU2VydmVyCiAgICAib3BlbnN1c2UiICAgICAgb3BlblNVU0UKICAgICJhbWF6b24iICAgICAgICBBbWF6b24gTGludXgKICAgICJhcmNoIiAgICAgICAgICBBcmNoIExpbnV4CiAgICAiY2xvdWRsaW51eCIgICAgQ2xvdWRMaW51eCBPUwogICAgImV4aGVyYm8iICAgICAgIEV4aGVyYm8gTGludXgKICAgICJnZW50b28iICAgICAgICBHZW5Ub28gTGludXgKICAgICJpYm1fcG93ZXJrdm0iICBJQk0gUG93ZXJLVk0KICAgICJrdm1pYm0iICAgICAgICBLVk0gZm9yIElCTSB6IFN5c3RlbXMKICAgICJsaW51eG1pbnQiICAgICBMaW51eCBNaW50CiAgICAibWFnZWlhIiAgICAgICAgTWFnZWlhCiAgICAibWFuZHJpdmEiICAgICAgTWFuZHJpdmEgTGludXgKICAgICJwYXJhbGxlbHMiICAgICBQYXJhbGxlbHMKICAgICJwaWRvcmEiICAgICAgICBQaWRvcmEKICAgICJyYXNwYmlhbiIgICAgICBSYXNwYmlhbgogICAgIm9yYWNsZSIgICAgICAgIE9yYWNsZSBMaW51eCAoYW5kIE9yYWNsZSBFbnRlcnByaXNlIExpbnV4KQogICAgInNjaWVudGlmaWMiICAgIFNjaWVudGlmaWMgTGludXgKICAgICJzbGFja3dhcmUiICAgICBTbGFja3dhcmUKICAgICJ4ZW5zZXJ2ZXIiICAgICBYZW5TZXJ2ZXIKICAgICJvcGVuYnNkIiAgICAgICBPcGVuQlNECiAgICAibmV0YnNkIiAgICAgICAgTmV0QlNECiAgICAiZnJlZWJzZCIgICAgICAgRnJlZUJTRAogICAgIm1pZG5pZ2h0YnNkIiAgIE1pZG5pZ2h0QlNECiAgICA9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBJZiB5b3UgaGF2ZSBhIG5lZWQgdG8gZ2V0IGRpc3Ryb3MgZm9yIHJlbGlhYmxlIElEcyBhZGRlZCBpbnRvIHRoaXMgc2V0LAogICAgb3IgaWYgeW91IGZpbmQgdGhhdCB0aGUgOmZ1bmM6YGRpc3Ryby5pZGAgZnVuY3Rpb24gcmV0dXJucyBhIGRpZmZlcmVudAogICAgZGlzdHJvIElEIGZvciBvbmUgb2YgdGhlIGxpc3RlZCBkaXN0cm9zLCBwbGVhc2UgY3JlYXRlIGFuIGlzc3VlIGluIHRoZQogICAgYGRpc3RybyBpc3N1ZSB0cmFja2VyYF8uCgogICAgKipMb29rdXAgaGllcmFyY2h5IGFuZCB0cmFuc2Zvcm1hdGlvbnM6KioKCiAgICBGaXJzdCwgdGhlIElEIGlzIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzLCBpbiB0aGUgc3BlY2lmaWVkCiAgICBvcmRlci4gVGhlIGZpcnN0IGF2YWlsYWJsZSBhbmQgbm9uLWVtcHR5IHZhbHVlIGlzIHVzZWQ6CgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJJRCIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsCgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJEaXN0cmlidXRvciBJRCIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICBjb21tYW5kLAoKICAgICogdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZpbGUgbmFtZSBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSwKCiAgICBUaGUgc28gZGV0ZXJtaW5lZCBJRCB2YWx1ZSB0aGVuIHBhc3NlcyB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybWF0aW9ucywKICAgIGJlZm9yZSBpdCBpcyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZDoKCiAgICAqIGl0IGlzIHRyYW5zbGF0ZWQgdG8gbG93ZXIgY2FzZSwKCiAgICAqIGJsYW5rcyAod2hpY2ggc2hvdWxkIG5vdCBiZSB0aGVyZSBhbnl3YXkpIGFyZSB0cmFuc2xhdGVkIHRvIHVuZGVyc2NvcmVzLAoKICAgICogYSBub3JtYWxpemF0aW9uIG9mIHRoZSBJRCBpcyBwZXJmb3JtZWQsIGJhc2VkIHVwb24KICAgICAgYG5vcm1hbGl6YXRpb24gdGFibGVzYF8uIFRoZSBwdXJwb3NlIG9mIHRoaXMgbm9ybWFsaXphdGlvbiBpcyB0byBlbnN1cmUKICAgICAgdGhhdCB0aGUgSUQgaXMgYXMgcmVsaWFibGUgYXMgcG9zc2libGUsIGV2ZW4gYWNyb3NzIGluY29tcGF0aWJsZSBjaGFuZ2VzCiAgICAgIGluIHRoZSBPUyBkaXN0cmlidXRpb25zLiBBIGNvbW1vbiByZWFzb24gZm9yIGFuIGluY29tcGF0aWJsZSBjaGFuZ2Ug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bi1lbXB0eSAoZS5nLiAiNy4wIChNYWlwbykiKS4KCiAgICBTb21lIGRpc3RyaWJ1dGlvbnMgcHJvdmlkZSB2ZXJzaW9uIG51bWJlcnMgd2l0aCBkaWZmZXJlbnQgcHJlY2lzaW9ucyBpbgogICAgdGhlIGRpZmZlcmVudCBzb3VyY2VzIG9mIGRpc3RyaWJ1dGlvbiBpbmZvcm1hdGlvbi4gRXhhbWluaW5nIHRoZSBkaWZmZXJlbnQKICAgIHNvdXJjZXMgaW4gYSBmaXhlZCBwcmlvcml0eSBvcmRlciBkb2VzIG5vdCBhbHdheXMgeWllbGQgdGhlIG1vc3QgcHJlY2lzZQogICAgdmVyc2lvbiAoZS5nLiBmb3IgRGViaWFuIDguMiwgb3IgQ2VudE9TIDcuMSkuCgogICAgVGhlICpiZXN0KiBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgYXBwcm9hY2ggZm9yIHRoZSByZXR1cm5lZAogICAgdmVyc2lvbjoKCiAgICBJZiAqYmVzdCogaXMgZmFsc2UsIHRoZSBmaXJzdCBub24tZW1wdHkgdmVyc2lvbiBudW1iZXIgaW4gcHJpb3JpdHkgb3JkZXIgb2YKICAgIHRoZSBleGFtaW5lZCBzb3VyY2VzIGlzIHJldHVybmVkLgoKICAgIElmICpiZXN0KiBpcyB0cnVlLCB0aGUgbW9zdCBwcmVjaXNlIHZlcnNpb24gbnVtYmVyIG91dCBvZiBhbGwgZXhhbWluZWQKICAgIHNvdXJjZXMgaXMgcmV0dXJuZWQuCgogICAgKipMb29rdXAgaGllcmFyY2h5OioqCgogICAgSW4gYWxsIGNhc2VzLCB0aGUgdmVyc2lvbiBudW1iZXIgaXMgb2J0YWluZWQgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZXMuCiAgICBJZiAqYmVzdCogaXMgZmFsc2UsIHRoaXMgb3JkZXIgcmVwcmVzZW50cyB0aGUgcHJpb3JpdHkgb3JkZXI6CgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJWRVJTSU9OX0lEIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiUmVsZWFzZSIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICBjb21tYW5kLAogICAgKiB0aGUgdmVyc2lvbiBudW1iZXIgcGFyc2VkIGZyb20gdGhlICI8dmVyc2lvbl9pZD4iIGZpZWxkIG9mIHRoZSBmaXJzdCBsaW5lCiAgICAgIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLAogICAgKiB0aGUgdmVyc2lvbiBudW1iZXIgcGFyc2VkIGZyb20gdGhlICJQUkVUVFlfTkFNRSIgYXR0cmlidXRlIG9mIHRoZQogICAgICBvcy1yZWxlYXNlIGZpbGUsIGlmIGl0IGZvbGxvd3MgdGhlIGZvcm1hdCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZXMuCiAgICAqIHRoZSB2ZXJzaW9uIG51bWJlciBwYXJzZWQgZnJvbSB0aGUgIkRlc2NyaXB0aW9uIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkKICAgICAgdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQsIGlmIGl0IGZvbGxvd3MgdGhlIGZvcm1hdCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UKICAgICAgZmlsZXMuCiAgICApAnIJAAAA2gd2ZXJzaW9uKQJyEAAAANoEYmVzdHIMAAAAcgwAAAByDQAAAHIRAAAAKwEAAHMCAAAAACpyEQAAAGMBAAAAAAAAAAEAAAACAAAAQwAAAHMKAAAAdABqAXwAgwFTACkBYaABAAAKICAgIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24gYXMgYSB0dXBsZQogICAgYGAobWFqb3IsIG1pbm9yLCBidWlsZF9udW1iZXIpYGAgd2l0aCBpdGVtcyBhcyBmb2xsb3dzOgoKICAgICogYGBtYWpvcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm1ham9yX3ZlcnNpb25gLgoKICAgICogYGBtaW5vcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm1pbm9yX3ZlcnNpb25gLgoKICAgICogYGBidWlsZF9udW1iZXJgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ry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dGhlIG9zLXJlbGVhc2UgZmlsZS4KICAgIEZvciBkZXRhaWxzLCBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSAiSURfTElLRSIgYXR0cmlidXRlIGluIHRoZQogICAgYG9zLXJlbGVhc2UgbWFuIHBhZ2UKICAgIDxodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9zeXN0ZW1kL21hbi9vcy1yZWxlYXNlLmh0bWw+YF8uCiAgICApAnIJAAAA2gRsaWtlcgwAAAByDAAAAHIMAAAAcg0AAAByFwAAAJQBAABzAgAAAAAPchcAAABjAAAAAAAAAAAAAAAAAQAAAEMAAABzCAAAAHQAagGDAFMAKQFhpgIAAAogICAgUmV0dXJuIHRoZSBjb2RlbmFtZSBmb3IgdGhlIHJlbGVhc2Ugb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLAogICAgYXMgYSBzdHJpbmcuCgogICAgSWYgdGhlIGRpc3RyaWJ1dGlvbiBkb2VzIG5vdCBoYXZlIGEgY29kZW5hbWUsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KCiAgICBOb3RlIHRoYXQgdGhlIHJldHVybmVkIGNvZGVuYW1lIGlzIG5vdCBhbHdheXMgcmVhbGx5IGEgY29kZW5hbWUuIEZvcgogICAgZXhhbXBsZSwgb3BlblNVU0UgcmV0dXJucyAieDg2XzY0Ii4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYW5kbGUgc3VjaAogICAgY2FzZXMgaW4gYW55IHNwZWNpYWwgd2F5IGFuZCBqdXN0IHJldHVybnMgdGhlIHN0cmluZyBpdCBmaW5kcywgaWYgYW55LgoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgICogdGhlIGNvZGVuYW1lIHdpdGhpbiB0aGUgIlZFUlNJT04iIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLCBpZgogICAgICBwcm92aWRlZCwKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIkNvZGVuYW1lIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsCgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICI8Y29kZW5hbWU+IiBmaWVsZCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZS4KICAgICkCcgkAAADaCGNvZGVuYW1lcgwAAAByDAAAAHIMAAAAcg0AAAByGAAAAKYBAABzAgAAAAAWchgAAABjAgAAAAAAAAACAAAAAwAAAEMAAABzDAAAAHQAagF8AHwBgwJTACkBYdQEAAAKICAgIFJldHVybiBjZXJ0YWluIG1hY2hpbmUtcmVhZGFibGUgaW5mb3JtYXRpb24gaXRlbXMgYWJvdXQgdGhlIGN1cnJlbnQgT1MKICAgIGRpc3RyaWJ1dGlvbiBpbiBhIGRpY3Rpb25hcnksIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKCiAgICAuLiBzb3VyY2Vjb2RlOjogcHl0aG9uCgogICAgICAgIHsKICAgICAgICAgICAgJ2lkJzogJ3JoZWwnLAogICAgICAgICAgICAndmVyc2lvbic6ICc3LjAnLAogICAgICAgICAgICAndmVyc2lvbl9wYXJ0cyc6IHsKICAgICAgICAgICAgICAgICdtYWpvcic6ICc3JywKICAgICAgICAgICAgICAgICdtaW5vcic6ICcwJywKICAgICAgICAgICAgICAgICdidWlsZF9udW1iZXInOiAnJwogICAgICAgICAgICB9LAogICAgICAgICAgICAnbGlrZSc6ICdmZWRvcmEnLAogICAgICAgICAgICAnY29kZW5hbWUnOiAnTWFpcG8nCiAgICAgICAgfQoKICAgIFRoZSBkaWN0aW9uYXJ5IHN0cnVjdHVyZSBhbmQga2V5cyBhcmUgYWx3YXlzIHRoZSBzYW1lLCByZWdhcmRsZXNzIG9mIHdoaWNoCiAgICBpbmZvcm1hdGlvbiBpdGVtcyBhcmUgYXZhaWxhYmxlIGluIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlcy4gVGhlIHZhbHVlcwogICAgZm9yIHRoZSB2YXJpb3VzIGtleXMgYXJlIGFzIGZvbGxvd3M6CgogICAgKiBgYGlkYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uaWRgLgoKICAgICogYGB2ZXJzaW9uYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAuCgogICAgKiBgYHZlcnNpb25fcGFydHMgLT4gbWFqb3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5tYWpvcl92ZXJzaW9uYC4KCiAgICAqIGBgdmVyc2lvbl9wYXJ0cyAtPiBtaW5vcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm1pbm9yX3ZlcnNpb25gLgoKICAgICogYGB2ZXJzaW9uX3BhcnRzIC0+IGJ1aWxkX251bWJlcmBgOiAgVGhlIHJlc3VsdCBvZgogICAgICA6ZnVuYzpgZGlzdHJvLmJ1aWxkX251bWJlcmAuCgogICAgKiBgYGxpa2VgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5saWtlYC4KCiAgICAqIGBgY29kZW5hbWVgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5jb2RlbmFtZWAuCgogICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICpwcmV0dHkqIGFuZCAqYmVzdCogcGFyYW1ldGVycywgc2VlIHRoZQogICAgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYCBtZXRob2QuCiAgICApAnIJAAAA2gRpbmZvKQJyEAAAAHISAAAAcgwAAAByDAAAAHINAAAAchkAAAC/AQAAcwIAAAAAKnIZAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwgAAAB0AGoBgwBTACkBeuIKICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbiBpdGVtcwogICAgZnJvbSB0aGUgb3MtcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbi4KCiAgICBTZWUgYG9zLXJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgKQJyCQAAANoPb3NfcmVsZWFzZV9pbmZvcgwAAAByDAAAAHIMAAAAcg0AAAByGgAAAOwBAABzAgAAAAAIchoAAABjAAAAAAAAAAAAAAAAAQAAAEMAAABzCAAAAHQAagGDAFMAKQF69QogICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uIGl0ZW1zCiAgICBmcm9tIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbi4KCiAgICBTZWUgYGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0YF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24KICAgIGl0ZW1zLgogICAgKQJyCQAAANoQbHNiX3JlbGVhc2VfaW5mb3IMAAAAcgwAAAByDAAAAHINAAAAchsAAAD3AQAAcwIAAAAACXIbAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwgAAAB0AGoBgwBTACkBeuoKICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbiBpdGVtcwogICAgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24uCgogICAgU2VlIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24gaXRlbXMuCiAgICApAnIJAAAA2hNkaXN0cm9fcmVsZWFzZV9pbmZvcgwAAAByDAAAAHIMAAAAcg0AAAByHAAAAAMCAABzAgAAAAAIchwAAABjAAAAAAAAAAAAAAAAAQAAAEMAAABzCAAAAHQAagGDAFMAKQF6nwogICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uIGl0ZW1zCiAgICBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbi4KICAgICkCcgkAAADaCnVuYW1lX2lu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YnV0aW9uIChpLmUuIHRoZSBkaXN0cm8gdGhpcwogICAgcGFja2FnZSBydW5zIG9uKS4KCiAgICBOb3JtYWxseSwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjcmVhdGUgYWRkaXRpb25hbCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KICAgIEhvd2V2ZXIsIGluIHNpdHVhdGlvbnMgd2hlcmUgY29udHJvbCBpcyBuZWVkZWQgb3ZlciB0aGUgZXhhY3QgZGF0YSBzb3VyY2VzCiAgICB0aGF0IGFyZSB1c2VkLCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjYW4gYmUgY3JlYXRlZCB3aXRoIGEgc3BlY2lmaWMKICAgIGRpc3RybyByZWxlYXNlIGZpbGUsIG9yIGEgc3BlY2lmaWMgb3MtcmVsZWFzZSBmaWxlLCBvciB3aXRob3V0IGludm9raW5nIHRoZQogICAgbHNiX3JlbGVhc2UgY29tbWFuZC4KICAgIFTaAE5jBgAAAAAAAAAIAAAAAwAAAEMAAABzpAAAAHwFfABfAHwFchh0AWoCagN8BWQBgwJuAnQEfABfBXwFcjB0AWoCagN8BWQCgwJuAnQGfABfB3wCckJ8AnwAXwhuSHQBagJqA3wAagV0CYMCfQZ0AWoCagN8AGoHdAmDAn0HdAFqAmoKfAaDAXN8dAFqAmoKfAeDAQwAcoR8BnwAXwhuBnwHfABfCHwDcJBkA3wAXwt8AXwAXwx8BHwAXw1kBFMAKQVh9QsAAAogICAgICAgIFRoZSBpbml0aWFsaXphdGlvbiBtZXRob2Qgb2YgdGhpcyBjbGFzcyBnYXRoZXJzIGluZm9ybWF0aW9uIGZyb20gdGhlCiAgICAgICAgYXZhaWxhYmxlIGRhdGEgc291cmNlcywgYW5kIHN0b3JlcyB0aGF0IGluIHByaXZhdGUgaW5zdGFuY2UgYXR0cmlidXRlcy4KICAgICAgICBTdWJzZXF1ZW50IGFjY2VzcyB0byB0aGUgaW5mb3JtYXRpb24gaXRlbXMgdXNlcyB0aGVzZSBwcml2YXRlIGluc3RhbmNlCiAgICAgICAgYXR0cmlidXRlcywgc28gdGhhdCB0aGUgZGF0YSBzb3VyY2VzIGFyZSByZWFkIG9ubHkgb25jZS4KCiAgICAgICAgUGFyYW1ldGVyczoKCiAgICAgICAgKiBgYGluY2x1ZGVfbHNiYGAgKGJvb2wpOiBDb250cm9scyB3aGV0aGVyIHRoZQogICAgICAgICAgYGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0YF8gaXMgaW5jbHVkZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgICBJZiB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbgogICAgICAgICAgcGF0aCwgdGhlIGRhdGEgc291cmNlIGZvciB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCB3aWxsIGJlIGVtcHR5LgoKICAgICAgICAqIGBgb3NfcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgb3MtcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyB0byBiZSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICAgQW4gZW1wdHkgc3RyaW5nICh0aGUgZGVmYXVsdCkgd2lsbCBjYXVzZSB0aGUgZGVmYXVsdCBwYXRoIG5hbWUgdG8KICAgICAgICAgIGJlIHVzZWQgKHNlZSBgb3MtcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMpLgoKICAgICAgICAgIElmIHRoZSBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkIG9zLXJlbGVhc2UgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlCiAgICAgICAgICBkYXRhIHNvdXJjZSBmb3IgdGhlIG9zLXJlbGVhc2UgZmlsZSB3aWxsIGJlIGVtcHR5LgoKICAgICAgICAqIGBgZGlzdHJvX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYGRpc3RybyByZWxlYXNlIGZpbGVgXyB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgICBBbiBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0KSB3aWxsIGNhdXNlIGEgZGVmYXVsdCBzZWFyY2ggYWxnb3JpdGhtCiAgICAgICAgICB0byBiZSB1c2VkIChzZWUgYGRpc3RybyByZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscykuCgogICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBkaXN0cm8gcmVsZWFzZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciBpZiBubyBkZWZhdWx0CiAgICAgICAgICBkaXN0cm8gcmVsZWFzZSBmaWxlIGNhbiBiZSBmb3VuZCwgdGhlIGRhdGEgc291cmNlIGZvciB0aGUgZGlzdHJvCiAgICAgICAgICByZWxlYXNlIGZpbGUgd2lsbCBiZSBlbXB0eS4KCiAgICAgICAgKiBgYGluY2x1ZGVfdW5hbWVgYCAoYm9vbCk6IENvbnRyb2xzIHdoZXRoZXIgdW5hbWUgY29tbWFuZCBvdXRwdXQgaXMKICAgICAgICAgIGluY2x1ZGVkIGFzIGEgZGF0YSBzb3VyY2UuIElmIHRoZSB1bmFtZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4KICAgICAgICAgIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbiBwYXRoIHRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIHVuYW1lIGNvbW1hbmQgd2lsbAogICAgICAgICAgYmUgZW1wdHkuCgogICAgICAgICogYGByb290X2RpcmBgIChzdHJpbmcpOiBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gdXNlCiAgICAgICAgICB0byBmaW5kIGRpc3Ryby1yZWxhdGVkIGluZm9ybWF0aW9uIGZpbGVzLgoKICAgICAgICBQdWJsaWMgaW5zdGFuY2UgYXR0cmlidXRlczoKCiAgICAgICAgKiBgYG9zX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYG9zLXJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCBhcyBhIGRhdGEgc291cmNlLiBUaGUKICAgICAgICAgIGVtcHR5IHN0cmluZyBpZiBubyBkaXN0cm8gcmVsZWFzZSBmaWxlIGlzIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgKiBgYGRpc3Ryb19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyBhY3R1YWxseSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuIFRoZQogICAgICAgICAgZW1wdHkgc3RyaW5nIGlmIG5vIGRpc3RybyByZWxlYXNlIGZpbGUgaXMgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAqIGBgaW5jbHVkZV9sc2JgYCAoYm9vbCk6IFRoZSByZXN1bHQgb2YgdGhlIGBgaW5jbHVkZV9sc2JgYCBwYXJhbWV0ZXIuCiAgICAgICAgICBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGxzYiBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvYWRlZC4KCiAgICAgICAgKiBgYGluY2x1ZGVfdW5hbWVgYCAoYm9vbCk6IFRoZSByZXN1bHQgb2YgdGhlIGBgaW5jbHVkZV91bmFtZWBgCiAgICAgICAgICBwYXJhbWV0ZXIuIFRoaXMgY29udHJvbHMgd2hldGhlciB0aGUgdW5hbWUgaW5mb3JtYXRpb24gd2lsbAogICAgICAgICAgYmUgbG9hZGVkLgoKICAgICAgICBSYWlzZXM6CgogICAgICAgICogOnB5OmV4YzpgSU9FcnJvcmA6IFNvbWUgSS9PIGlzc3VlIHdpdGggYW4gb3MtcmVsZWFzZSBmaWxlIG9yIGRpc3RybwogICAgICAgICAgcmVsZWFzZSBmaWxlLgoKICAgICAgICAqIDpweTpleGM6YHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yYDogVGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgaGFkCiAgICAgICAgICBzb21lIGlzc3VlIChvdGhlciB0aGFuIG5vdCBiZWluZyBhdmFpbGFibGUgaW4gdGhlIHByb2dyYW0gZXhlY3V0aW9uCiAgICAgICAgICBwYXRoKS4KCiAgICAgICAgKiA6cHk6ZXhjOmBVbmljb2RlRXJyb3JgOiBBIGRhdGEgc291cmNlIGhhcyB1bmV4cGVjdGVkIGNoYXJhY3RlcnMgb3IKICAgICAgICAgIHVzZXMgYW4gdW5leHBlY3RlZCBlbmNvZGluZy4KICAgICAgICDaA2V0Y3oHdXNyL2xpYnI1AAAATikO2ghyb290X2RpctoCb3PaBHBhdGjaBGpvaW7aDF9VTklYQ09ORkRJUtoHZXRjX2RpctoOX1VOSVhVU1JMSUJESVJaC3Vzcl9saWJfZGly2g9vc19yZWxlYXNlX2ZpbGXaFF9PU19SRUxFQVNFX0JBU0VOQU1F2gZpc2ZpbGXaE2Rpc3Ryb19yZWxlYXNlX2ZpbGXaC2luY2x1ZGVfbHNi2g1pbmNsdWRlX3VuYW1lKQhyJwAAAHJCAAAAcj4AAAByQQAAAHJDAAAAcjcAAABaF2V0Y19kaXJfb3NfcmVsZWFzZV9maWxlWhd1c3JfbGliX29zX3JlbGVhc2VfZmlsZXIMAAAAcgwAAAByDQAAAHIpAAAAjgIAAHMeAAAAAE8GARgCGAMEAQgCEAEGAQoFEgEIAggCBgIKAQYBehpMaW51eERpc3RyaWJ1dGlvbi5fX2luaXRfX2MBAAAAAAAAAAEAAAADAAAAQwAAAHMMAAAAZAFqAHwAZAKNAVMAKQN6F1JldHVybiByZXByIG9mIGFsbCBpbmZvYWUBAABMaW51eERpc3RyaWJ1dGlvbihvc19yZWxlYXNlX2ZpbGU9e3NlbGYub3NfcmVsZWFzZV9maWxlIXJ9LCBkaXN0cm9fcmVsZWFzZV9maWxlPXtzZWxmLmRpc3Ryb19yZWxlYXNlX2ZpbGUhcn0sIGluY2x1ZGVfbHNiPXtzZWxmLmluY2x1ZGVfbHNiIXJ9LCBpbmNsdWRlX3VuYW1lPXtzZWxmLmluY2x1ZGVfdW5hbWUhcn0sIF9vc19yZWxlYXNlX2luZm89e3NlbGYuX29zX3JlbGVhc2VfaW5mbyFyfSwgX2xzYl9yZWxlYXNlX2luZm89e3NlbGYuX2xzYl9yZWxlYXNlX2luZm8hcn0sIF9kaXN0cm9fcmVsZWFzZV9pbmZvPXtzZWxmLl9kaXN0cm9fcmVsZWFzZV9pbmZvIXJ9LCBfdW5hbWVfaW5mbz17c2VsZi5fdW5hbWVfaW5mbyFyfSkpAXInAAAAKQFyKwAAACkBcicAAAByDAAAAHIMAAAAcg0AAADaCF9fcmVwcl9f+AIAAHME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cnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbgogICAgICAgIGl0ZW1zIGZyb20gdGhlIG9zLXJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgT1MgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ub3NfcmVsZWFzZV9pbmZvYC4KICAgICAgICApAXJjAAAAKQFyJwAAAHIMAAAAcgwAAAByDQAAAHIaAAAAzAMAAHMCAAAAAAh6IUxpbnV4RGlzdHJpYnV0aW9uLm9zX3JlbGVhc2VfaW5mb2MBAAAAAAAAAAEAAAABAAAAQwAAAHMGAAAAfABqAFMAKQF65gogICAgICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbgogICAgICAgIGl0ZW1zIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgZGF0YSBzb3VyY2Ugb2YgdGhlIE9TCiAgICAgICAgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubHNiX3JlbGVhc2VfaW5mb2AuCiAgICAgICAgKQHaEV9sc2JfcmVsZWFzZV9pbmZvKQFyJwAAAHIMAAAAcgwAAAByDQAAAHIbAAAA1gMAAHMCAAAAAAl6IkxpbnV4RGlzdHJpYnV0aW9uLmxzYl9yZWxlYXNlX2luZm9jAQAAAAAAAAABAAAAAQAAAEMAAABzBgAAAHwAagBTACkBeukKICAgICAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24KICAgICAgICBpdGVtcyBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBPUwogICAgICAgIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmRpc3Ryb19yZWxlYXNlX2luZm9gLgogICAgICAg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fANyXnwDaghkBIMBfAFkAzwAfAFTAHkYdAJqCXwAagqDAX0EfARqC4MAAQBXAG42BAB0DGsKcrABAAEAAQBkBWQGZAdkCGQJZApkC2QMZA1kDmQPZBBkEWQSZBNnD30EWQBuAlgAeHh8BEQAXXB9AnwCdA1rBnLGcbh0BWoGfAKDAX0DfANyuHQCagNqDnwAagp8AoMCfQV8AGoBfAWDAX0BZAF8AWsGcrh8BXwAXwB8A2oIZASDAXwBZAM8AGQCfAFkARkAageDAGsGkAFyJGQCfAFkAzwAfAFTAHG4VwBpAFMAZBRTACkVeqAKICAgICAgICBHZXQgdGhlIGluZm9ybWF0aW9uIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgcg8AAABaCmNsb3VkbGludXhyDgAAAHJiAAAAegxTdVNFLXJlbGVhc2V6DGFyY2gtcmVsZWFzZXoMYmFzZS1yZWxlYXNleg5jZW50b3MtcmVsZWFzZXoOZmVkb3JhLXJlbGVhc2V6DmdlbnRvby1yZWxlYXNleg5tYWdlaWEtcmVsZWFzZXoQbWFuZHJha2UtcmVsZWFzZXoQbWFuZHJpdmEtcmVsZWFzZXoVbWFuZHJpdmFsaW51eC1yZWxlYXNleg9tYW5qYXJvLXJlbGVhc2V6Dm9yYWNsZS1yZWxlYXNleg5yZWRoYXQtcmVsZWFzZXoKc2wtcmVsZWFzZXoRc2xhY2t3YXJlLXZlcnNpb25OKQ9yQQAAANoaX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2ZpbGVyOAAAAHI5AAAA2ghiYXNlbmFtZdogX0RJU1RST19SRUxFQVNFX0JBU0VOQU1FX1BBVFRFUk5yXAAAAHJHAAAAcnkAAADaB2xpc3RkaXJyPAAAANoEc29ydHKIAAAA2iBfRElTVFJPX1JFTEVBU0VfSUdOT1JFX0JBU0VOQU1FU3I6AAAAKQZyJwAAANoLZGlzdHJvX2luZm9yogAAAHJcAAAAWgliYXNlbmFtZXPaCGZpbGVwYXRocgwAAAByDAAAAHIN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