U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCgpWZXJzaW9uIDMuMC41ICgzMSBKYW4gMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTAxLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggUHl0aG9uIC1jbGFzc2ljIGFuZCBwcm9wZXJ0eSBzZXR0aW5nLiBTZXR0aW5nIHByb3BlcnRpZXMgb24gY2xhc3NpYyBjbGFzc2VzCiAgICAgICAgICAgIHdhcyBicm9rZW4gaW4gc3dpZy0zLjAuMyBieSBhdHRlbXB0aW5nIHRvIHVzZSBfX3NldGF0dHJfXy4gVGhpcyByZWdyZXNzaW9uIGlzIGZpeGVkIG5vdwogICAgICAgICAgICBieSB1c2luZyBfX2RpY3RfXyBhZ2FpbiB3aGVuIHVzaW5nIC1jbGFzc2ljLgogICAgICAgICAgICBGaXhlcyBwYXRjaCAjMjMyLgoKMjAxNS0wMS0yNzogc21hcmNoZXR0bwoJICAgIFtTY2lsYWJdIFN1cHBvcnQgZm9yIHRoZSBTY2lsYWIgbGFuZ3VhZ2UgaGFzIGJlZW4gYWRkZWQKCjIwMTUtMDEtMjM6IG9sbHkKCSAgICBbUEhQXSBXaGVuIHdyYXBwaW5nIGEgcmV0dXJuZWQgcmVzb3VyY2UgYXMgYW4gb2JqZWN0LCBjaGVjayBpZiBhbGwKCSAgICBjYXNlcyB3cmFwIGl0IGluIHRoZSBzYW1lIGNsYXNzLCBhbmQgaWYgc28gZWxpbWluYXRlIHRoZSBwb2ludGxlc3MKCSAgICBzd2l0Y2ggc3RhdGVtZW50IHdyYXBwZXIgd2UgcHJldmlvdXNseSBnZW5lcmF0ZWQuCgoyMDE1LTAxLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBNZXJnZSBwYXRjaCAjMjk3IGZvciBTRiBidWcgIzEyNzcgLSBPY3RhdmUgc2hhcmVkX3B0ciBzdXBwb3J0CgoyMDE1LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBNZXJnZSBwYXRjaCAjMjUwIC0gRml4ZXMgZm9yIHVzaW5nICVjb25zdGFudCBhbmQgb2JqZWN0cyAobm9uLXByaW1pdGl2ZSB0eXBlcykKCjIwMTUtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBHb10gTWVyZ2UgcGF0Y2ggIzMwOCBhbmQgZml4ICMzMDcgLSBDKysxMSBzdHJvbmdseSB0eXBlZCBlbnVtIHN1cHBvcnQKICAgICAgICAgICAgaW4gZGlyZWN0b3JzCgoyMDE1LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBTZWNvbmQgZml4IGZvciAjMjk0ICMyOTYgLSBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gU1dJRy0zLjAuMyB3aGVuCiAgICAgICAgICAgIHdyYXBwaW5nIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLCB0aGlzIHRpbWUgd2hlbiB1c2luZyBrd2FyZ3MuCgpWZXJzaW9uIDMuMC40ICgxNCBKYW4gMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE1LTAxLTEyOiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ2ZhdWx0IGluIGRpcmVjdG9yIHVwY2FsbCBjaGVjayB3aGVuIHVzaW5nIFBIUCBidWlsdCB3aXRoCgkgICAgWlRTIGVuYWJsZWQuICBGaXhlcyAjMTU1LCByZXBvcnRlZCBieSBQaWVycmUgTGFiYXN0aWUuCgoyMDE1LTAxLTEyOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMjk0ICMyOTYgLSBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gU1dJRy0zLjAuMyB3aGVuCiAgICAgICAgICAgIHdyYXBwaW5nIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLiBJbnZhbGlkIG9yIG1pc3NpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgd2VyZSBzb21ldGltZXMgYmVpbmcgZ2VuZXJhdGVkIGludG8gdGhlIHB5dGhvbiBsYXllci4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBBbGxvdyBDKysxMSAiZXhwbGljaXQgY29uc3RleHByIi4gIEZpeGVzIGdpdGh1YiBpc3N1ZSAjMjg0IHJlcG9ydGVkCgkgICAgYnkgUGF3ZWwgVG9tdWxpay4gIEFsc28gaGFuZGxlICJjb25zdGV4cHIgZXhwbGljaXQiIGFuZCAiY29uc3RleHByCgkgICAgc3RhdGljIi4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBXaGVuIHJlcG9ydGluZyBhbiBlcnJvciBmb3IgYSBjb25zdHJ1Y3Qgd2hpY2ggaGFzbid0IGJlZW4KCSAgICB0ZXJtaW5hdGVkIHdoZW4gdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyByZWFjaGVkLCByZXBvcnQgaXQgYXQgdGhlCgkgICAgc3RhcnQgbGluZSByYXRoZXIgdGhhbiAiRU9GIiBhcyB0aGVuIHRvb2xzIGxpa2UgZWRpdG9ycyBhbmQgSURFcwoJICAgIHdpbGwgdGFrZSB5b3UgdG8gYSBnZW5lcmFsbHkgbW9yZSB1c2VmdWwgcGxhY2UgZm9yIGZpeGluZyB0aGUKCSAgICBwcm9ibGVtLgoKMjAxNS0wMS0wODogb2xseQoJICAgIEltcHJvdmUgZXJyb3IgbWVzc2FnZXMgZm9yIGEgZmV3IGNhc2VzIHdoaWNoIHByZXZpb3VzbHkgZ2F2ZSB0aGUKCSAgICBvbmUgb2YgdGhlIGNyeXB0aWMgY2F0Y2gtYWxsIGVycm9ycyAiU3ludGF4IGVycm9yIGluIGlucHV0Ii4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBQcm92aWRlIC1jcHBleHQgYXMgYSBnZW5lcmFsIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHNldHRpbmcgdGhlCgkgICAgZXh0ZW5zaW9uIHVzZWQgZm9yIGdlbmVyYXRlZCBDKysgZmlsZXMgKHByZXZpb3VzbHkgaXQgd2FzIHNwZWNpZmljCgkgICAgdG8gdGhlIFBIUCBiYWNrZW5kKS4gIERlcHJlY2F0ZSB0aGUgZXF1aXZhbGVudCAtc3VmZml4IG9wdGlvbgoJICAgIHByb3ZpZGVkIGJ5IHRoZSBPY2FtbCBiYWNrZW5kLCBidXQgY29udGludWUgdG8gc3VwcG9ydCB0aGF0IGZvcgoJICAgIG5vdy4KClZlcnNpb24gMy4wLjMgKDMwIERlYyAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMTItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjgwIC0gYWJvcnQgdXNpbmcgYWxsIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVycyB3aXRoaW4gb3RoZXIgdGVtcGxhdGUKICAgICAgICAgICAgcGFyYW1ldGVycy4KCjIwMTQtMTItMjc6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBJc3N1ZSAjMjgyIHBlcmw1IGFyY2hsaWIgdnMgYXJjaGxpYmV4cAogICAgICAgICAgICBbUGVybF0gdGlkeSAid2FybmluZzogZHVwbGljYXRlICdleHRlcm4nIGRlY2xhcmF0aW9uIHNwZWNpZmllciIgd2hlbiBidWlsZGluZyBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICB1bmRlciBjbGFuZwoKMjAxNC0xMi0xODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yICVjb25zdGFudCBhbmQgc3RydWN0cy9jbGFzc2VzIC0gaXNzdWUgIzI3MgoKMjAxNC0xMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyNDUgLSByZWdyZXNzaW9uIChzaW5jZSBzd2lnLTMuMC4wKSBpbiB0ZW1wbGF0ZWQgY29uc3RydWN0b3JzLgogICAgICAgICAgICBUZW1wbGF0ZWQgY29uc3RydWN0b3JzIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgLSB0aGV5IHdlcmUgaW5jb3JyZWN0bHkgaWdub3JlZCB3aXRoIGEgd2FybmluZyA1MDQ6CiAgICAgICAgICAgICJGdW5jdGlvbjogeHl6IG11c3QgaGF2ZSBhIHJldHVybiB0eXBlLiBJZ25vcmVkLiIKCjIwMTQtMTItMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBDKysxMSBzdHJvbmdseSB0eXBlZCBlbnVtZXJhdGlvbnMuCgoyMDE0LTExLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gRml4IG11bHRpcGx5IGRlZmluZWQgZXJyb3Igd2hlbiB1c2luZyAlcmVuYW1lIG9mIGVudW0gaXRlbXMgd2hlbiB1c2luZyB0aGUgInNpbXBsZSBlbnVtIgogICAgICAgICAgICB3cmFwcGVycy4KCjIwMTQtMTAtMjg6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzIwMSBUaGUgZ2VuZXJhdGVkIC5weSBmaWxlIG5vIGxvbmdlciB1c2VzICphcmdzIGZvciBhbGwgUHl0aG9uIHBhcmFtZXRlcnMuCiAgICAgICAgICAgIEluc3RlYWQsIHRoZSBwYXJhbWV0ZXJzIGFyZSBuYW1lZCB1c2luZyB0aGUgQysrIHBhcmFtZXRlciBuYW1lcy4KCiAgICAgICAgICAgICJjb21wYWN0ZGVmYXVsdGFyZ3MiIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQgdG8gcmVzdG9yZSB0aGUgb2xkIGJlaGF2aW91ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNC0xMC0yNDogdGltb3RoZWVjb3VyCiAgICAgICAgICAgIFtEXSBQYXRjaCAjMjA0IFVzZSBjb3JlLmF0b21pYy5hdG9taWNPcCB0byBtdXRhdGUgc2hhcmVkIHZhcmlhYmxlcwoKMjAxNC0xMC0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGlzc3VlICMyNDIgLSBVc2Ugb2YgdGhlICJrd2FyZ3MiIGZlYXR1cmUgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgdHVybnMgb24gdGhlCiAgICAgICAgICAgICJjb21wYWN0ZGVmYXVsdGFyZ3MiIGZlYXR1cmUgaWYgdGhlIHRhcmdldCBsYW5ndWFnZSBkb2VzIG5vdCBzdXBwb3J0IGt3YXJncy4KICAgICAgICAgICAgT25seSBKYXZhIGFuZCBQeXRob24gc3VwcG9ydCBrd2FyZ3MsIHNvIHRoaXMgYWZmZWN0cyBhbGwgdGhlIG90aGVyIGxhbmd1YWdlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMTAtMTA6IGRpb3JjZXR5CiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMyMzIgRml4IHByb3BlcnR5IGFjY2VzcyB1c2luZyBkaXJlY3RvcnMKCjIwMTQtMTAtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeGVzIHdoZW4gdXNpbmcgLWJ1aWx0aW4gYW5kIHN0ZDo6dmVjdG9yL3N0ZDo6bGlzdCB3cmFwcGVycyB0byBhbGxvdyBkZWxldGlvbgogICAgICAgICAgICBvZiBzaW5nbGUgZWxlbWVudHMsIHN1Y2ggYXMgJ2RlbCB2ZWNbMF0nLgoKMjAxNC0wOS0zMDogb2xpdmVyYgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gTWVyZ2UgcGF0Y2ggIzIxNiBieSBSaWNoaWU3NjUgLSBBZGRlZCBzdXBwb3J0IGZvciBtYW55IHZlcnNpb25zIG9mIHY4IGphdmFzY3JpcHQuCgoyMDE0LTA5LTMwOiBvbGl2ZXJiCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSBNZXJnZSBwYXRjaCAjMTk1IGJ5IHppdHRpeCAtIEZpeGVkIEpTQ2xhc3NSZWYgZGVjbGFyYXRpb24gbm90IHVzaW5nIHRoZSBzdGF0aWMgb25lLgoKMjAxNC0wOS0zMDogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEluIGNvbmZpZ3VyZSBzY3JpcHQsIHJlcXVpcmUgR28gMS4xIG9yIGxhdGVyLgoKMjAxNC0wOS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzIwNyAtIEZpeCBObyBtb2R1bGUgZXJyb3Igd2l0aCAtcmVsYXRpdmVpbXBvcnQgd2hlbiB1c2luZyBzaW5nbGUKICAgICAgICAgICAgaGVhZGVyIGZpbGUgaW1wb3J0LgoKMjAxNC0wOS0yNzogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzIwOCAtIEluaXRpYWxpc2UgbmV3bHkgY3JlYXRlZCBhcnJheSB3aGVuIHVzaW5nIGFycmF5X2Z1bmN0aW9ucyBpbiB0aGUKICAgICAgICAgICAgY2FycmF5cy5pIGxpYnJhcnkgKEMrKyB1c2FnZSkuCgoyMDE0LTA5LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gUGF0Y2ggIzE4NyAtIEZpeCBjcmFzaCBvbiBzaHV0ZG93biBvZiB0aGUgUnVieSBpbnRlcnByZXRlciBpZiBtb3JlIHRoYW4gb25lCiAgICAgICAgICAgIG1vZHVsZSB3YXMgbG9hZGVkIGF0IGEgdGltZSB3aGVuIGRhdGEgaXMgYmVpbmcgc2hhcmVkIGJldHdlZW4gbW9kdWxlcy4KCjIwMTQtMDktMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTY4IC0gRml4IGxlYWsgaW4gSmF2YSBkaXJlY3RvciBzdHJpbmcgaGFuZGxpbmcgYWZ0ZXIgdGhlIEphdmEKICAgICAgICAgICAgdXBjYWxsIHdoZW4gY2FsbGVkIGZyb20gYSBuYXRpdmUgdGhyZWFkLgoKMjAxNC0wOS0yNTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkanVzdCBnZW5lcmF0ZWQgY29kZSB0byB3b3JrIHdpdGggdXBjb21pbmcgR28gMS40CgkgICAgcmVsZWFzZS4KCjIwMTQtMDktMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBwYXRjaCBmcm9tIFRob21hcyBNYXNsYWNoIHRvIGZpeCBjcmFzaCBpbiB3cmFwcGVycyB3aGVuIHVzaW5nIC10aHJlYWRzIGluCiAgICAgICAgICAgIHRoZSBTVEwgaXRlcmF0b3JzIChTd2lnUHlJdGVyYXRvciBkZXN0cnVjdG9yKS4KCjIwMTQtMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTWVyZ2UgcGF0Y2ggIzIyOSBmcm9tIGNvbnRyZSAtIEFkZCBib29sIGFycmF5IHR5cGVzIHRvIGFycmF5c19jc2hhcnAuaQoKMjAxNC0wOS0xMjogb2xseQoJICAgIFtQSFBdIEFkZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGFueSBQSFAgaW50ZXJmYWNlcyBhIHdyYXBwZWQgY2xhc3MKCSAgICBpbXBsZW1lbnRzLCBlLmcuOiAldHlwZW1hcCgicGhwaW50ZXJmYWNlcyIpIE15SXRlcmF0b3IgIkl0ZXJhdG9yIjsKCjIwMTQtMDktMTE6IG9sbHkKCSAgICBbUEhQXSBGaXggdGhyb3dpbmcgYSBQSFAgZXhjZXB0aW9uIHRocm91Z2ggQysrIGZyb20gYSBzdWJjbGFzc2VkCgkgICAgZGlyZWN0b3IgbWV0aG9kIC0gUEhQIE5VTEwgZ2V0cyByZXR1cm5lZCBieSB0aGUgc3ViY2xhc3NlZCBtZXRob2QKCSAgICBpbiB0aGlzIGNhc2UsIHNvIHRoZSBkaXJlY3Rvcm91dCB0eXBlbWFwIG5lZWRzIHRvIGFsbG93IHRoYXQgKGF0CgkgICAgbGVhc3QgaWYgYW4gZXhjZXB0aW9uIGlzIGFjdGl2ZSkuCgoyMDE0LTA5LTA5OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIGdvYXJnb3V0IHR5cGVtYXAuCgoyMDE0LTA5LTA5OiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ21lbnRhdGlvbiBmYXVsdHMgd2l0aCBkaXJlY3RvcnMgaW4gUEhQID49IDUuNCwgYW5kCgkgICAgcmVlbmFibGUgcnVubWUgdGVzdHMgZm9yIGRpcmVjdG9yX2Jhc2ljIHRlc3RjYXNlLiAgRml4IGZyb20KCSAgICBwYXZlbC1jaGFydmF0IGluIGlzc3VlIzE2NC4KCjIwMTQtMDktMDU6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgaW10eXBlLCBnb2luLCBnb291dCwgZ29kaXJlY3RvcmluLCBhbmQKCSAgICBnb2RpcmVjdG9yb3V0IHR5cGVtYXBzLCB0byBzdXBwb3J0IHdyaXRpbmcgR28gY29kZSB0bwoJICAgIGNvbnZlcnQgYmV0d2VlbiB0eXBlcy4KCjIwMTQtMDktMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggcmVncmVzc2lvbiBpbiBpbmRlbnRhdGlvbiBvZiBweXRob24gY29kZSBwcm9kdWNlZCB3aXRoCgkgICAgLW1vZGVybiwgaW50cm9kdWNlZCBieSBjaGFuZ2VzIGluICMxODguICBSZXBvcnRlZCBieSBmYWJpZW5jYXN0YW4KCSAgICBpbiAjMjE4LgoKMjAxNC0wOS0wMTogb2xseQoJICAgIElzc3VlIGFuIGVycm9yIGZvciB1bmtub3duIFNXSUcgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMsIHJhdGhlcgoJICAgIHRoYW4gcXVpZXRseSBpZ25vcmluZyB0aGVtLiAgUmVwb3J0ZWQgYnkganJoZWxzZXkgaW4gaXNzdWUjMjE3LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wOC0xNTogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIEluY2x1ZGUgZ3VhcmQgZml4IGZvciBuZXN0ZWQgbW9kdWxlcyBmcm9tIEFudGhvbnkgSGVhZGluZyAoU0YgUGF0Y2ggIzM1MCkuCgoyMDE0LTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1lcmdlIHBhdGNoICMyMDAgZnJvbSBncGV0cm91IC0gQ2hhbmdlZCBDU2hhcnAgbGljZW5zZSBoZWFkZXIgdG8gaW5jbHVkZSBhdXRvLWdlbmVyYXRlZAogICAgICAgICAgICB0YWcgc28gdGhhdCBTdHlsZUNvcCBpZ25vcmVzIHRoZSBmaWxlcy4KCjIwMTQtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBNZXJnZSBwYXRjaCAjMTk4IGZyb20gWXV2YWwgS2FzaHRhbiAtIFN1cHBvcnQgZm9yIGphdmEubmlvLkJ5dGVCdWZmZXIgbWFwcGluZyB0bwogICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogaW4gdmFyaW91cy5pIGluIE5JT0JVRkZFUiB0eXBlbWFwcy4KCjIwMTQtMDctMTQ6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBDaGFuZ2Ugc3RydWN0IGRlZmluaXRpb24gdG8gdXNlIHZvaWQgKiwgbm90IHVpbnQ4LCBzbwoJICAgIHRoYXQgdGhlIHR5cGUgaXMgcmVjb3JkZWQgYXMgcG9zc2libHkgY29udGFpbmluZwoJICAgIHBvaW50ZXJzLiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIDEuMyBnYXJiYWdlIGNvbGxlY3RvcgoJICAgIGRvZXMgbm90IGNvbGxlY3QgcG9pbnRlcnMgcGFzc2VkIHRvIEMrKyBjb2RlLgoKMjAxNC0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGIEJ1ZyAjMTM3NSAtIEV4cGFuc2lvbiBvZiB0aGUgJHBhcmVudGNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlIGluY29ycmVjdGx5IGNvbnRhaW5zCiAgICAgICAgICAgIGJyYWNrZXRzIGluIHRoZSBleHBhbmRlZCBuYW1lLgoKVmVyc2lvbiAzLjAuMiAoNCBKdW4gMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDYtMDI6IHYtZm9yLXZhbmRhbAogICAgICAgICAgICBbTHVhXSBQdWxsIHJlcXVlc3QgIzE3NjoKICAgICAgICAgICAgSWYgY2xhc3MgaGFzIG5vIF9fZXEgaW1wbGVtZW50ZWQsIHRoZW4gZGVmYXVsdCBfX2VxIGlzIGdlbmVyYXRlZC4gCiAgICAgICAgICAgIERlZmF1bHQgX19lcSBjb21wYXJlcyBhY3R1YWwgcG9pbnRlcnMgc3RvcmVkIGluc2lkZSBMdWEgdXNlcmRhdGEuCgoyMDE0LTA2LTAyOiB2a2FsaW5pbgogICAgICAgICAgICBGaXggIzE4MyAtICVleHRlbmQgYW5kIHVubmFtZWQgbmVzdGVkIHN0cnVjdHMKCjIwMTQtMDUtMjg6IGt3d2V0dGUKICAgICAgICAgICAgRml4IGluc3RhbGwgZmFpbHVyZSB3aGVuIHVzaW5nIGFuICdvdXQgb2Ygc291cmNlJyBidWlsZCB1c2luZyB0aGUgc2hpcHBlZAogICAgICAgICAgICB0YXJiYWxsIC0gcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMy4wLjEuCgoyMDE0LTA1LTI0OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIFJlbW92ZSBkZXByZWNhdGVkIC1nbG9iYWwvLW5vZ2xvYmFsIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKClZlcnNpb24gMy4wLjEgKDI3IE1heSAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDUtMjU6IGhmYWxjaWMKCSAgICBbUHl0aG9uXSBQeXRob24gMyBieXRlIHN0cmluZyBvdXRwdXQ6IHVzZSBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIKICAgICAgICAgICAgaWYgYXZhaWxhYmxlIG9uIHRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB0aGF0J3MgaW4gdXNlLiBUaGlzIGFsbG93cwogICAgICAgICAgICBvYnRhaW5pbmcgdGhlIG9yaWdpbmFsIGJ5dGUgc3RyaW5nIChhbmQgcG90ZW50aWFsbHkgdHJ5aW5nIGEgZmFsbGJhY2sKICAgICAgICAgICAgZW5jb2RpbmcpIGlmIHRoZSBieXRlcyBjYW4ndCBiZSBkZWNvZGVkIGFzIFVURi04LgoKICAgICAgICAgICAgUHJldmlvdXNseSwgYSBVbmljb2RlRGVjb2RlRXJyb3Igd291bGQgYmUgcmFpc2VkIHdpdGggbm8gd2F5IHRvIHRyZWF0CiAgICAgICAgICAgIHRoZSBkYXRhIGFzIGJ5dGVzIG9yIHRyeSBhbm90aGVyIGNvZGVjLgoKMjAxNC0wNS0xODogdmthbGluaW4KCSAgICBCdWcgIzE3NSAtIFJlc3RvcmUgJWV4dGVuZCB0byB3b3JrIGZvciB1bm5hbWVkIG5lc3RlZCBzdHJ1Y3R1cmVzIGJ5IHVzaW5nIGEgQwogICAgICAgICAgICBzeW1ib2wgY29tcHJpc2luZyB0aGUgb3V0ZXIgc3RydWN0dXJlIG5hbWUgYW5kIHVubmFtZWQgdmFyaWFibGUgaW5zdGFuY2UgbmFtZS4KCjIwMTQtMDUtMTU6IGt3d2V0dGUKCSAgICBBZGQgIzE2NiAtICdtYWtlIGNoZWNrJyBub3cgd29ya3Mgb3V0IG9mIHNvdXJjZS4gVGhpcyByZXF1aXJlZCB0aGUgZXhhbXBsZXMgdG8gYnVpbGQKICAgICAgICAgICAgb3V0IG9mIHNvdXJjZS4gVGhlIG1haW4gbGFuZ3VhZ2VzIGhhdmUgYmVlbiB0ZXN0ZWQgLSBDIywgR28sIEd1aWxlLCBKYXZhLCBKYXZhc2NyaXB0LAogICAgICAgICAgICBMdWEsIE9jdGF2ZSwgUGVybCwgUEhQLCBQeXRob24sIFJ1YnkgYW5kIFRjbC4KCjIwMTQtMDUtMDE6IE9saXZlciBCdWNodGFsYQoJICAgIEphdmFzY3JpcHQgc3VwcG9ydCBhZGRlZCwgc2VlIEphdmFzY3JpcHQgY2hhcHRlciBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMTQtMDUtMDE6IG9sbHkKCSAgICBbUEhQXSBUaGUgZ2VuZXJhdGVkIF9faXNzZXQoKSBtZXRob2Qgbm93IHJldHVybnMgdHJ1ZSBmb3IgcmVhZC1vbmx5IHByb3BlcnRpZXMuCgoyMDE0LTA0LTI0OiBrd3dldHRlCiAgICAgICAgICAgIFtHb10gRml4IGdvIC4vY29uZmlndXJlIHBhcnNpbmcgb2YgZ2NjZ28gLS12ZXJzaW9uLCBhbmQKICAgICAgICAgICAgZ29ydW50aW1lLnN3ZyB0eXBvIGluIF9fR05VQ19QQVRDSExFVkVMX18gKFNGIEJ1ZyAjMTI5OCkKCjIwMTQtMDQtMjQ6IGt3d2V0dGUKICAgICAgICAgICAgRml4IHtweXRob258cGVybDV8cnVieXx0Y2x9L2phdmEgZXhhbXBsZXMKCiAgICAgICAgICAgIEluIExpYi9nY2ovY25pLmksIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbmV3ZXIgZ2NqIHZlcnNpb25zOgoKICAgICAgICAgICAgLSByZW1vdmUgSnZBbGxvY09iamVjdCgpIHdoaWNoIGdjaiBubyBsb25nZXIgZGVmaW5lcywgZnJvbSBnY2ogQ2hhbmdlbG9nOgogICAgICAgICAgICAgIDIwMDQtMDQtMTYgIEJyeWNlIE1jS2lubGF5ICA8bWNraW5sYXlAcmVkaGF0LmNvbT4KICAgICAgICAgICAgICAgICogZ2NqL2NuaS5oIChKdkFsbG9jT2JqZWN0KTogUmVtb3ZlIHRoZXNlIG9ic29sZXRlLAogICAgICAgICAgICAgICAgdW5kb2N1bWVudGVkIENOSSBjYWxscy4KCiAgICAgICAgICAgIC0gY2hhbmdlIEp2Q3JlYXRlSmF2YVZNKCkgYXJndW1lbnQgZnJvbSB2b2lkKiB0byBKdlZNSW5pdEFyZ3MqLCBmcm9tIGdjaiBDaGFuZ2Vsb2c6CiAgICAgICAgICAgICAgMjAwNS0wMi0yMyAgVGhvbWFzIEZpdHpzaW1tb25zICA8Zml0enNpbUByZWRoYXQuY29tPgogICAgICAgICAgICAgIFBSIGxpYmdjai8xNjkyMwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIChKdkNyZWF0ZUphdmFWTSk6IERlY2xhcmUgdm1fYXJncyBhcyBKdlZNSW5pdEFyZ3MqIHJhdGhlciB0aGFuIHZvaWQqLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wNC0wODogd3NmdWx0b24KICAgICAgICAgICAgU0YgQnVnICMxMzY2IC0gUmVtb3ZlIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgb2Ygc3RydG9pbWF4IGFuZCBzdHJ0b3VtYXggaW4gaW50dHlwZXMuaQoKMjAxNC0wNC0wODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEVudW1zIHdoaWNoIGhhdmUgYmVlbiBpZ25vcmVkIHZpYSAlaWdub3JlIGFuZCBhcmUgc3Vic2VxdWVudGx5CiAgICAgICAgICAgIHVzZWQgYXJlIGhhbmRsZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkuIFR5cGUgd3JhcHBlciBjbGFzc2VzIGFyZSBub3cgZ2VuZXJhdGVkCiAgICAgICAgICAgIHdoaWNoIGFyZSBlZmZlY3RpdmVseSBhIHdyYXBwZXIgb2YgYW4gZW1wdHkgZW51bS4gUHJldmlvdXNseSBpbiBKYXZhIHVuY29tcGlsYWJsZQogICAgICAgICAgICBjb2RlIHdhcyBnZW5lcmF0ZWQgYW5kIGluIEMjIGFuIGludCB3YXMgdXNlZC4KCjIwMTQtMDQtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCByZWdyZXNzaW9uIGluIDMuMC4wIHdoZXJlIGxlZ2FsIGNvZGUgZm9sbG93aW5nIGFuIG9wZXJhdG9yPDwgZGVmaW5pdGlvbiBtaWdodAogICAgICAgICAgICBnaXZlIGEgc3ludGF4IGVycm9yLiBTRiBCdWcgIzEzNjUuCgoyMDE0LTA0LTAzOiBvbGx5CgkgICAgW1BIUF0gRml4IHdyYXBwaW5nIGRpcmVjdG9yIGNvbnN0cnVjdG9ycyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycwoJICAgIHdpdGggYSBaVFMtZW5hYmxlZCBidWlsZCBvZiBQSFAuCgoyMDE0LTA0LTAyOiBvbGx5CgkgICAgW1BIUF0gUGFzcyB0aGUgWlRTIGNvbnRleHQgd2UgYWxyZWFkeSBoYXZlIHRvIGF2b2lkIG5lZWRpbmcgdG8KCSAgICBjYWxsIFRTUk1MU19GRVRDSCwgd2hpY2ggaXMgcmVsYXRpdmVseSBleHBlbnNpdmUuCgoyMDE0LTA0LTAyOiBvbGx5CgkgICAgW1BIUF0gUGFzcyBaVFMgY29udGV4dCB0aHJvdWdoIHRvIHRfb3V0cHV0X2hlbHBlcigpIHNvIGl0IHdvcmtzCgkgICAgd2l0aCBhIFpUUy1lbmFibGVkIGJ1aWxkIG9mIFBIUC4gIFJlcG9ydGVkIGJ5IFBpZXJyZSBMYWJhc3RpZSBpbgoJICAgIGdpdGh1YiBQUiMxNTUuCgoyMDE0LTAzLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDIyBEIEdvXSBGaXhlcyBmb3IgQyBlbnVtcyB1c2VkIGluIGFuIEFQSSBhbmQgdGhlIGRlZmluaXRpb24gb2YgdGhlIGVudW0KICAgICAgICAgICAgaGFzIG5vdCBiZWVuIHBhcnNlZC4gRm9yIEQsIHRoaXMgZml4ZXMgYSBzZWdmYXVsdCBpbiBTV0lHLiBUaGUgb3RoZXIgbGFuZ3VhZ2VzCiAgICAgICAgICAgIG5vdyBwcm9kdWNlIGNvZGUgdGhhdCBjb21waWxlcywgYWx0aG91Z2ggdGhlIGRlZmluaXRpb24gb2YgdGhlIGVudW0gaXMgbmVlZGVkCiAgICAgICAgICAgIGluIG9yZGVyIHRvIHVzZSB0aGUgZW51bSBwcm9wZXJseSBmcm9tIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgoyMDE0LTAzLTIzOiB2LWZvci12YW5kYWwKICAgICAgICAgICAgW0x1YV0gRml4IGZvciB1c2FnZSBvZiBzbnByaW50ZiBpbiBMdWEgcnVudGltZSB3aGljaCBWaXN1YWwgU3R1ZGlvIGRvZXMgbm90IGhhdmUuCgpWZXJzaW9uIDMuMC4wICgxNiBNYXIgMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBDKysxMSBzdXBwb3J0IGluaXRpYWxseSBkZXZlbG9wZWQgYXMgQysrMHggc3VwcG9ydCBieSBNYXRldnogSmVrb3ZlYyBhcyBhIEdvb2dsZSBTdW1tZXIgb2YgQ29kZQogICAgICAgICAgICBwcm9qZWN0IGhhcyBiZWVuIGZ1cnRoZXIgZXh0ZW5kZWQuIFRoZSBDKysxMSBzdXBwb3J0IGlzIGNvbXByZWhlbnNpdmUsIGJ1dCBieSBubyBtZWFucyBjb21wbGV0ZQogICAgICAgICAgICBvciB3aXRob3V0IGxpbWl0YXRpb25zLiBGdWxsIGRldGFpbHMgZm9yIGVhY2ggbmV3IGZlYXR1cmUgaW4gQysrMTEgaXMgY292ZXJlZCBpbiB0aGUKICAgICAgICAgICAgQ1BsdXNQbHVzMTEuaHRtbCBjaGFwdGVyIGluIHRoZSBkb2N1bWVudGF0aW9uIHdoaWNoIGlzIGluY2x1ZGVkIGluIFNXSUcgYW5kIGFsc28gYXZhaWxhYmxlCiAgICAgICAgICAgIG9ubGluZSBhdCBodHRwOi8vd3d3LnN3aWcub3JnL0RvYzMuMC9DUGx1c1BsdXMxMS5odG1sLgoKMjAxNC0wMy0xNDogdi1mb3ItdmFuZGFsCiAgICAgICAgICAgIFtMdWFdIE51bWVyb3VzIEx1YSBpbXByb3ZlbWVudHM6CiAgICAgICAgICAgIDEuICVuc3BhY2Ugc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gTmFtZXNwYWNlcyBhcmUgbWFwcGVkIHRvIHRhYmxlcyBpbiB0aGUgbW9kdWxlLCB3aXRoIHRoZSBzYW1lCiAgICAgICAgICAgICAgIG5hbWUgYXMgdGhlIEMrKyBuYW1lc3BhY2UuCiAgICAgICAgICAgIDIuIEluaGVyaXRhbmNlIGlzIG5vdyBoYW5kbGVkIGRpZmZlcmVudGx5LiBFYWNoIGNsYXNzIG1ldGF0YWJsZSBrZWVwcyBhIGxpc3Qgb2YgY2xhc3MgYmFzZXMgaW5zdGVhZAogICAgICAgICAgICAgICBvZiBtZXJnaW5nIGFsbCBtZW1iZXJzIG9mIGFsbCBiYXNlcyBpbnRvIHRoZSBkZXJpdmVkIGNsYXNzLgogICAgICAgICAgICAzLiBUaGUgbmV3IG1ldGF0YWJsZXMgcmVzdWx0IGluIGRpZmZlcmVuY2VzIGluIGFjY2Vzc2luZyBjbGFzcyBtZW1iZXJzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBleGFtcGxlCiAgICAgICAgICAgICAgICAgc3RydWN0IFRlc3QgewogICAgICAgICAgICAgICAgICAgICBlbnVtIHsgVEVTVDEgPSAxMCwgVEVTVDIgPSAyMCB9OwogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IElDT05TVCA9IDEyOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIE5vdyB0aGlzIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3QuVEVTVDEpCiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3QuSUNPTlNUKQogICAgICAgICAgICAgICAgIFRoZSBvbGQgd2F5IHdhczoKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdF9URVNUMSkKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdF9JQ09OU1QpCgogICAgICAgICAgICA0LiBUaGUgc3BlY2lhbCBjbGFzcyBtZXRhdGFibGUgbWVtYmVyICIuY29uc3RydWN0b3IiIHdhcyByZW1vdmVkLiBOb3cgU1dJRyBnZW5lcmF0ZXMgdGhlIHByb3h5CiAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJ5IGl0c2VsZiBhbmQgYXNzaWducyBpdCBkaXJlY3RseSB0byB0aGUgY2xhc3MgdGFibGUgIl9fY2FsbCIgbWV0aG9kLgogICAgICAgICAgICA1LiBlTHVhIHNob3VsZCBhbHNvIG5vdyBzdXBwb3J0IGluaGVyaXRhbmNlLgogICAgICAgICAgICA2LiAnY29uc3QnIHN1YnRhYmxlIGluIGVMdWEgaXMgY29uc2lkZXJlZCBkZXByZWNhdGVkLgoKICAgICAgICAgICAgQ2hhbmdlcyBpbiBiZWhhdmlvdXI6CiAgICAgICAgICAgIGEuIFlvdSBjYW4gbm8gbG9uZ2VyIGFzc2lnbiB0byBub24tZXhpc3RpbmcgY2xhc3MgbWVtYmVycyBpbiBjbGFzc2VzIHdpdGhvdXQgYSBfX3NldGl0ZW1fXyBtZXRob2QuCiAgICAgICAgICAgICAgIEl0IHdpbGwgY2F1c2UgYSBMdWEgZXJyb3IuCiAgICAgICAgICAgIGIuIFlvdSBjYW4gbm8gbG9uZ2VyIGl0ZXJhdGUgb3ZlciBhIG1vZHVsZSB0YWJsZSBhbmQgY29weSBldmVyeXRoaW5nIGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCiAgICAgICAgICAgICAgIEFjdHVhbGx5LCB0aGlzIHdhcyBuZXZlciB0aGUgY2FzZSwgYnV0IGl0IGlzIG5vdyBleHBsaWNpdGx5IHByb2hpYml0ZWQuCiAgICAgICAgICAgIGMuIE5vdyBjaGFuZ2luZyBhIGJhc2UgY2xhc3Mgd2lsbCBpbW1lZGlhdGVseSBhZmZlY3QgYWxsIGRlcml2ZWQgY2xhc3Nlcy4KICAgICAgICAgICAgZC4gVGhlcmUgbWlnaHQgYmUgc29tZSBpc3N1ZXMgd2l0aCBpbmhlcml0YW5jZS4gQWx0aG91Z2ggdGhlIGJhc2VzIGl0ZXJhdGlvbiBzY2hlbWUgaXMgdGhlIHNhbWUKICAgICAgICAgICAgICAgYXMgd2FzIHVzZWQgZm9yIG1lcmdpbmcgYmFzZSBjbGFzc2VzIGludG8gZGVyaXZlZCBvbmUsIHNvbWUgdW5rbm93biBpc3N1ZXMgbWF5IGFyaXNlLgoKICAgICAgICAgICAgVGhlIG9sZCBtZXRhdGFibGUgYmVoYXZpb3VyIGNhbiBiZSByZXN0b3JlZCBieSB1c2luZyB0aGUgLW5vLW9sZC1tZXRhdGFibGUtYmluZGluZ3Mgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQ2hhbmdlIGluIGRlZmF1bHQgYmVoYXZpb3VyIHdyYXBwaW5nIEMrKyBib29sLiBPbmx5IGEgUHl0aG9uIFRydWUgb3IgRmFsc2UKICAgICAgICAgICAgd2lsbCBub3cgd29yayBmb3IgQysrIGJvb2wgcGFyYW1ldGVycy4gVGhpcyBmaXhlcyBvdmVybG9hZGluZyBib29sIHdpdGggb3RoZXIgdHlwZXMuCiAgICAgICAgICAgIFB5dGhvbiAyLjMgbWluaW11bSBpcyBub3cgcmVxdWlyZWQgZm9yIHdyYXBwaW5nIGJvb2wuCgogICAgICAgICAgICBXaGVuIHdyYXBwaW5nOgoKICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvdmVybG9hZGVkKGJvb2wgdmFsdWUpIHsgcmV0dXJuICJib29sIjsgfQogICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG92ZXJsb2FkZWQoaW50IHZhbHVlKSB7IHJldHVybiAiaW50IjsgfQoKICAgICAgICAgICAgUHJldmlvdXMgYmVoYXZpb3VyOgogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKEZhbHNlKQogICAgICAgICAgICAgICdpbnQnCiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoVHJ1ZSkKICAgICAgICAgICAgICAnaW50JwogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKDApCiAgICAgICAgICAgICAgJ2ludCcKCiAgICAgICAgICAgIE5vdyB3ZSBnZXQgdGhlIGV4cGVjdGVkIGJlaGF2aW91cjoKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZChGYWxzZSkKICAgICAgICAgICAgICAnYm9vbCcKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZCgwKQogICAgICAgICAgICAgICdpbnQnCgogICAgICAgICAgICBUaGUgY29uc2VxdWVuY2UgaXMgd2hlbiB3cmFwcGluZyBib29sIGluIG5vbi1vdmVybG9hZGVkIGZ1bmN0aW9uczoKCiAgICAgICAgICAgICAgY29uc3QgY2hhciogYm9vbGZ1bmN0aW9uKGJvb2wgdmFsdWUpIHsgcmV0dXJuIHZhbHVlID8gInRydWUiIDogImZhbHNlIjsgfQoKICAgICAgICAgICAgVGhlIHByZXZpb3VzIGJlaGF2aW91ciB3YXMgdmVyeSBQeXRob25pYzoKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKCIiKQogICAgICAgICAgICAgICdmYWxzZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKCJoaSIpCiAgICAgICAgICAgICAgJ3RydWUnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigxMi4zNCkKICAgICAgICAgICAgICAndHJ1ZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKDApCiAgICAgICAgICAgICAgJ2ZhbHNlJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oMSkKICAgICAgICAgICAgICAndHJ1ZScKCiAgICAgICAgICAgIE5vdyB0aGUgbmV3IGJlaGF2aW91ciBtb3JlIGFsb25nIHRoZSBsaW5lcyBvZiBDKysgZHVlIHRvIHN0cmljdGVyIHR5cGUgY2hlY2tpbmcuIFRoZQogICAgICAgICAgICBhYm92ZSBjYWxscyByZXN1bHQgaW4gYW4gZXhjZXB0aW9uIGFuZCBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgY29udmVydGVkIGludG8gYSBib29sIGFzCiAgICAgICAgICAgIGZvbGxvd3M6CiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigwKQogICAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAgICAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgICAgICAgICAgICAgVHlwZUVycm9yOiBpbiBtZXRob2QgJ2Jvb2xmdW5jdGlvbicsIGFyZ3VtZW50IDEgb2YgdHlwZSAnYm9vbCcKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKGJvb2woMCkpCiAgICAgICAgICAgICAgJ2ZhbHNlJwoKICAgICAgICAgICAgVGhlIG9sZCBiZWhhdmlvdXIgY2FuIGJlIHJlc3VycmVjdGVkIGJ5IHBhc3NpbmcgdGhlIC1EU1dJR19QWVRIT05fTEVHQUNZX0JPT0wgY29tbWFuZCBsaW5lCiAgICAgICAgICAgIHBhcmFtZXRlciB3aGVuIGV4ZWN1dGluZyBTV0lHLiBUeXBlbWFwcyBjYW4gb2YgY291cnNlIGJlIHdyaXR0ZW4gdG8gY3VzdG9taXNlIHRoZSBiZWhhdmlvdXIKICAgICAgICAgICAgZm9yIHNwZWNpZmljIHBhcmFtZXRlcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAzLTA2OiB3c2Z1bHRvbgoJICAgIEZpeCBTRiBCdWcgIzEzNjMgLSBQcm9ibGVtIHdpdGggbWV0aG9kIG92ZXJsb2FkaW5nIHdoZW4gc29tZSBtZXRob2RzIGFyZSBhZGRlZCBieSAlZXh0ZW5kCiAgICAgICAgICAgIGFuZCBvdGhlcnMgYXJlIHJlYWwgbWV0aG9kcyBhbmQgdXNpbmcgdGVtcGxhdGUgZGVmYXVsdCBwYXJhbWV0ZXJzIHdpdGggc21hcnQgcG9pbnRlcnMuCiAgICAgICAgICAgIFRoaXMgaXMgbm90aWNlYWJsZSBhcyBhIHJlZ3Jlc3Npb24gc2luY2UgMi4wLjEyIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgc21hcnQgcG9pbnRlcgogICAgICAgICAgICBoYW5kbGluZyBmb3Igc29tZSBsYW5ndWFnZXMgd2hlbiB0aGUgc21hcnQgcG9pbnRlciB3cmFwcyBzdGQ6Om1hcCBhbmQgb3RoZXIgU1RMIGNvbnRhaW5lcnMuCgoyMDE0LTAzLTAyOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIFNGIFBhdGNoICMzNDYgZnJvbSBKZW5zIEtydWVnZXIuIENvcnJlY3QgZXhjZXB0aW9uIHRocm93biBhdHRlbXB0aW5nIHRvCiAgICAgICAgICAgIGFjY2VzcyBhIG5vbi1leGlzdGVudCBDL0MrKyBnbG9iYWwgdmFyaWFibGUgb24gdGhlICdjdmFyJyBvYmplY3QuIFRoZSBleGNlcHRpb24gdGhyb3duCiAgICAgICAgICAgIHVzZWQgdG8gYmUgYSBOYW1lRXJyb3IuIEhvd2V2ZXIsIGFzIHRoaXMgYWNjZXNzIGlzIHZpYSBhIHByaW1hcnksIGFuIEF0dHJpYnV0ZUVycm9yCiAgICAgICAgICAgIGlzIG1vcmUgY29ycmVjdCBhbmQgc28gdGhlIGV4Y2VwdGlvbiB0aHJvd24gbm93IGlzIGFuIEF0dHJpYnV0ZUVycm9yLiBSZWZlcmVuY2U6CiAgICAgICAgICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMi9yZWZlcmVuY2UvZXhwcmVzc2lvbnMuaHRtbCNhdHRyaWJ1dGUtcmVmZXJlbmNlcwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMy0wMTogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBQYXRjaCAjMTQzIEZpeCB0eXBlIHNob3duIHdoZW4gdXNpbmcgdHlwZSgpIHRvIGluY2x1ZGUgdGhlIG1vZHVsZSBhbmQgcGFja2FnZQogICAgICAgICAgICBuYW1lIHdoZW4gdXNpbmcgLWJ1aWx0aW4uCgoyMDE0LTAzLTAxOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIFNGIHBhdGNoICMzNDcgRml4IG1pc3NpbmcgYXJndW1lbnQgY291bnQgY2hlY2tpbmcgd2l0aCAtbW9kZXJuLgogICAgICAgICAgICBGaXhlcyByZWdyZXNzaW9uIGludHJvZHVjZWQgd2hlbiBidWlsdGluIGNoYW5nZXMgd2VyZSBpbnRyb2R1Y2VkIGluIFNXSUctMi4wLjMuCgoyMDE0LTAyLTIxOiB3c2Z1bHRvbgoJICAgIFtQSFBdIEZpeCB3YXJuaW5nIHN1cHByZXNzaW9uIHVzaW5nICV3YXJuZmlsdGVyIGZvciBQSFAgcmVzZXJ2ZWQgY2xhc3MgbmFtZXMuCgoyMDE0LTAyLTE5OiBvbGx5CgkgICAgW0x1YV0gQWRkIGtleXdvcmQgd2FybmluZ3MgZm9yIEx1YSBrZXl3b3JkcyBhbmQgQmFzaWMgRnVuY3Rpb25zLgoKMjAxNC0wMi0xOTogb2xseQoJICAgIC1XYWxsa3cgbm93IGluY2x1ZGVzIGtleXdvcmRzIGZvciBhbGwgbGFuZ3VhZ2VzIHdpdGgga2V5d29yZAoJICAgIHdhcm5pbmdzIChwcmV2aW91c2x5IEdvIGFuZCBSIHdlcmUgbWlzc2luZykuCgoyMDE0LTAyLTE5OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHRoZSBsaXN0cyBvZiBQSFAga2V5d29yZHMgd2l0aCBuZXcgb25lcyBmcm9tIFBIUCA1LjQKCSAgICBhbmQgbmV3ZXIgKGFuZCBzb21lIG1pc3Npbmcgb25lcyBmcm9tIDUuMykuICBSZXNlcnZlZCBQSFAgY29uc3RhbnRzCgkgICAgbmFtZXMgYXJlIG5vdyBjaGVja2VkIGFnYWluc3QgZW51bSB2YWx1ZXMgYW5kIGNvbnN0YW50cywgaW5zdGVhZAoJICAgIG9mIGFnYWluc3QgZnVuY3Rpb24gYW5kIG1ldGhvZCBuYW1lcy4gIEJ1aWx0LWluIFBIUCBmdW5jdGlvbiBuYW1lcwoJICAgIG5vIGxvbmdlciBtYXRjaCBtZXRob2RzIGFkZGVkIGJ5ICVleHRlbmQuICBGdW5jdGlvbnMgYW5kIG1ldGhvZHMKCSAgICBuYW1lZCAnX19zbGVlcCcsICdfX3dha2V1cCcsICdub3QnLCAncGFyZW50Jywgb3IgJ3ZpcnR1YWwnIGFyZSBubwoJICAgIGxvbmdlciBuZWVkbGVzc2x5IHJlbmFtZWQuCgoyMDE0LTAyLTE1OiB3c2Z1bHRvbgoJICAgIEZpeCB0aGUgJSRpc21lbWJlciAlcmVuYW1lIHByZWRpY2F0ZXMgdG8gYWxzbyBhcHBseSB0byBtZW1iZXJzIGFkZGVkIHZpYSAlZXh0ZW5kLgoKICAgICAgICAgICAgQWRkICUkaXNleHRlbmRtZW1iZXIgZm9yICVyZW5hbWUgb2YgbWVtYmVycyBhZGRlZCB2aWEgJWV4dGVuZC4gVGhpcyBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIG5vcm1hbCBjbGFzcy9zdHJ1Y3QgbWVtYmVycyBhbmQgJWV4dGVuZCBtZW1iZXJzLiBGb3IgZXhhbXBsZQogICAgICAgICAgICAnJSRpc21lbWJlciwgJSRub3QgJSRpc2V4dGVuZG1lbWJlcicgd2lsbCBub3cgaWRlbnRpZnkganVzdCBjbGFzcy9zdHJ1Y3QgbWVtYmVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDItMTY6IGhmYWxjaWMKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzEzNyAtIGZpeCBjcmFzaGVzL2V4Y2VwdGlvbnMgaW4gZXhjZXB0aW9uIGhhbmRsaW5nIGluIFB5dGhvbiAzLjMKCjIwMTQtMDItMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgc3VwcG9ydCBmb3IgdGhlIGNkYXRhIGxpYnJhcnkuCgoyMDE0LTAyLTA4OiB2a2FsaW5pbgogICAgICAgICAgICBOZXN0ZWQgY2xhc3Mgc3VwcG9ydCBhZGRlZC4gVGhpcyBwcmltYXJpbHkgYWxsb3dzIFNXSUcgdG8gcHJvcGVybHkgcGFyc2UgbmVzdGVkCiAgICAgICAgICAgIGNsYXNzZXMgYW5kIGtlZXAgdGhlIG5lc3RlZCBjbGFzcyBpbmZvcm1hdGlvbiBpbiB0aGUgcGFyc2UgdHJlZS4gSmF2YSBhbmQgQyMKICAgICAgICAgICAgaGF2ZSB1dGlsaXNlZCB0aGlzIGluZm9ybWF0aW9uIHdyYXBwaW5nIHRoZSBDKysgbmVzdGVkIGNsYXNzZXMgYXMgSmF2YS9DIwogICAgICAgICAgICBuZXN0ZWQgY2xhc3Nlcy4gVGhlIHJlbWFpbmluZyB0YXJnZXQgbGFuZ3VhZ2VzIGlnbm9yZSBuZXN0ZWQgY2xhc3NlcyBhcyBpbgogICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucy4gSGVscCBpcyBuZWVkZWQgYnkgdXNlcnMgb2YgdGhlc2UgcmVtYWluaW5nIGxhbmd1YWdlcyB0bwogICAgICAgICAgICBkZXNpZ24gaG93IEMrKyBuZXN0ZWQgY2xhc3NlcyBjYW4gYmUgYmVzdCB3cmFwcGVkLiBQbGVhc2UgdGFsayB0byB1cyBvbiB0aGUKICAgICAgICAgICAgc3dpZy1kZXZlbCBtYWlsaW5nIGxpc3QgaWYgeW91IHRoaW5rIHlvdSBjYW4gaGVscC4KCiAgICAgICAgICAgIFByZXZpb3VzbHksIHRoZXJlIHdhcyBsaW1pdGVkIG5lc3RlZCBjbGFzcyBzdXBwb3J0LiBOZXN0ZWQgY2xhc3NlcyB3ZXJlIHRyZWF0ZWQKICAgICAgICAgICAgYXMgb3BhcXVlIHBvaW50ZXJzLiBIb3dldmVyLCB0aGUgIm5lc3RlZHdvcmthcm91bmQiIGZlYXR1cmUgcHJvdmlkZWQgYSB3YXkgdG8KICAgICAgICAgICAgd3JhcCBhIG5lc3RlZCBjbGFzcyBhcyBpZiBpdCB3YXMgYSBnbG9iYWwgY2xhc3MuIFRoaXMgZmVhdHVyZSBubyBsb25nZXIgZXhpc3RzCiAgICAgICAgICAgIGFuZCBpcyByZXBsYWNlZCBieSB0aGUgbmV3ICJmbGF0bmVzdGVkIiBmZWF0dXJlLiBUaGlzIGVmZmVjdGl2ZWx5IGRvZXMgdGhlIHNhbWUKICAgICAgICAgICAgdGhpbmcgd2l0aCBsZXNzIG1hbnVhbCBjb2RlIHRvIGJlIHdyaXR0ZW4uIFBsZWFzZSBzZWUgdGhlICdOZXN0ZWQgY2xhc3NlcycKICAgICAgICAgICAgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpbiBTV0lHUGx1cy5odG1sIGlmIHlvdSB3ZXJlIHByZXZpb3VzbHkgdXNpbmcgdGhpcwogICAgICAgICAgICBmZWF0dXJlLgoKICAgICAgICAgICAgU1dJRyBub3cgcGFyc2VzIHRoZSBjb250ZW50cyBvZiBuZXN0ZWQgY2xhc3NlcyB3aGVyZSBwcmV2aW91c2x5IGl0IGRpZCBub3QuIFlvdQogICAgICAgICAgICBtYXkgZmluZCB0aGF0IHlvdSB3aWxsIG5lZWQgdG8gbWFrZSBhZGp1c3RtZW50cyB0byB5b3VyIGludGVyZmFjZSBmaWxlIGFzCiAgICAgICAgICAgIGVmZmVjdGl2ZWx5IGV4dHJhIGNvZGUgaXMgYmVpbmcgd3JhcHBlZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDItMDY6IGdqYW5zc2VucwogICAgICAgICAgICBbR3VpbGVdIFBhdGNoICMxMzMuIE1ha2Ugc2NtIHRvIHN0cmluZyBjb252ZXJzaW9uIHdvcmsgd2l0aCBub24tYXNjaWkgc3RyaW5ncy4KICAgICAgICAgICAgR3VpbGUgMiBoYXMgYSBjb21wbGV0ZWx5IHJld3JpdHRlbiBzdHJpbmcgaW1wbGVtZW50YXRpb24uIFNXSUcgbWFkZSBzb21lIGFzc3VtcHRpb25zCiAgICAgICAgICAgIHRoYXQgYXJlIG5vIGxvbmdlciB2YWxpZCBhcyB0byB0aGUgaW50ZXJuYWxzIG9mIGd1aWxlJ3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgoKMjAxNC0wMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgbmV3IHN3aWd0eXBlX2lub3V0LmkgbGlicmFyeSBjb250YWluaW5nIFNXSUdUWVBFIComIE9VVFBVVCB0eXBlbWFwcy4KCiAgICAgICAgICAgIEV4YW1wbGUgdXNhZ2Ugd3JhcHBpbmc6CgogICAgICAgICAgICAgIHZvaWQgZihYWFggKiYgeCkgeyB4ID0gbmV3IFhYWCgxMTEpOyB9CgogICAgICAgICAgICB3b3VsZCBiZToKCiAgICAgICAgICAgICAgWFhYIHggPSBudWxsOwogICAgICAgICAgICAgIGYob3V0IHgpOwogICAgICAgICAgICAgIC8vIHVzZSB4CiAgICAgICAgICAgICAgeC5EaXNwb3NlKCk7IC8vIG1hbnVhbGx5IGNsZWFyIG1lbW9yeSBvciBvdGhlcndpc2UgbGVhdmUgb3V0IGFuZCBsZWF2ZSBpdCB0byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IKCjIwMTQtMDEtMjE6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgJWdvX2ltcG9ydCBkaXJlY3RpdmUuCgoyMDE0LTAxLTIxOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIHN1cHBvcnQgZm9yIEdvIDEuMywgbm90IHlldCByZWxlYXNlZC4KCjIwMTQtMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yIGV4Y2VwdGlvbnMgKFN3aWc6OkRpcmVjdG9yRXhjZXB0aW9uKSBub3cgZGVyaXZlIGZyb20gc3RkOjpleGNlcHRpb24KICAgICAgICAgICAgYW5kIGhlbmNlIHByb3ZpZGUgdGhlIHdoYXQoKSBtZXRob2QuIEluIFB5dGhvbiBhbmQgUnVieSwgdGhpcyByZXBsYWNlcyB0aGUgbm93CiAgICAgICAgICAgIGRlcHJlY2F0ZWQgRGlyZWN0b3JFeGNlcHRpb246OmdldE1lc3NhZ2UoKSBtZXRob2QuCgoyMDE0LTAxLTE0OiBkaW9yY2V0eQogICAgICAgICAgICBQYXRjaCAjMTEyIC0gRml4IHN5bWJvbCByZXNvbHV0aW9uIGludm9sdmluZyBzY29wZXMgdGhhdCBoYXZlIG11bHRpcGxlIGxldmVscwogICAgICAgICAgICBvZiB0eXBlZGVmcyAtIGZpeGVzIHNvbWUgdGVtcGxhdGUgcmVzb2x1dGlvbnMgYXMgd2VsbCBhcyBzb21lIHR5cGVtYXAgc2VhcmNoZXMuCgoyMDE0LTAxLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYW5kIGRvY3VtZW50IHRoZSBuYXR1cmFsdmFyIGZlYXR1cmUgb3ZlcnJpZGUgYmVoYXZpb3VyIC0gdGhlIG5hdHVyYWx2YXIKICAgICAgICAgICAgZmVhdHVyZSBhdHRhY2hlZCB0byBhIHZhcmlhYmxlIG5hbWUgaGFzIHByZWNlZGVuY2Ugb3ZlciB0aGUgbmF0dXJhbHZhcgogICAgICAgICAgICBmZWF0dXJlIGF0dGFjaGVkIHRvIHRoZSB2YXJpYWJsZSdzIHR5cGUuIFRoZSBvdmVycmlkaW5nIHdhcyBub3Qgd29ya2luZwogICAgICAgICAgICB3aGVuIHR1cm5pbmcgdGhlIGZlYXR1cmUgb2ZmIG9uIHRoZSB2YXJpYWJsZSdzIG5hbWUuCgogICAgICAgICAgICBGaXggc28gdGhhdCBhbnkgdXNlIG9mIHRoZSBuYXR1cmFsdmFyIGZlYXR1cmUgd2lsbCBvdmVycmlkZSB0aGUgZ2xvYmFsCiAgICAgICAgICAgIHNldHRpbmcuIFByZXZpb3VzbHkgd2hlbiBzZXQgZ2xvYmFsbHkgYnkgLW5hdHVyYWx2YXIgb3IgJW1vZHVsZShuYXR1cmFsdmFyPTEpLAogICAgICAgICAgICB1c2Ugb2YgdGhlIG5hdHVyYWx2YXIgZmVhdHVyZSB3YXMgbm90IGFsd2F5cyBob25vdXJlZC4KCjIwMTQtMDEtMDY6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBGaXggYnVnIHRoYXQgYnJva2UgdXNpbmcgZGlyZWN0b3JzIGZyb20gYSB0aHJlYWQgbm90CgkgICAgY3JlYXRlZCBieSBHby4KCjIwMTMtMTItMjQ6IHB0b211bGlrCiAgICAgICAgICAgIFtQeXRob25dIFNGIEJ1ZyAjMTI5NwoKICAgICAgICAgICAgUmVzb2x2ZSBzZXZlcmFsIGlzc3VlcyByZWxhdGVkIHRvIHB5dGhvbiBpbXBvcnRzLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgaXQncyBub3cgcG9zc2libGUgdG8gaW1wb3J0IG1vZHVsZXMgaGF2aW5nIHRoZSBzYW1lIG1vZHVsZQogICAgICAgICAgICBuYW1lcywgYnV0IGJlbG9uZ2luZyBpbiBkaWZmZXJlbnQgcGFja2FnZXMuCiAgICAgICAgICAgIAogICAgICAgICAgICBGcm9tIHRoZSB1c2VyJ3Mgdmlld3BvaW50LCB0aGlzIHBhdGNoIGdpdmVzIGEgbGl0dGxlIGJpdCBtb3JlIGNvbnRyb2wgb24KICAgICAgICAgICAgaW1wb3J0IHN0YXRlbWVudHMgZ2VuZXJhdGVkIGJ5IFNXSUcuIFRoZSB1c2VyIG1heSBjaG9vc2UgdG8gdXNlIHJlbGF0aXZlCiAgICAgICAgICAgIG9yIGFic29sdXRlIGltcG9ydHMuCiAgICAgICAgICAgIAogICAgICAgICAgICBTb21lIGRldGFpbHM6CiAgICAgICAgICAgICAgLSB3ZSAoc3RpbGwpIGdlbmVyYXRlIGltcG9ydCBzdGF0ZW1lbnRzIGluIHRoZSBmb3JtICdpbXBvcnQgYS5iLmMnIHdoaWNoCiAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byBhYnNvbHV0ZSBpbXBvcnRzIGluIHB5dGhvbjMgYW5kICh0aGUgb25seSBhdmFpbGFibGUpCiAgICAgICAgICAgICAgICBhbWJpZ3VvdXMgb25lIGluIHB5dGhvbjIuCiAgICAgICAgICAgICAgLSBhZGRlZCAtcmVsYXRpdmVpbXBvcnQgb3B0aW9uIHRvIHVzZSBleHBsaWNpdCByZWxhdGl2ZSBpbXBvcnQgc3ludGF4CiAgICAgICAgICAgICAgICAocHl0aG9uMyksCgogICAgICAgICAgICBUaGUgIlB5dGhvbiBQYWNrYWdlcyIgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBkaXNjdXNzZXMgaG93IHRvIHdvcmsKICAgICAgICAgICAgd2l0aCBpbXBvcnRpbmcgcGFja2FnZXMgaW5jbHVkaW5nIHRoZSBuZXcgLXJlbGF0aXZlaW1wb3J0IGNvbW1hbmQgbGluZSBvcHRpb24uCgoyMDEzLTEyLTIzOiB2YWR6CiAgICAgICAgICAgIFtPY3RhdmUsIFBlcmwsIFB5dGhvbiwgUiwgUnVieSwgVGNsXSBDaGFuZ2UgdGhlIGxlbmd0aCBvZiBzdHJpbmdzIGNyZWF0ZWQgZnJvbSBmaXhlZC1zaXplIGNoYXIKICAgICAgICAgICAgYnVmZmVycyBpbiBDIGNvZGUuCgogICAgICAgICAgICBUaGlzIGlzIGEgcG90ZW50aWFsIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGJyZWFrOiBhICJjaGFyIGJ1Zls1XSIgY29udGFpbmluZyAiaG9cMGxhIiB3YXMKICAgICAgICAgICAgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2YgbGVuZ3RoIDUgYmVmb3JlLCBidXQgaXMgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2YgbGVuZ3RoIDIgbm93LiBBbHNvLAogICAgICAgICAgICBpdCB3YXMgcG9zc2libGUgdG8gYXNzaWduIGEgKG5vbi1OVUwtdGVybWluYXRlZCkgc3RyaW5nICJoZWxsbyIgdG8gc3VjaCBhIGJ1ZmZlciBiZWZvcmUgYnV0CiAgICAgICAgICAgIG5vdyB0aGlzIGZhaWxzIGFuZCBvbmx5ICJoZWxvIiBjYW4gZml0LgoKICAgICAgICAgICAgQXBwbHkgImNoYXIgRklYU0laRVtBTlldIiB0eXBlbWFwcyB0byBleHBsaWNpdGx5IGNob29zZSB0aGUgb2xkIGJlaGF2aW91ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTMtMTItMjM6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBBZGQgc3VwcG9ydCBmb3IgZGlyZWN0b3JzLgoKMjAxMy0xMi0xODogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIERvbid0IHJlcXVpcmUgdGhhdCBHbyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmUgc2V0CgkgICAgd2hlbiBydW5uaW5nIGV4YW1wbGVzIG9yIHRlc3RzdWl0ZSB3aGVuIHVzaW5nIEdvIDEgb3IKCSAgICBsYXRlci4KCjIwMTMtMTItMTc6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBSZW1vdmUgLWxvbmdzaXplIG9wdGlvbiAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksCgkgICAgaWdub3JlIGl0IGlmIHNlZW4pLgoKMjAxMy0xMi0xNzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCAtZ28tcGtncGF0aCBvcHRpb24uCgoyMDEzLTEyLTE2OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gVXBkYXRlIGZvciBHbyAxLjIgcmVsZWFzZS4gIEFkZCBzdXBwb3J0IGZvciBsaW5raW5nCgkgICAgU1dJRyBjb2RlIGRpcmVjdGx5IGludG8gZXhlY3V0YWJsZSwgcmF0aGVyIHRoYW4gdXNpbmcgYQoJICAgIHNoYXJlZCBsaWJyYXJ5LgoKMjAxMy0xMi0xMzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBTV0lHIHNvdXJjZSBmaWxlIG5hbWUgYXMgY29tbWVudHMgaW4gZ2VuZXJhdGVkCgkgICAgZmlsZXMuICBUaGlzIGNhbiBiZSB1c2VkIGJ5IEdvIGRvY3VtZW50YXRpb24gdG9vbHMuCgoyMDEzLTEyLTEyOiBqbGV2ZXF1ZQoJICAgIFtMdWFdIEZpeCB0eXBvICh3Y2hhciBpbnN0ZWFkIG9mIHdjaGFyX3QpIHdoaWNoIG1hZGUgd2NoYXIuaQoJICAgIGZvciBMdWEgdXNlbGVzcy4KCjIwMTMtMTItMTI6IHZtaWtsb3MKCSAgICBbUEhQXSBQSFAncyBwZWN1bGlhciBjYWxsLXRpbWUgcGFzcy1ieS1yZWZlcmVuY2UgZmVhdHVyZSB3YXMKCSAgICBkZXByZWNhdGVkIGluIFBIUCA1LjMgYW5kIHJlbW92ZWQgaW4gUEhQIDUuNCwgc28gdXBkYXRlIHRoZSBSRUYKCSAgICB0eXBlbWFwcyBpbiBwaHBwb2ludGVycy5pIHRvIHNwZWNpZnkgcGFzcy1ieS1yZWZlcmVuY2UgaW4gdGhlCgkgICAgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIEV4YW1wbGVzL3BocC9wb2ludGVyIGhhcyBiZWVuIHVwZGF0ZWQKCSAgICBhY2NvcmRpbmdseS4KCjIwMTMtMTItMTI6IG9sbHkKCSAgICBbUEhQXSBUaGUgdXNhZ2Ugb2YgJGlucHV0IGluIFBIUCBkaXJlY3Rvcm91dCB0eXBlbWFwcyBoYXMgYmVlbgoJICAgIGNoYW5nZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIGxhbmd1YWdlcy4gIFRoZSB0eXBlbWFwcwoJICAgIHByb3ZpZGVkIGJ5IFNXSUcgaGF2ZSBiZWVuIHVwZGF0ZWQgYWNjb3JkaW5nbHksIGJ1dCBpZiB5b3UKCSAgICBoYXZlIHdyaXR0ZW4geW91ciBvd24gZGlyZWN0b3JvdXQgdHlwZW1hcHMsIHlvdSdsbCBuZWVkIHRvCgkgICAgdXBkYXRlICRpbnB1dCB0byAmJGlucHV0IChvciBtYWtlIGVxdWl2YWxlbnQgY2hhbmdlcykuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTExLTI3OiB2YWR6CiAgICAgICAgICAgIFtDIywgSmF2YSwgUHl0aG9uXSBBZGQgc3RkX2F1dG9fcHRyLmkgZGVmaW5pbmcgdHlwZW1hcHMgZm9yIHJldHVybmluZyBzdGQ6OmF1dG9fcHRyPD4uCgoyMDEzLTExLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoICM3OSBmcm9tIEJyYW50IEt5c2VyCiAgICAgICAgICAgICAgLSBSZW1vdmUgdXNpbmcgZGlyZWN0aXZlcyBmcm9tIHRoZSBnZW5lcmF0ZWQgQyMgY29kZSBhbmQgZnVsbHkgcXVhbGlmeSB0aGUgdXNlIG9mIGFsbCAuTkVUCiAgICAgICAgICAgICAgICBmcmFtZXdvcmsgdHlwZXMgaW4gb3JkZXIgdG8gbWluaW1pemUgcG90ZW50aWFsIG5hbWUgY29sbGlzaW9ucyBmcm9tIGlucHV0IGZpbGVzIGRlZmluaW5nCiAgICAgICAgICAgICAgICB0eXBlcywgbmFtZXNwYWNlLCBldGMgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIC5ORVQgZnJhbWV3b3JrIG1lbWJlcnMuCiAgICAgICAgICAgICAgLSBHbG9iYWxseSBxdWFsaWZ5IHRoZSB1c2Ugb2YgLk5FVCBmcmFtZXdvcmsgdHlwZXMgaW4gdGhlIFN5c3RlbSBuYW1lc3BhY2UKICAgICAgICAgICAgICAtIFJlbW92ZSAuTkVUIDEuMSBzdXBwb3J0LCAuTkVUIDIgaXMgdGhlIG1pbmltdW0gZm9yIHRoZSBDIyBtb2R1bGUKCiAgICAgICAgICAgIFRoaXMgaXMgYSBwb3RlbnRpYWwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYnJlYWsgaWYgY29kZSBoYXMgYmVlbiBhZGRlZCByZWx5aW5nIG9uIHRoZXNlIHVzaW5nCiAgICAgICAgICAgIHN0YXRlbWVudHMgdGhhdCB1c2VkIHRvIGJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdXNpbmcgU3lzdGVtOwogICAgICAgICAgICAgIHVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKCiAgICAgICAgICAgIFRoZSBxdWljayBmaXggdG8gYWRkIHRoZXNlIGJhY2sgaW4gaXMgdG8gYWRkIHRoZSAtRFNXSUcyX0NTSEFSUCBjb21tYW5kIGxpbmUgb3B0aW9uIHdoZW4KICAgICAgICAgICAgZXhlY3V0aW5nIFNXSUcuIFNlZSBDU2hhcnAuaHRtbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTExLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHNvbWUgY29ybmVyIGNhc2VzIGZvciB0aGUgJHBhY2thZ2VwYXRoLyRqYXZhY2xhc3NuYW1lIHNwZWNpYWwgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgoKMjAxMy0xMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICM5MSBmcm9tIE1hcnZpbiBHcmVlbmJlcmcgLSBBZGQgZGlyZWN0b3I6ZXhjZXB0IGZlYXR1cmUgZm9yIGltcHJvdmVkCiAgICAgICAgICAgIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBkaXJlY3RvciBtZXRob2RzIGZvciBKYXZhLgoKMjAxMy0xMC0xNTogdmFkegogICAgICAgICAgICBBbGxvdyB1c2luZyBcbCwgXEwsIFx1LCBcVSBhbmQgXEUgaW4gdGhlIHN1YnN0aXR1dGlvbiBwYXJ0IG9mICUocmVnZXg6L3BhdHRlcm4vc3Vic3QvKQogICAgICAgICAgICBpbnNpZGUgJXJlbmFtZSB0byBjaGFuZ2UgdGhlIGNhc2Ugb2YgdGhlIHRleHQgYmVpbmcgcmVwbGFjZWQuCgoyMDEzLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gQXBwbHkgIzk2IC0gc3VwZXJjbGFzcyBub3QgbGlzcGlmeQoKMjAxMy0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgTWVyZ2UgaW4gQysrMTEgc3VwcG9ydCBmcm9tIHRoZSBnc29jMjAwOS1tYXRldnogYnJhbmNoIHdoZXJlIE1hdGV2eiBKZWtvdmVjIGZpcnN0CiAgICAgICAgICAgIHN0YXJ0ZWQgdGhlIEMrKzB4IGFkZGl0aW9ucy4gRG9jdW1lbnRhdGlvbiBvZiB0aGUgQysrMTEgZmVhdHVyZXMgc3VwcG9ydGVkIGlzIGluIGEKICAgICAgICAgICAgbmV3IENoYXB0ZXIgb2YgdGhlIGRvY3VtZW50YXRpb24sICJTV0lHIGFuZCBDKysxMSIgaW4gRG9jL01hbnVhbC9DUGx1c1BsdXMxMS5odG1sLgoKMjAxMy0xMC0wNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVuYXR1cmFsdmFyIG5vdCBoYXZpbmcgYW55IGFmZmVjdCBvbiB0ZW1wbGF0ZWQgY2xhc3NlcyBpbnN0YW50aWF0ZWQgd2l0aCBhbgogICAgICAgICAgICBlbnVtIGFzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZS4gUHJvYmxlbSByZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKMjAxMy0wOS0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBhIG1lbW9yeSBsZWFrIGZvciB0aGUgamF2YSBjaGFyICoqU1RSSU5HX0FSUkFZIHR5cGVtYXBzLgoKVmVyc2lvbiAyLjAuMTIgKDkgRmViIDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wMS0xNjogd3NmdWx0b24KICAgICAgICAgICAgW1BIUF0gRml4IGNvbXBpbGF0aW9uIGVycm9yIGluIFpUUyBtb2RlICg2NCBiaXQgd2luZG93cykgZHVlIHRvIGluY29ycmVjdCBwbGFjZW1lbnQKICAgICAgICAgICAgb2YgVFNSTUxTX0ZFVENIKCkgaW4gU1dJR19QaHBfR2V0TW9kdWxlKCkgYXMgcmVwb3J0ZWQgYnkgTWFyayBEYXdzb24tQnV0dGVyd29ydGguCgoyMDE0LTAxLTEzOiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIHVwZGF0ZSBzdXBwb3J0IHRvIE9jdGF2ZSB2ZXJzaW9uIDMuOC4wCgogICAgICAgICAgICAtIE9jdGF2ZSAzLjguMCBubyBsb25nZXIgZGVmaW5lcyBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSLCBidXQgMy44LjEKICAgICAgICAgICAgICB3aWxsIGRlZmluZSBPQ1RBVkVfe01BSk9SLE1JTk9SLFBBVENIfV9WRVJTSU9OIGluc3RlYWQ6IHNlZQogICAgICAgICAgICAgICAgaHR0cDovL2hnLnNhdmFubmFoLmdudS5vcmcvaGd3ZWIvb2N0YXZlL3Jldi9iNmI2ZTBkYzcwMGUKICAgICAgICAgICAgICBTbyB3ZSBub3cgdXNlIGEgbmV3IG1hY3JvIFNXSUdfT0NUQVZFX1BSRVJFUShtYWpvcixtaW5vcixwYXRjaCkgdG8KICAgICAgICAgICAgICBlbmFibGUgZmVhdHVyZXMgcmVxdWlyaW5nIE9jdGF2ZSB2ZXJzaW9uIG1ham9yLm1pbm9yLnBhdGNoIG9yIGxhdGVyLgoKICAgICAgICAgICAgICBGb3IgT2N0YXZlIHZlcnNpb25zIHByaW9yIHRvIDMuOC4xLCB3ZSByZWNvbnN0cnVjdCB2YWx1ZXMgZm9yCiAgICAgICAgICAgICAgT0NUQVZFX3tNQUpPUixNSU5PUixQQVRDSH1fVkVSU0lPTiBiYXNlZCBvbiBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSLAogICAgICAgICAgICAgIGV4dHJhY3RlZCBmcm9tIE9jdGF2ZSdzIENoYW5nZUxvZ3MuIEFuIGFkZGl0aW9uYWwgaGFjayBpcyBuZWVkZWQgdG8KICAgICAgICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIE9jdGF2ZSA8PSAzLjIueCBhbmQgMy44LjAsIG5laXRoZXIgb2Ygd2hpY2ggZGVmaW5lCiAgICAgICAgICAgICAgT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUi4KCiAgICAgICAgICAgIC0gT2N0YXZlIDMuOC4wIGRlcHJlY2F0ZXMgc3ltYm9sX3RhYmxlOjp2YXJyZWYoKSwgc28gcmVtb3ZlIGl0cyB1c2UKICAgICAgICAgICAgICBmb3IgdGhpcyBhbmQgZnV0dXJlIHZlcnNpb25zIG9mIE9jdGF2ZS4KCiAgICAgICAgICAgIC0gT2N0YXZlIDMuOC4wIHJlbW92ZXMgb2N0YXZlX3ZhbHVlOjppc19yZWFsX25kX2FycmF5KCksIHVzZWQgaW4KICAgICAgICAgICAgICBvY3RhdmVfc3dpZ190eXBlOjpkaW1zKCkuIEl0cyB1c2UgaXMgbm90IHJlcXVpcmVkIGhlcmUsIHNvIHJlbW92ZSBpdC4KCiAgICAgICAgICAgIC0gUmV0ZXN0ZWQgYWdhaW5zdCBPY3RhdmUgdmVyc2lvbnMgMy4wLjUsIDMuMi40LCAzLjQuMywgMy42LjQsIGFuZCAzLjguMC4KCiAgICAgICAgICAgIC0gVXBkYXRlZCBPY3RhdmUgZG9jdW1lbnRhdGlvbiB3aXRoIHRlc3RlZCBPY3RhdmUgdmVyc2lvbnMsIGFuZCBhZGRlZCBhCiAgICAgICAgICAgICAgd2FybmluZyBhZ2FpbnN0IHVzaW5nIHZlcnNpb25zIDw9IDMueC54LCB3aGljaCBhcmUgbm8gbG9uZ2VyIHRlc3RlZC4KCjIwMTMtMTItMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIEMrKzExIHN1cHBvcnQgZm9yIG5ldyB2ZXJzaW9ucyBvZiBlcmFzZSBhbmQgaW5zZXJ0IGluIHRoZSBTVEwgY29udGFpbmVycy4KCiAgICAgICAgICAgIFRoZSBlcmFzZSBhbmQgaW5zZXJ0IG1ldGhvZHMgaW4gdGhlIGNvbnRhaW5lcnMgdXNlIGNvbnN0X2l0ZXJhdG9yIGluc3RlYWQKICAgICAgICAgICAgb2YgaXRlcmF0b3IgaW4gQysrMTEuICBUaGVyZSBhcmUgdGltZXMgd2hlbiB0aGUgbWV0aG9kcyB3cmFwcGVkIG11c3QgbWF0Y2gKICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgZXhhY3RseS4gU3BlY2lmaWNhbGx5IHdoZW4gZnVsbCB0eXBlIGluZm9ybWF0aW9uIGZvcgogICAgICAgICAgICB0ZW1wbGF0ZSB0eXBlcyBpcyBtaXNzaW5nIG9yIFNXSUcgZmFpbHMgdG8gbG9vayB1cCB0aGUgdHlwZSBjb3JyZWN0bHksCiAgICAgICAgICAgIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX3ZlY3Rvci5pPgogICAgICAgICAgICAgIHR5cGVkZWYgZmxvYXQgUmVhbDsKICAgICAgICAgICAgICAldGVtcGxhdGUoUmVhbFZlY3Rvcikgc3RkOjp2ZWN0b3I8UmVhbD47CgogICAgICAgICAgICBTV0lHIGRvZXMgbm90IGZpbmQgc3RkOjp2ZWN0b3I8UmVhbD46Oml0ZXJhdG9yIGJlY2F1c2UgJXRlbXBsYXRlIHVzaW5nCiAgICAgICAgICAgIHR5cGVkZWZzIGRvZXMgbm90IGFsd2F5cyB3b3JrIGFuZCBzbyBTV0lHIGRvZXNuJ3Qga25vdyBpZiB0aGUgdHlwZSBpcwogICAgICAgICAgICBjb3B5YWJsZSBhbmQgc28gdXNlcyBTd2lnVmFsdWVXcmFwcGVyPGl0ZXJhdG9yPiB3aGljaCBkb2VzCiAgICAgICAgICAgIG5vdCBzdXBwb3J0IGNvbnZlcnNpb24gdG8gYW5vdGhlciB0eXBlIChjb25zdF9pdGVyYXRvcikuIFRoaXMgcmVzdWx0ZWQKICAgICAgICAgICAgaW4gY29tcGlsYXRpb24gZXJyb3JzIHdoZW4gdXNpbmcgdGhlIEMrKzExIHZlcnNpb24gb2YgdGhlIGNvbnRhaW5lcnMuCgogICAgICAgICAgICBDbG9zZXMgIzczCgoyMDEzLTEwLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IFNGICMxMzQwIC0gVmlzdWFsIFN0dWRpbyBjb21waWxlIGVycm9yIGluIEMrKyB3cmFwcGVycyBkdWUgdG8gI2luY2x1ZGUgPGV4Y2VwdGlvbj4KICAgICAgICAgICAgd2l0aGluIGV4dGVybiAiQyIgYmxvY2suCgoyMDEzLTEwLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YgIzEzNDUgLSBNaXNzaW5nICNpbmNsdWRlIDxzdGRkZWYuaD4gZm9yIG9mZnNldG9mIHdoZW4gdXNpbmcgLWJ1aWx0aW4uCgoyMDEzLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSAjOTIgLSBtaXNzaW5nIHJldHVybiBzdGF0ZW1lbnRzIGZvciBTV0lHX0x1YV9hZGRfbmFtZXNwYWNlX2RldGFpbHMoKQogICAgICAgICAgICBhbmQgU1dJR19MdWFfbmFtZXNwYWNlX3JlZ2lzdGVyKCkuCgpWZXJzaW9uIDIuMC4xMSAoMTUgU2VwIDIwMTMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTMtMDktMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggYXR0ZW1wdCB0byBmcmVlIGEgbm9uLWhlYXAgb2JqZWN0IGluIE9VVFBVVCB0eXBlbWFwcyBmb3I6CiAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKk9VVFBVVAogICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKk9VVFBVVAogICAgICAgICAgICAgIHNpZ25lZCBsb25nIGxvbmcgKk9VVFBVVAogICAgICAgICAgICAgIGNoYXIgKk9VVFBVVAogICAgICAgICAgICAgIHNpZ25lZCBjaGFyKk9VVFBVVAogICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqT1VUUFVUCgoyMDEzLTA5LTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQdWxsIEdpdCBwYXRjaCAjNjIuCiAgICAgICAgICAgICAgMSkgU3RhdGljIG1lbWJlcnMgYW5kIHN0YXRpYyBmdW5jdGlvbnMgaW5zaWRlIGNsYXNzIGNhbiBiZSBhY2Nlc3NlZCBhcwogICAgICAgICAgICAgICAgIE1vZHVsZU5hbWUuQ2xhc3NOYW1lLkZ1bmN0aW9uTmFtZSAoTWVtYmVyTmFtZSByZXNwZWN0aXZlbHkpLiBPbGQgd2F5IHN1Y2ggYXMKICAgICAgICAgICAgICAgICBNb2R1bGVOYW1lLkNsYXNzTmFtZV9GdW5jdGlvbk5hbWUgc3RpbGwgd29ya3MuCiAgICAgICAgICAgICAgMikgU2FtZSBnb2VzIGZvciBlbnVtcyBpbnNpZGUgY2xhc3NlczogTW9kdWxlTmFtZS5DbGFzc05hbWUuRW51bVZhbHVlMSBldGMuCgoyMDEzLTA5LTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbVVRMXSBJbmZpbml0eSBpcyBub3cgYnkgZGVmYXVsdCBhbiBhY2NlcHRhYmxlIHZhbHVlIGZvciB0eXBlICdmbG9hdCcuIFRoaXMgZml4IG1ha2VzCiAgICAgICAgICAgIHRoZSBoYW5kbGluZyBvZiB0eXBlICdmbG9hdCcgYW5kICdkb3VibGUnIHRoZSBzYW1lLiBUaGUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhlCiAgICAgICAgICAgIEM5OSBpc2Zpbml0ZSgpIG1hY3JvLCBvciBvdGhlcndpc2Ugc29tZSBwbGF0Zm9ybSBkZXBlbmRlbnQgZXF1aXZhbGVudHMsIHRvIGJlIGF2YWlsYWJsZS4KCiAgICAgICAgICAgIFVzZXJzIHJlcXVpcmluZyB0aGUgb2xkIGJlaGF2aW91ciBvZiBub3QgYWNjZXB0aW5nIGluZmluaXR5LCBjYW4gZGVmaW5lIGEgJ2NoZWNrJyB0eXBlbWFwCiAgICAgICAgICAgIHdoZXJldmVyIGEgZmxvYXQgaXMgdXNlZCwgc3VjaCBhczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY2hlY2ssZnJhZ21lbnQ9IjxmbG9hdC5oPiIpIGZsb2F0LCBjb25zdCBmbG9hdCAmICV7CiAgICAgICAgICAgICAgICBpZiAoJDEgPCAtRkxUX01BWCB8fCAkMSA+IEZMVF9NQVgpIHsKICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1R5cGVFcnJvciwgIk92ZXJmbG93IGluIHR5cGUgZmxvYXQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMy0wOC0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUHVsbCBHaXQgcGF0Y2ggIzgxOiBJbmNsdWRlIEx1YSBlcnJvciBsb2N1cyBpbiBTV0lHIGVycm9yIG1lc3NhZ2VzLiAgCiAgICAgICAgICAgIFRoaXMgaXMgc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gTHVhIGVycm9yIG1lc3NhZ2VzLCBhbmQgbWFrZXMgaXQgbXVjaAogICAgICAgICAgICBlYXNpZXIgdG8gZmluZCBidWdzLgoKMjAxMy0wOC0yOTogd3NmdWx0b24KICAgICAgICAgICAgUHVsbCBHaXQgcGF0Y2ggIzc1OiBIYW5kbGUgVVRGLTggZmlsZXMgd2l0aCBCT00gYXQgYmVnaW5uaW5nIG9mIGZpbGUuIFdhcyBnaXZpbmcgYW4KICAgICAgICAgICAgJ0lsbGVnYWwgdG9rZW4nIHN5bnRheCBlcnJvci4KCjIwMTMtMDgtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gUHVsbCBHaXQgcGF0Y2ggIzc3OiBBbGxvdyBleHBvcnRpbmcgc3RkOjptYXAgdXNpbmcgbm9uLWRlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbi4KCjIwMTMtMDgtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICVpbXBsaWNpdGNvbnYgaXMgaW1wcm92ZWQgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zLiBMaWtlIGluIEMrKywgdGhlIG1ldGhvZHMKICAgICAgICAgICAgd2l0aCB0aGUgYWN0dWFsIHR5cGVzIGFyZSBjb25zaWRlcmVkIGJlZm9yZSB0cnlpbmcgaW1wbGljaXQgY29udmVyc2lvbnMuIEV4YW1wbGU6CgogICAgICAgICAgICAgICVpbXBsaWNpdGNvbnYgQTsKICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICBBKGludCBpKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNsYXNzIENDQyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludCB4eChpbnQgaSkgeyByZXR1cm4gMTE7IH0KICAgICAgICAgICAgICAgICAgaW50IHh4KGNvbnN0IEEmIGkpIHsgcmV0dXJuIDIyOyB9CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHl0aG9uIGNvZGU6CgogICAgICAgICAgICAgIENDQygpLnh4KC0xKQoKICAgICAgICAgICAgd2lsbCBub3cgcmV0dXJuIDExIGluc3RlYWQgb2YgMjIgLSB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBpcyBub3QgZG9uZS4KCjIwMTMtMDgtMjM6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggY2xhbmcrKyB3YXJuaW5nIGluIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUuCgoyMDEzLTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAlaW1wbGljaXRjb252IHdpbGwgbm93IGFjY2VwdCBOb25lIHdoZXJlIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHRha2VzIGEgQy9DKysgcG9pbnRlci4KICAgICAgICAgICAgUHJvYmxlbSBoaWdobGlnaHRlZCBieSBCbyBQZW5nLiBDbG9zZXMgU0YgcGF0Y2ggIzIzMC4KCjIwMTMtMDgtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFNGIFBhdGNoICMzMjYgZnJvbSBLcmlzIFRoaWVsZW1hbnMgLSBSZW1vdmUgU3dpZ1B5T2JqZWN0X3ByaW50IGFuZCBTd2lnUHlPYmplY3Rfc3RyIGFuZAogICAgICAgICAgICBtYWtlIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciB1c2UgdGhlIGRlZmF1bHQgcHl0aG9uIGltcGxlbWVudGF0aW9ucywgd2hpY2ggd2lsbCBmYWxsIGJhY2sgdG8gcmVwcgogICAgICAgICAgICAoZm9yIC1idWlsdGluIG9wdGlvbikuCgogICAgICAgICAgICBBZHZhbnRhZ2VzOgogICAgICAgICAgICAtIGl0IGF2b2lkcyB0aGUgc3dpZyB1c2VyIGhhdmluZyB0byBqdW1wIHRocm91Z2ggaG9vcHMgdG8gZ2V0IHByaW50IHRvIHdvcmsgYXMgZXhwZWN0ZWQgd2hlbgogICAgICAgICAgICAgIHJlZGVmaW5pbmcgcmVwci9zdHIgc2xvdHMuCiAgICAgICAgICAgIC0gdHlwaW5nIHRoZSBuYW1lIG9mIGEgdmFyaWFibGUgb24gdGhlIHB5dGhvbiBwcm9tcHQgbm93IHByaW50cyB0aGUgcmVzdWx0IG9mIGEgKHBvc3NpYmx5IHJlZGVmaW5lZCkKICAgICAgICAgICAgICByZXByLCB3aXRob3V0IHRoZSBzd2lnIHVzZXIgaGF2aW5nIHRvIGRvIGFueSBleHRyYSB3b3JrLgogICAgICAgICAgICAtIHdoZW4gcmVkZWZpbmluZyByZXByLCB0aGUgc3dpZyB1c2VyIGRvZXNuJ3QgbmVjZXNzYXJpbHkgaGF2ZSB0byByZWRlZmluZSBzdHIgYXMgaXQgd2lsbCBjYWxsIHRoZQogICAgICAgICAgICAgIHJlZGVmaW5lZCByZXByCiAgICAgICAgICAgIC0gdGhlIGJlaGF2aW91ciBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHdpdGhvdXQgdGhlIC1idWlsdGluIG9wdGlvbiB3aGlsZSByZXF1aXJpbmcgbm8gZXh0cmEgd29yawogICAgICAgICAgICAgIGJ5IHRoZSB1c2VyIChhc2lkZSBmcm9tIGFkZGluZyB0aGUgJWZlYXR1cmUoInB5dGhvbjpzbG90Li4uKSBzdGF0ZW1lbnRzIG9mIGNvdXJzZSkKCiAgICAgICAgICAgIERpc2FkdmFudGFnZToKICAgICAgICAgICAgLSBkZWZhdWx0IHN0cigpIHdpbGwgZ2l2ZSBkaWZmZXJlbnQgKGJ1dCBjbGVhcmVyPykgb3V0cHV0IG9uIHN3aWdnZWQgY2xhc3NlcwoKMjAxMy0wNy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbiwgUnVieV0gRml4ICM2NCAjNjU6IE1pc3NpbmcgY29kZSBpbiBzdGQ6Om11bHRpbWFwIHdyYXBwZXJzLiBQcmV2aW91c2x5IGFuIGluc3RhbnRpYXRpb24KICAgICAgICAgICAgb2YgYSBzdGQ6Om1hcCB3YXMgZXJyb25lb3VzbHkgcmVxdWlyZWQgaW4gYWRkaXRpb24gdG8gYW4gaW5zdGFudGlhdGlvbiBvZiBzdGQ6Om11bHRpbWFwIHdpdGggdGhlCiAgICAgICAgICAgIHNhbWUgdGVtcGxhdGUgcGFyYW1ldGVycyB0byBwcmV2ZW50IGNvbXBpbGF0aW9uIGVycm9ycyBmb3IgdGhlIHdyYXBwZXJzIG9mIGEgc3RkOjptdWx0aW1hcC4KCjIwMTMtMDctMTQ6IGpvZXF1YW50CiAgICAgICAgICAgIFtSXSBDaGFuZ2UgdHlwZXMgZmlsZSB0byBhbGxvdyBmb3IgU0VYUCByZXR1cm4gdmFsdWVzCgoyMDEzLTA3LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgJXB5dGhvbmJlZ2luIGRpcmVjdGl2ZSB3aGljaCB3b3JrcyBsaWtlICVweXRob25jb2RlLCBleGNlcHQgdGhlIHNwZWNpZmllZCBjb2RlIGlzCiAgICAgICAgICAgIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdlbmVyYXRlZCAucHkgZmlsZS4gVGhpcyBpcyBwcmltYXJpbHkgbmVlZGVkIGZvciBpbXBvcnRpbmcgZnJvbQogICAgICAgICAgICBfX2Z1dHVyZV9fIHN0YXRlbWVudHMgcmVxdWlyZWQgdG8gYmUgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAlcHl0aG9uYmVnaW4gJXsKICAgICAgICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCiAgICAgICAgICAgICAgcHJpbnQoIkxvYWRpbmciLCAiV2hpenoiLCAiQmFuZyIsIHNlcD0nIC4uLiAnKQogICAgICAgICAgICAgICV9CgoyMDEzLTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBTRiBwYXRjaCAjMzQwIC0gVW5pbml0aWFsaXplZCB2YXJpYWJsZSBmaXggaW4gU1dJR19QeXRob25fTm9uRHluYW1pY1NldEF0dHIKICAgICAgICAgICAgd2hlbiB1c2luZyAtYnVpbHRpbi4KCjIwMTMtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jYW1sXSBBcHBseSBTRiBwYXRjaCAjMzQxIC0gZml4IGEgY29uc3RfY2FzdCBpbiBnZW5lcmF0ZWQgY29kZSB0aGF0IHdhcyBnZW5lcmF0aW5nCiAgICAgICAgICAgIGEgPDo6IGRpZ3JhcGggd2hlbiB1c2luZyB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSAoZ2xvYmFsIHNjb3BlKSBpbiBhIHRlbXBsYXRlIHR5cGUuCgoyMDEzLTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgU0YgcGF0Y2ggIzM0MiBmcm9tIENocmlzdGlhbiBEZWxiYWVyZSB0byBmaXggc29tZSBkaXJlY3RvciBjbGFzc2VzIGNyYXNoaW5nIG9uCiAgICAgICAgICAgIG9iamVjdCBkZWxldGlvbiB3aGVuIHVzaW5nIC1idWlsdGluLiBGaXhlcyBTRiBidWcgIzEzMDEuCgoyMDEzLTA2LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgU1dJR19QWVRIT05fSU5URVJQUkVURVJfTk9fREVCVUcgbWFjcm8gd2hpY2ggY2FuIGJlIGRlZmluZWQgdG8gdXNlIHRoZSBSZWxlYXNlIHZlcnNpb24KICAgICAgICAgICAgb2YgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpbiBEZWJ1ZyBidWlsZHMgb2YgdGhlIHdyYXBwZXJzLiBUaGUgVmlzdWFsIFN0dWRpbyAuZHNwIGV4YW1wbGUKICAgICAgICAgICAgZmlsZXMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIHVzZSB0aGlzIHNvIHRoYXQgRGVidWcgYnVpbGRzIHdpbGwgbm93IHdvcmsgd2l0aG91dCBoYXZpbmcKICAgICAgICAgICAgdG8gaW5zdGFsbCBvciBidWlsZCBhIERlYnVnIGJ1aWxkIG9mIHRoZSBpbnRlcnByZXRlci4KCjIwMTMtMDYtMDc6IHdzZnVsdG9uCgkgICAgW1J1YnldIEdpdCBpc3N1ZSAjNTIuIEZpeCByZWdyZXNzaW9uIHdpdGggbWlzc2luZyByYl9jb21wbGV4X25ldyBmdW5jdGlvbiBmb3IgUnVieQogICAgICAgICAgICB2ZXJzaW9ucyBwcmlvciB0byAxLjkgdXNpbmcgc3RkOjpjb21wbGV4IHdyYXBwZXJzIGlmIGp1c3QgdXNpbmcgc3RkOjpjb21wbGV4IGFzIGFuIG91dHB1dCB0eXBlLgogICAgICAgICAgICBBbHNvIGZpeCB0aGUgQ29tcGxleCBoZWxwZXIgZnVuY3Rpb25zIGV4dGVybmFsIHZpc2liaWxpdHkgKHRvIHN0YXRpYyBieSBkZWZhdWx0KS4KCjIwMTMtMDYtMDQ6IG9sbHkKCSAgICBbUEhQXSBGaXggU1dJR19aVFNfQ29udmVydFJlc291cmNlUHRyKCkgbm90IHRvIGRlcmVmZXJlbmNlIE5VTEwKCSAgICBpZiB0aGUgdHlwZSBsb29rdXAgZmFpbHMuCgpWZXJzaW9uIDIuMC4xMCAoMjcgTWF5IDIwMTMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTMtMDUtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBQeXRob24gMyBpbmNvbnNpc3RlbmN5IHdoZW4gbmVnYXRpdmUgbnVtYmVycyBhcmUgcGFzc2VkCiAgICAgICAgICAgIHdoZXJlIGEgcGFyYW1ldGVyIGV4cGVjdHMgYW4gdW5zaWduZWQgQyB0eXBlLiBBbiBPdmVyRmxvdyBlcnJvciBpcwogICAgICAgICAgICBub3cgY29uc2lzdGVudGx5IHRocm93biBpbnN0ZWFkIG9mIGEgVHlwZUVycm9yLgoKMjAxMy0wNS0yNTogQXJ0ZW0gU2VyZWJyaXlza2l5CiAgICAgICAgICAgIFNWTiBQYXRjaCB0aWNrZXQgIzMzOCAtIGZpeGVzIHRvICVhdHRyaWJ1dGUgbWFjcm9zIGZvciB0ZW1wbGF0ZSB1c2FnZQogICAgICAgICAgICB3aXRoICVhcmcuCgoyMDEzLTA1LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY2NhY2hlLXN3aWcgaW50ZXJuYWwgZXJyb3IgYnVnIGR1ZSB0byBwcmVtYXR1cmUgZmlsZSBjbGVhbnVwLgoKICAgICAgICAgICAgRml4ZXMgU0YgYnVnIDEzMTkgd2hpY2ggc2hvd3MgdXAgYXMgYSBmYWlsdXJlIGluIHRoZSBjY2FjaGUgdGVzdHMgb24KICAgICAgICAgICAgRGViaWFuIDY0IGJpdCBXaGVlenksIHBvc3NpYmx5IGJlY2F1c2UgRU5BQkxFX1pMSUIgaXMgZGVmaW5lZC4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb3JuZXIgY2FzZSB3aGljaCB3aWxsIGJlIGhpdCB3aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcwogICAgICAgICAgICBpbiB0aGUgY2FjaGUgaXMgc2V0IHRvIGJlIHF1aXRlIGxvdyAoLUYgb3B0aW9uKSwgcmVzdWx0aW5nIGluIGEgY2FjaGUgbWlzcy4KCjIwMTMtMDUtMDk6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGJ1Z3MgaW4gT2N0YXZlIG1vZHVsZSBsb2FkaW5nOgogICAgICAgICAgICAtIGZpeCBhIG1lbW9yeSBsZWFrIGluIHNldHRpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgICAtIGluc3RhbGwgZnVuY3Rpb25zIG9ubHkgb25jZSwgdG8gc3BlZWQgdXAgbW9kdWxlIGxvYWRzCgoyMDEzLTA0LTI4OiBnamFuc3NlbnMKICAgICAgICAgICAgW0d1aWxlXSBVcGRhdGVzIGluIGd1aWxlIG1vZHVsZToKICAgICAgICAgICAgLSBBZGQgc3VwcG9ydCBmb3IgZ3VpbGUgMi4wCiAgICAgICAgICAgIC0gRHJvcCBzdXBwb3J0IGZvciBndWlsZSAxLjYKICAgICAgICAgICAgLSBEcm9wIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgd3JhcHBlcnMgdXNpbmcgZ3VpbGUncyBnaCBpbnRlcmZhY2UuCiAgICAgICAgICAgICAgQWxsIGdlbmVyYXRlZCB3cmFwcGVycyB3aWxsIHVzZSB0aGUgc2NtIGludGVyZmFjZSBmcm9tIG5vdyBvbi4KICAgICAgICAgICAgLSBEZXByZWNhdGUgLWdoIGFuZCAtc2NtIG9wdGlvbnMuIFRoZXkgYXJlIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgICAgICAgICAgQSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkIHdoZW4gdGhlc2Ugb3B0aW9ucyBhcmUgc3RpbGwgdXNlZC4KICAgICAgICAgICAgLSBGaXggYWxsIHRlc3RzIGFuZCBleGFtcGxlcyB0byBoYXZlIGEgc3VjY2Vzc2Z1bCB0cmF2aXMgdGVzdAoKMjAxMy0wNC0xODogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgUGF0Y2ggIzM2IGZyb20gSmVzdXMgTG9wZXogdG8gYWRkIHN1cHBvcnQgZm9yICRkZXNjcmlwdG9yKCkgc3BlY2lhbCB2YXJpYWJsZSBtYWNybyBleHBhbnNpb24gCiAgICAgICAgICAgIGluIGZyYWdtZW50cy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZURlc2NyaXB0b3IiLCAiaGVhZGVyIikKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVEZXNjcmlwdG9yID0gIiRkZXNjcmlwdG9yKE5hbWUpIjsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgd2hpY2ggd2lsbCBnZW5lcmF0ZSBpbnRvIHRoZSB3cmFwcGVyIGlmIHRoZSBmcmFnbWVudCBpcyB1c2VkOgoKICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbmFtZURlc2NyaXB0b3IgPSAiU1dJR1RZUEVfTmFtZSI7CgoyMDEzLTA0LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgQnVnICM0MjggLSBTeW50YXggZXJyb3Igd2hlbiBwcmVwcm9jZXNzb3IgbWFjcm9zIGFyZSBkZWZpbmVkIGluc2lkZSBvZiBlbnVtIGxpc3RzLCBzdWNoIGFzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0gewogICAgICAgICAgICAgICAgZVplcm8gPSAwCiAgICAgICAgICAgICAgI2RlZmluZSBPTkUgMQogICAgICAgICAgICAgIH0gRUZvbzsKCiAgICAgICAgICAgIFRoZSBtYWNyb3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuCgoyMDEzLTA0LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFB1bGwgcGF0Y2ggIzM0IGZyb20gQnJhbnRLeXNlciB0byBmaXggc21hcnQgcG9pbnRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCBkaXJlY3RvcnMuCgoyMDEzLTA0LTE1OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIEZpeCBidWdzIGluIG91dHB1dCBvZiBjbGVhbnVwIGNvZGUuCiAgICAgICAgICAgIC0gQ2xlYW51cCBjb2RlIGlzIG5vdyB3cml0dGVuIGFsc28gYWZ0ZXIgdGhlICJmYWlsOiIgbGFiZWwsIHNvIGl0IHdpbGwgYmUgY2FsbGVkIGlmCiAgICAgICAgICAgICAgYSBTV0lHX2V4Y2VwdGlvbiBpcyByYWlzZWQgYnkgdGhlIHdyYXBwaW5nIGZ1bmN0aW9uLCBjb25zaXN0ZW50IHdpdGggb3RoZXIgbW9kdWxlcy4KICAgICAgICAgICAgLSBPY3RhdmUgbW9kdWxlIG5vdyBhbHNvIHJlY29nbmlzZXMgdGhlICIkY2xlYW51cCIgc3BlY2lhbCB2YXJpYWJsZSwgaWYgbmVlZGVkLgoKMjAxMy0wNC0wODoga3d3ZXR0ZQogICAgICAgICAgICBBZGQgLU1QIG9wdGlvbiB0byBTV0lHIGZvciBnZW5lcmF0aW5nIHBob255IHRhcmdldHMgZm9yIGFsbCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIC0gUHJldmVudHMgbWFrZSBmcm9tIGNvbXBsYWluaW5nIGlmIGhlYWRlciBmaWxlcyBoYXZlIGJlZW4gZGVsZXRlZCBiZWZvcmUKICAgICAgICAgICAgICB0aGUgZGVwZW5kZW5jeSBmaWxlIGhhcyBiZWVuIHVwZGF0ZWQuCiAgICAgICAgICAgIC0gTW9kZWxsZWQgb24gc2ltaWxhciBvcHRpb24gaW4gR0NDLgoKMjAxMy0wNC0wOTogb2xseQoJICAgIFtQSFBdIEFkZCBtaXNzaW5nIGRpcmVjdG9yaW4gdHlwZW1hcCBmb3IgY2hhciogYW5kIGNoYXJbXSB3aGljaAoJICAgIGZpeGVzIGRpcmVjdG9yX3N0cmluZyB0ZXN0Y2FzZSBmYWlsdXJlLgoKMjAxMy0wNC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFNGIEJ1ZyAjMTI5MiAtIFJ1bnRpbWUgZml4ZXMgZm9yIFByb2MgY2hhbmdlcyBpbiBydWJ5LTEuOSB3aGVuIHVzaW5nIFNUTAogICAgICAgICAgICB3cmFwcGVycyB0aGF0IG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByZWRpY2F0ZSwgc3VjaCBhczoKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKE1hcCkgc3RkOjptYXA8c3dpZzo6TEFOR1VBR0VfT0JKLCBzd2lnOjpMQU5HVUFHRV9PQkosIHN3aWc6OkJpbmFyeVByZWRpY2F0ZTw+ID47CgoyMDEzLTA0LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gU0YgQnVnICMxMTU5IC0gQ29ycmVjdGx5IGNoZWNrIHJiX3Jlc3BvbmRfdG8gY2FsbCByZXR1cm4gdmFsdWVzIHRvIGZpeCBzb21lCiAgICAgICAgICAgIGZ1cnRoZXIgMS45IHByb2JsZW1zIHdpdGggZnVuY3RvcnMgYW5kIHVzZSBvZiBDb21wbGV4IHdyYXBwZXJzLgoKMjAxMy0wNC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFJ1bnRpbWUgZml4ZXMgZm9yIHN0ZDo6Y29tcGxleCB3cmFwcGVycyBmb3IgcnVieS0xLjkgLSBuZXcgbmF0aXZlIFJ1YnkgY29tcGxleCBudW1iZXJzIGFyZSB1c2VkLgoKMjAxMy0wMy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBzZWcgZmF1bHQgd2hlbiB1c2luZyBTVEwgY29udGFpbmVycyBvZiBnZW5lcmljIFJ1YnkgdHlwZXMsIEdDX1ZBTFVFIG9yIExBTkdVQUdFX09CSkVDVCwKICAgICAgICAgICAgb24gZXhpdCBvZiB0aGUgUnVieSBpbnRlcnByZXRlci4gTW9yZSBmcmVxdWVudGx5IG9ic2VydmVkIGluIHJ1YnktMS45LgoKMjAxMy0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBkZWxldGVfaWYgKHJlamVjdCEpIGZvciB0aGUgU1RMIGNvbnRhaW5lciB3cmFwcGVycyB3aGljaCBwcmV2aW91c2x5IHdvdWxkCiAgICAgICAgICAgIHNvbWV0aW1lcyBzZWcgZmF1bHQgb3Igbm90IHdvcmsuCgoyMDEzLTAzLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc29tZSB1bmRlZmluZWQgYmVoYXZpb3VyIGRlbGV0aW5nIHNsaWNlcyBpbiB0aGUgU1RMIGNvbnRhaW5lcnMuCgoyMDEzLTAzLTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmEsIERdIEZpeCBzZWcgZmF1bHQgaW4gU1dJRyB1c2luZyBkaXJlY3RvcnMgd2hlbiBjbGFzcyBhbmQgdmlydHVhbCBtZXRob2QgbmFtZXMgYXJlCiAgICAgICAgICAgIHRoZSBzYW1lIGV4Y2VwdCBiZWluZyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcyB3aGVuIHRoZSAlbnNwYWNlIGZlYXR1cmUgaXMgbm90IGJlaW5nIHVzZWQuCgoyMDEzLTAyLTE5OiBrd3dldHRlCiAgICAgICAgICAgIEZpeCBidWcgaW4gU1dJRydzIGhhbmRsaW5nIG9mIHF1YWxpZmllZCAoZS5nLiBjb25zdCkgdmFyaWFibGVzIG9mIGFycmF5IHR5cGUuIEdpdmVuIHRoZSB0eXBlZGVmCiAgICAgICAgICAgICAgYSg3KS5xKHZvbGF0aWxlKS5kb3VibGUgbXlhcnJheSAgICAgLy8gdHlwZWRlZiB2b2xhdGlsZSBkb3VibGVbN10gbXlhcnJheTsKICAgICAgICAgICAgdGhlIHR5cGUKICAgICAgICAgICAgICBxKGNvbnN0KS5teWFycmF5ICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBteWFycmF5CiAgICAgICAgICAgIGJlY29tZXMKICAgICAgICAgICAgICBhKDcpLnEoY29uc3Qgdm9sYXRpbGUpLmRvdWJsZSAgICAgICAvLyBjb25zdCB2b2xhdGlsZSBkb3VibGVbN10KICAgICAgICAgICAgUHJldmlvdXNseSwgU3dpZ1R5cGVfdHlwZWRlZl9yZXNvbHZlKCkgcHJvZHVjZXMgdGhlIHR5cGUKICAgICAgICAgICAgICBxKGNvbnN0KS5hKDcpLnEodm9sYXRpbGUpLmRvdWJsZSAgICAvLyBub24tc2Vuc2ljYWwgdHlwZQogICAgICAgICAgICB3aGljaCB3b3VsZCBuZXZlciBtYXRjaCAldHlwZW1hcCBkZWNsYXJhdGlvbnMsIHdob3NlIHR5cGVzIHdlcmUgcGFyc2VkIGNvcnJlY3RseS4KICAgICAgICAgICAgQWRkIHR5cGVtYXBfYXJyYXlfcXVhbGlmaWVycy5pIHRvIHRoZSB0ZXN0IHN1aXRlIHdoaWNoIGNoZWNrcyBmb3IgdGhlIGNvcnJlY3QgYmVoYXZpb3VyLgoKMjAxMy0wMi0xODogd3NmdWx0b24KICAgICAgICAgICAgRGVwcmVjYXRlIHR5cGVkZWYgbmFtZXMgdXNlZCBhcyBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBuYW1lcyBpbiAlZXh0ZW5kLiBUaGUgcmVhbAogICAgICAgICAgICBjbGFzcy9zdHJ1Y3QgbmFtZSBzaG91bGQgYmUgdXNlZC4KCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgdGFnRVN0cnVjdCB7CiAgICAgICAgICAgICAgICBpbnQgaXZhcjsKICAgICAgICAgICAgICB9IEVTdHJ1Y3Q7CgogICAgICAgICAgICAgICVleHRlbmQgdGFnRVN0cnVjdCB7CiAgICAgICAgICAgICAgICBFU3RydWN0KCkgLy8gaWxsZWdhbCBuYW1lLCBzaG91bGQgYmUgdGFnRVN0cnVjdCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIEVTdHJ1Y3QgKnMgPSBuZXcgRVN0cnVjdCgpOwogICAgICAgICAgICAgICAgICBzLT5pdmFyID0gaXZhcjA7CiAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfkVTdHJ1Y3QoKSAvLyBpbGxlZ2FsIG5hbWUsIHNob3VsZCBiZSB+dGFnRVN0cnVjdCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkc2VsZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGb3Igbm93IHRoZXNlIHRyaWdnZXIgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICBleHRlbmRfY29uc3RydWN0b3JfZGVzdHJ1Y3Rvci5pOjEwNzogV2FybmluZyA1MjI6IFVzZSBvZiBhbiBpbGxlZ2FsIGNvbnN0cnVjdG9yIG5hbWUgJ0VTdHJ1Y3QnIGluCiAgICAgICAgICAgICAgJWV4dGVuZCBpcyBkZXByZWNhdGVkLCB0aGUgY29uc3RydWN0b3IgbmFtZSBzaG91bGQgYmUgJ3RhZ0VTdHJ1Y3QnLgogICAgICAgICAgICAgIGV4dGVuZF9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yLmk6MTExOiBXYXJuaW5nIDUyMzogVXNlIG9mIGFuIGlsbGVnYWwgZGVzdHJ1Y3RvciBuYW1lICdFU3RydWN0JyBpbgogICAgICAgICAgICAgICVleHRlbmQgaXMgZGVwcmVjYXRlZCwgdGhlIGRlc3RydWN0b3IgbmFtZSBzaG91bGQgYmUgJ3RhZ0VTdHJ1Y3QnLgoKICAgICAgICAgICAgVGhlc2UgJWV4dGVuZCBkZXN0cnVjdG9yIGFuZCBjb25zdHJ1Y3RvciBuYW1lcyB3ZXJlIHZhbGlkIHVwIHRvIHN3aWctMi4wLjQsIGhvd2V2ZXIgc3dpZy0yLjAuNSBpZ25vcmVkCiAgICAgICAgICAgIHRoZW0gYWx0b2dldGhlciBmb3IgQyBjb2RlIGFzIHJlcG9ydGVkIGluIFNGIGJ1ZyAjMTMwNi4gVGhlIG9sZCBiZWhhdmlvdXIgb2YgdXNpbmcgdGhlbSBoYXMgYmVlbgogICAgICAgICAgICByZXN0b3JlZCBmb3Igbm93LCBidXQgaXMgb2ZmaWNpYWxseSBkZXByZWNhdGVkLiBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIGFub255bW91c2x5IGRlZmluZWQgdHlwZWRlZgogICAgICAgICAgICBjbGFzc2VzL3N0cnVjdHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3Qgey4uLn0gWDsKCjIwMTMtMDItMTc6IGt3d2V0dGUKICAgICAgICAgICAgV2hlbiBnZW5lcmF0aW5nIGZ1bmN0aW9ucyBwcm92aWRlZCBieSAlZXh0ZW5kLCB1c2UgIih2b2lkKSIgZm9yIG5vLWFyZ3VtZW50IGZ1bmN0aW9ucwogICAgICAgICAgICBpbnN0ZWFkIG9mICIoKSIuIFRoaXMgcHJldmVudHMgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCAiZ2NjIC1Xc3RyaWN0LXByb3RvdHlwZXMiLgoKMjAxMy0wMi0xNzoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBNaW5vciBmaXggdG8gYXV0b2RvYyBnZW5lcmF0aW9uOiBnZXQgdGhlIHJpZ2h0IHR5cGUgZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgc3RydWN0cy4KCjIwMTMtMDItMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSB0eXBlZGVmIG5hbWVzIHVzZWQgaW4gJWV4dGVuZCB0aGF0IGFyZSBub3QgdGhlIHJlYWwgY2xhc3Mvc3RydWN0IG5hbWUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBTdHJ1Y3RCTmFtZSB7CiAgICAgICAgICAgICAgICBpbnQgbXlpbnQ7CiAgICAgICAgICAgICAgfSBTdHJ1Y3RCOwoKICAgICAgICAgICAgICAlZXh0ZW5kIFN0cnVjdEIgewogICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgbm93IHRyaWdnZXIgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICBzd2lnX2V4dGVuZC5pOjE5OiBXYXJuaW5nIDMyNjogRGVwcmVjYXRlZCAlZXh0ZW5kIG5hbWUgdXNlZCAtIHRoZSBzdHJ1Y3QgbmFtZSBTdHJ1Y3RCTmFtZQogICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHR5cGVkZWYgbmFtZSBTdHJ1Y3RCLgoKICAgICAgICAgICAgVGhpcyBpcyBvbmx5IHBhcnRpYWxseSB3b3JraW5nIGFueXdheSAodGhlICVleHRlbmQgb25seSB3b3JrZWQgaWYgcGxhY2VkIGFmdGVyIHRoZSBjbGFzcwogICAgICAgICAgICBkZWZpbml0aW9uKS4gCgoyMDEzLTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gQXBwbHkgcGF0Y2ggIzIyIC0gRml4IG1pc3NpbmcgcGFja2FnZSBiZWZvcmUgJmJvZHkKCjIwMTMtMDEtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBFbnN1cmUgJ2phdmFwYWNrYWdlJyB0eXBlbWFwIGlzIHVzZWQgYXMgaXQgc3RvcHBlZCB3b3JraW5nIGZyb20gdmVyc2lvbiAyLjAuNS4KCjIwMTMtMDEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoIFNGICMzMzQgLSBGaXggZGVmYXVsdCB2YWx1ZSBjb252ZXJzaW9ucyAiVFJVRSItPlRydWUsICJGQUxTRSItPkZhbHNlLgoKMjAxMy0wMS0yODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoIFNGICMzMzUgLSBUcnVseSBpZ25vcmUgY29uc3RydWN0b3JzIGluIGRpcmVjdG9ycyB3aXRoICVpZ25vcmUuCgoyMDEzLTAxLTE4OiBCcmFudCBLeXNlcgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzE1IC0gQWxsb3cgdGhlIHVzZSBvZiB0aGUgbnNwYWNlIGZlYXR1cmUgd2l0aG91dCB0aGUgLXBhY2thZ2UgY29tbWFuZGxpbmUgb3B0aW9uLgogICAgICAgICAgICBUaGlzIHdvcmtzIGFzIGxvbmcgYW5kIHRoZSBuZXcgam5pY2xhc3NwYWNrYWdlIHByYWdtYSBpcyB1c2VkIHRvIHBsYWNlIHRoZSBKTkkgaW50ZXJtZWRpYXRlIGNsYXNzCiAgICAgICAgICAgIGludG8gYSBwYWNrYWdlIGFuZCB0aGUgbnNwYWNlIGZlYXR1cmUgaXMgdXNlZCB0byBwbGFjZSBhbGwgZXhwb3NlZCB0eXBlcyBpbnRvIGEgcGFja2FnZS4KCjIwMTMtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBWaXN1YWwgU3R1ZGlvIGV4YW1wbGVzIHRvIHdvcmsgd2hlbiBTV0lHIGlzIHVuemlwcGVkIGludG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyBzcGFjZXMuCgoyMDEzLTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBjc3R5cGUgdHlwZW1hcCBsb29rdXAgZm9yIG1lbWJlciB2YXJpYWJsZXMgc28gdGhhdCBhIGZ1bGx5IHF1YWxpZmllZCB2YXJpYWJsZSBuYW1lCiAgICAgICAgICAgIG1hdGNoZXMuIEZvciBleGFtcGxlOgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgYm9vbCBNVmFyOjptdmFyICJNeUJvb2wiCiAgICAgICAgICAgICAgc3RydWN0IE1WYXIgewogICAgICAgICAgICAgICAgYm9vbCBtdmFyOwogICAgICAgICAgICAgIH07CgoyMDEzLTAxLTExOiBCcmFudCBLeXNlcgoJICAgIFtKYXZhLCBDIywgRF0gU0YgQnVnICMxMjk5IC0gRml4IGdlbmVyYXRlZCBuYW1lcyBmb3Igd2hlbiAlbnNwYWNlIGlzIHVzZWQgb24KICAgICAgICAgICAgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdHdvIGRpZmZlcmVudCBuYW1lc3BhY2VzLgoKMjAxMy0wMS0xMTogVmxhZGltaXIgS2FsaW5pbgoJICAgIFtDI10gQWRkIHN1cHBvcnQgZm9yIGNzZGlyZWN0b3JpbiAncHJlJywgJ3Bvc3QnIGFuZCAndGVybWluYXRvcicgYXR0cmlidXRlcy4KCjIwMTMtMDEtMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggdG8gd29yayB3aXRoIGEgWlRTIGJ1aWxkIG9mIFBIUCAoYnJva2VuIGluIDIuMC43KS4KCjIwMTMtMDEtMDc6IG9sbHkKCSAgICBGaXggYmFzaGlzbSBpbiBjb25maWd1cmUsIGludHJvZHVjZWQgaW4gMi4wLjkuCgoyMDEzLTAxLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBQdWxsIHBhdGNoICM0IGZyb20gcHRvbXVsaWsgdG8gZml4IFNGIEJ1ZyAjMTI5NiAtIEZpeCBpbmNvcnJlY3Qgd2FybmluZyBmb3IgdmlydHVhbCBkZXN0cnVjdG9ycwogICAgICAgICAgICBpbiB0ZW1wbGF0ZXMsIHN1Y2ggYXM6CiAgICAgICAgICAgICBXYXJuaW5nIDUyMTogSWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUgQjwgQSA+Ojp+QigpLiBJZ25vcmVkLgoKMjAxMy0wMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUHVsbCBwYXRjaCAjMyBmcm9tIHB0b211bGlrIHRvIGZpeCBTRiBCdWcgIzEyOTUgLSBzdGFuZGFyZCBleGNlcHRpb25zIGFzCiAgICAgICAgICAgIGNsYXNzZXMgdXNpbmcgdGhlIFNXSUdfU1REX0VYQ0VQVElPTlNfQVNfQ0xBU1NFUyBtYWNyby4KCjIwMTMtMDEtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQdWxsIHBhdGNoICMyIGZyb20gQnJhbnRLeXNlciB0byBmaXggU0YgQnVnICMxMjgzIC0gZml4IHNtYXJ0IHBvaW50ZXJzIGluIGNvbmp1Y3Rpb24KICAgICAgICAgICAgd2l0aCBkaXJlY3RvcnMuCgoyMDEzLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUHVsbCBwYXRjaCAjMSBmcm9tIEJyYW50S3lzZXIgdG8gZml4IFNGIEJ1ZyAjMTI3OCAtIGZpeCBkaXJlY3RvcnMgYW5kIG5zcGFjZSBmZWF0dXJlIHdoZW4KICAgICAgICAgICAgbXVsdGlsZXZlbCBuYW1lc3BhY2VzIGFyZSB1c2VkLgoKVmVyc2lvbiAyLjAuOSAoMTYgRGVjZW1iZXIgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMTItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnYXJiYWdlIGxpbmUgbnVtYmVyIC8gZW1wdHkgZmlsZSBuYW1lIHJlcG9ydGluZyBmb3Igc29tZSBtaXNzaW5nCiAgICAgICAgICAgICd9JyBvciAnKScgZXJyb3IgbWVzc2FnZXMuCgoyMDEyLTEyLTE1OiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAzNTMwNDQ0LCBDbGFzcyNtZXRob2RzIGFuZCBDbGFzcyNjb25zdGFudHMgcmV0dXJucyBhcnJheSBvZgogICAgICAgICAgICBzeW1ib2xzIGluIFJ1YnkgMS45KwoKMjAxMi0xMi0xNDoga2thZW1wZgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggMzUzMDQzOSBhbmQgZmluYWxseSByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgU1RSMkNTVFIoKSBtYWNybwogICAgICAgICAgICB3aXRoIFN0cmluZ1ZhbHVlUHRyKCkuIFNUUjJDU1RSIHdhcyBkZXByZWNhdGVkIHNpbmNlIHllYXJzIGFuZCBnb3QgcmVtb3ZlZCBpbiBSdWJ5IDEuOQoKMjAxMi0xMi0xNDoga2thZW1wZgogICAgICAgICAgICBbUnVieV0gQXBwbGllZCBwYXRjaGVzICMzNTMwNDQyIGFuZCAzNTMwNDQzIHRvIGFkYXB0IGNvbXBpbGUgYW5kIHJ1bnRpbWUgaW5jbHVkZQogICAgICAgICAgICBwYXRocyB0byBtYXRjaCBSdWJ5IDEuOSsKCjIwMTItMTItMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBGaXggIzMxNjE2MTQgLSBTb21lIHN0cmluZyBjb25zdGFudHMgYXJlIGluY29ycmVjdAoKMjAxMi0xMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIEZpeCAjMzUyOTY5MCAtIEZpeCBpbmNvcnJlY3QgY29uc3RhbnQgbmFtZXMuCgoyMDEyLTEyLTEyOiBkcmpvZQoJICAgIFtSXSBhZGQgZml4IHRvIGZpbmFsaXplciB0aGF0IHdhcyBtaXNzZWQgZWFybGllcgoKMjAxMi0xMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzM1OTA1MjIgLSBmdWxseSBxdWFsaWZpZWQgcGFja2FnZSBwYXRocyBmb3IgUHl0aG9uIDMgZXZlbiBpZiBhIG1vZHVsZSBpcyBpbiB0aGUKICAgICAgICAgICAgc2FtZSBwYWNrYWdlLgoKMjAxMi0xMi0wODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQnVnICMzNTYzNjQ3IC0gUHlJbnRfRnJvbVNpemVfdCB1bmF2YWlsYWJsZSBwcmlvciB0byBQeXRob24gMi41IGZvciB1bnNpZ25lZCBpbnQgdHlwZXMuCgoyMDEyLTEyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGJ1ZyAjMzU3MTM2MSAtIEMrKyBjb21tZW50IGluIEMgd3JhcHBlcnMuCgoyMDEyLTEyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoICMzNTcxMDI5IHdoaWNoIGFkZHMgbWlzc2luZyBkaXJlY3RvciBzdXBwb3J0IGZvciBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgJi4KCjIwMTItMTEtMjg6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gU2ltcGxpZmllZCBtb2R1bGUgbG9hZGluZzogbm93IGp1c3QgdGhlIHN5bnRheAogICAgICAgICAgICAkIGV4YW1wbGU7CiAgICAgICAgICAgIGlzIGFjY2VwdGVkLCB3aGljaCBsb2FkcyBmdW5jdGlvbnMgZ2xvYmFsbHkgYnV0IGNvbnN0YW50cyBhbmQgdmFyaWFibGVzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNjb3BlLgogICAgICAgICAgICBUaGlzIG1ha2UgbW9kdWxlIGxvYWRpbmcgYmVoYXZpb3VyIHJlbGlhYmx5IGNvbnNpc3RlbnQsIGFuZCByZWR1Y2VzIHByb2JsZW1zIHdoZW4gbG9hZGluZyBtb2R1bGVzIHdoaWNoCiAgICAgICAgICAgIGRlcGVuZCBvbiBvdGhlciBtb2R1bGVzIHdoaWNoIG1heSBub3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbG9hZGVkLgoKMjAxMi0xMS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW2NmZmldIEZpeCBqdW5rIG91dHB1dCB3aGVuIHdyYXBwaW5nIHNpbmdsZSBjaGFyYWN0ZXIgbGl0ZXJhbCBjb25zdGFudHMuCgoyMDEyLTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsLCBNb2R1bGEzXSBBZGQgbWlzc2luZyBzdXBwb3J0IGZvciAtb3V0ZGlyLgoKMjAxMi0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZ2ZhdWx0cyB3aGVuIHVzaW5nIGZpbGVuYW1lIHBhdGhzIGdyZWF0ZXIgdGhhbiAxMDI0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLgoKMjAxMi0xMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW2NjYWNoZS1zd2lnXSBBcHBseSBwYXRjaCAjMzU4NjM5MiBmcm9tIEZyZWRlcmlrIERld2VlcmR0IHRvIGZpeCBzb21lIGVycm9yIGNhc2VzIC0gaW5jb3JyZWN0bHkgdXNpbmcKICAgICAgICAgICAgbWVtb3J5IGFmdGVyIGl0IGhhcyBiZWVuIGRlbGV0ZWQuCgoyMDEyLTExLTA5OiB2emVpdGxpbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggb3ZlcmZsb3cgd2hlbiBwYXNzaW5nIHZhbHVlcyBncmVhdGVyIHRoYW4gTE9OR19NQVggZnJvbSBQeXRob24gMyBmb3IgcGFyYW1ldGVycyB3aXRoIHVuc2lnbmVkIGxvbmcgQyB0eXBlLgoKMjAxMi0xMS0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgZmVhdHVyZSBtYXRjaGluZyBpc3N1ZXMgZm9yIGltcGxpY2l0IGRlc3RydWN0b3JzIGFuZCBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgYW5kIGltcGxpY2l0CiAgICAgICAgICAgIGNvcHkgY29uc3RydWN0b3JzIGFkZGVkIHdpdGggJWNvcHljdG9yLiBQcmV2aW91c2x5IGEgZmVhdHVyZSBmb3IgdGhlc2UgaGFkIHRvIGJlIGZ1bGx5IHF1YWxpZmllZAogICAgICAgICAgICBpbiBvcmRlciB0byBtYXRjaC4gTm93IHRoZSBmb2xsb3dpbmcgd2lsbCBhbHNvIG1hdGNoOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgieHl6IikgflhYWCgpOwogICAgICAgICAgICAgIHN0cnVjdCBYWFgge307CgoyMDEyLTExLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGdXJ0aGVyIGNvbnNpc3RlbmN5IGluIG5hbWVkIG91dHB1dCB0eXBlbWFwIGxvb2t1cHMgZm9yIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kCiAgICAgICAgICAgIGltcGxpY2l0IGNvcHkgY29uc3RydWN0b3JzIGFkZGVkIHdpdGggJWNvcHljdG9yLiBQcmV2aW91c2x5IG9ubHkgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIHdhcyBiZWluZwogICAgICAgICAgICB1c2VkLCBub3cgdGhlIHVucXVhbGlmaWVkIG5hbWUgd2lsbCBhbHNvIGJlIHVzZWQuIEZvciBleGFtcGxlLCBwcmV2aW91c2x5OgoKICAgICAgICAgICAgICBleGFtcGxlLmk6Mzg6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogdm9pZCBTcGFjZTo6TW9yZTo6fk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQKCiAgICAgICAgICAgIE5vdyB0aGUgdW5xdWFsaWZpZWQgbmFtZSBpcyBhbHNvIHVzZWQ6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozODogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZCB+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQKCjIwMTItMTEtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIHN1YnRsZSBuYW1lZCBvdXRwdXQgdHlwZW1hcCBsb29rdXAgbWlzc2VzLCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgd2FzIG5vdCBhbHdheXMgYmVpbmcKICAgICAgICAgICAgdXNlZCBmb3IgdmFyaWFibGVzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IEdsb2IgewogICAgICAgICAgICAgICAgaW50IE15VmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSBzZWFyY2ggcnVsZXMgKGFzIHNob3duIGJ5IC1kZWJ1Zy10bXNlYXJjaCkgZm9yIHRoZSBnZXR0ZXIgd3JhcHBlciB3ZXJlOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6NDQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogaW50IE15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50IE15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50CgogICAgICAgICAgICBOb3cgdGhlIHNjb3BlIGlzIG5hbWVkIGNvcnJlY3RseToKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjQ0OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ291dCcgdHlwZW1hcCBmb3I6IGludCBHbG9iOjpNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludCBHbG9iOjpNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludCBNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludAoKMjAxMi0xMC0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRpcmVjdG9yIHR5cGVtYXAgc2VhcmNoaW5nIHNvIHRoYXQgYSB0eXBlbWFwIHNwZWNpZmllZCB3aXRoIGEgbmFtZSB3aWxsIGJlIGNvcnJlY3RseSBtYXRjaGVkLiBQcmV2aW91c2x5CiAgICAgICAgICAgIHRoZSBuYW1lIHdhcyBpZ25vcmVkIGR1cmluZyB0aGUgdHlwZW1hcCBzZWFyY2guIEFwcGxpZXMgdG8gdGhlIGZvbGxvd2luZyBsaXN0IG9mIHR5cGVtYXBzOiAKICAgICAgICAgICAgZGlyZWN0b3JvdXQsIGNzZGlyZWN0b3JvdXQsIGNzdHlwZSwgaW10eXBlLCBjdHlwZSwgZGRpcmVjdG9yb3V0LCBkdHlwZSwgZ290eXBlLCBqdHlwZSwgam5pLCBqYXZhZGlyZWN0b3JvdXQuCgoyMDEyLTEwLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBNb3N0IG9mIHRoZSBzcGVjaWFsIHZhcmlhYmxlcyBhdmFpbGFibGUgZm9yIHVzZSBpbiAlZXhjZXB0aW9uIGFyZSBub3cgYWxzbyBhdmFpbGFibGUgZm9yIGV4cGFuc2lvbiBpbgogICAgICAgICAgICAlZXh0ZW5kIGJsb2Nrcy4gVGhlc2UgYXJlOiAkbmFtZSAkc3ltbmFtZSAkb3Zlcm5hbWUgJGRlY2wgJGZ1bGxkZWNsICRwYXJlbnRjbGFzc25hbWUgJHBhcmVudGNsYXNzc3ltbmFtZSwgc2VlIGRvY3MKICAgICAgICAgICAgb24gIkNsYXNzIGV4dGVuc2lvbiIgaW4gU1dJR1BsdXMuaHRtbC4gUGF0Y2ggYmFzZWQgb24gc3VibWlzc2lvbiBmcm9tIEtyaXMgVGhpZWxlbWFucy4KCjIwMTItMTAtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGl0aW9uYWwgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGluICVleGNlcHRpb24gYXJlIGV4cGFuZGVkIGFzIGZvbGxvd3M6CiAgICAgICAgICAgICAgJHBhcmVudGNsYXNzbmFtZSAtIFRoZSBwYXJlbnQgY2xhc3MgbmFtZSAoaWYgYW55KSBmb3IgYSBtZXRob2QuCiAgICAgICAgICAgICAgJHBhcmVudGNsYXNzc3ltbmFtZSAtIFRoZSB0YXJnZXQgbGFuZ3VhZ2UgcGFyZW50IGNsYXNzIG5hbWUgKGlmIGFueSkgZm9yIGEgbWV0aG9kLgoKMjAxMi0xMC0wODogaWFudAoJICAgIFtHb10gR2VuZXJhdGluZyBHbyBjb2RlIG5vdyByZXF1aXJlcyB1c2luZyB0aGUgLWludGdvc2l6ZSBvcHRpb24gdG8KCSAgICBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgJ2ludCcgdHlwZSBpbiBHby4gIFRoaXMgaXMgYmVjYXVzZSB0aGUKCSAgICBzaXplIG9mIHRoZSB0eXBlIGlzIGNoYW5naW5nIGZyb20gR28gMS4wIHRvIEdvIDEuMSBmb3IgeDg2XzY0LiAKCjIwMTItMDktMTQ6IHdzZnVsdG9uCgkgICAgQWRkIG5ldyB3YXJuaW5nIGlmIHRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGlzIHVzZWQgYXMgYSBiYXNlIGNsYXNzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEJhc2Uge307CiAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgQmFzZTxpbnQ+OwogICAgICAgICAgICAgIGNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZTxpbnQ+IHt9OwoKICAgICAgICAgICAgZ2l2ZXMgdGhlIGZvbGxvd2luZyB3YXJuaW5nIGluc3RlYWQgb2Ygc2lsZW50bHkgaWdub3JpbmcgdGhlIGJhc2U6CgogICAgICAgICAgICBjcHBfaW5oZXJpdC5pOjUyOiBXYXJuaW5nIDQwMTogQmFzZSBjbGFzcyAnQmFzZTwgaW50ID4nIGhhcyBubyBuYW1lIGFzIGl0IGlzIGFuIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRlZCB3aXRoICcldGVtcGxhdGUoKScuIElnbm9yZWQuCiAgICAgICAgICAgIGNwcF9pbmhlcml0Lmk6NTE6IFdhcm5pbmcgNDAxOiBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBtdXN0IGJlIHdyaXR0ZW4gYmVmb3JlICdCYXNlPCBpbnQgPicgaXMgdXNlZCBhcyBhIGJhc2UgY2xhc3MgYW5kIGJlIGRlY2xhcmVkIHdpdGggYSBuYW1lLgoKCjIwMTItMDktMTE6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAjMzUzNTMwNCAtIERpcmVjdCB1c2Ugb2YgYSB3ZWFrIGdsb2JhbCByZWZlcmVuY2UgaW4gZGlyZWN0b3JzCiAgICAgICAgICAgIHNvbWV0aW1lcyBjYXVzaW5nIHNlZyBmYXVsdHMgZXNwZWNpYWxseSBvbiBBbmRyb2lkLgoKMjAxMi0wOS0wNjogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4IChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHR5cGVtYXBzIHRvIGFjY2VwdCBOVUxMIHN0cmluZy4KCjIwMTItMDgtMjY6IGRyam9lCgkgICAgW1JdIG1ha2UgRXh0ZXJuYWxSZWZlcmVuY2Ugc2xvdCByZWYgdG8gY29udGFpbiByZWZlcmVuY2UKCjIwMTItMDgtMjY6IGRyam9lCgkgICAgW1JdIGZpeCBFeGFtcGxlcy9NYWtlZmlsZSB0byB1c2UgQyBpbiAkKENDKSByYXRoZXIgdGhhbiAkKENYWCkKClZlcnNpb24gMi4wLjggKDIwIEF1Z3VzdCAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBZGQgc2l6ZV90eXBlLCB2YWx1ZV90eXBlLCBjb25zdF9yZWZlcmVuY2UgdG8gdGhlIFNUTCBjb250YWluZXJzLgoKMjAxMi0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIGRpc2NhcmQgYW5kIGFkZCBtZXRob2RzIHRvIHN0ZDo6c2V0IHdyYXBwZXJzIHNvIHRoYXQgcHlhYmMuaSBjYW4gYmUgdXNlZCBlbnN1cmluZwogICAgICAgICAgICBNdXRhYmxlU2V0IGlzIGEgdmFsaWQgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc3RkOjpzZXQuIEFzIHJlcG9ydGVkIGJ5IEFsZXhleSBTb2tvbG92LgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIHN0ZDo6bXVsdGlzZXQuCgoyMDEyLTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzM1NDE3NDQgLSBNaXNzaW5nIFB5SW50X0Zyb21TaXplX3QgY2FsbHMgZm9yIFB5dGhvbiAzLgoKMjAxMi0wOC0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gRGF2aWQgQmF1bSB0byBhZGQgdGhlIGFzc3VtZW92ZXJyaWRlIGZlYXR1cmUgZm9yIEphdmEgZGlyZWN0b3JzIHRvCiAgICAgICAgICAgIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiBhbGwgb3ZlcnJpZGRlbiBtZXRob2RzIGNhbiBiZSBhc3N1bWVkIHRvIGJlIG92ZXJyaWRkZW4uCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMzUzMDAyMSBGaXggdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcuCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCAjMzUzNjM2MCAtIEludmFsaWQgY29kZSBzb21ldGltZXMgYmVpbmcgZ2VuZXJhdGVkIGZvciBkaXJlY3RvciBtZXRob2RzCiAgICAgICAgICAgIHdpdGggbWFueSBhcmd1bWVudHMuCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gIzM1NDU4NzcgLSBEb24ndCB1bmRlZmluZSBib29sIGlmIGRlZmluZWQgYnkgQzk5IHN0ZGJvb2wuaCAtIHByb2JsZW0gdXNpbmcgCiAgICAgICAgICAgIFBlcmwgNS4xNiBhbmQgbGF0ZXIuCgoyMDEyLTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgaW5jb3JyZWN0IHdhcm5pbmcgKDMxNCkgYWJvdXQgdGFyZ2V0IGxhbmd1YWdlIGtleXdvcmRzIHdoaWNoIHdlcmUgdHJpZ2dlcmVkCiAgICAgICAgICAgIGJ5IHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQgdXNpbmcgZGlyZWN0aXZlcy4gRm9yIGV4YW1wbGUgJ3N0cmluZycgaXMgYSBrZXl3b3JkIGluIEMjOgogICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgeyBjbGFzcyBzdHJpbmc7IH0KICAgICAgICAgICAgICB1c2luZyBzdGQ6OnN0cmluZzsKCjIwMTItMDctMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkaXNwbGF5IG9mIHBvaW50ZXJzIGluIHZhcmlvdXMgcGxhY2VzIG9uIDY0IGJpdCBzeXN0ZW1zIC0gb25seSAzMiBiaXRzIHdlcmUgYmVpbmcgc2hvd24uCgoyMDEyLTA3LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2RiIGRlYnVnZ2VyIGZ1bmN0aW9ucyAnc3dpZ3ByaW50JyBhbmQgJ2xvY3N3aWdwcmludCcgdG8gZGlzcGxheSB0byB0aGUgZ2RiIG91dHB1dCB3aW5kb3cKICAgICAgICAgICAgcmF0aGVyIHRoYW4gc3Rkb3V0LiBUaGlzIGZpeGVzIGRpc3BsYXkgcHJvYmxlbXMgaW4gZ2RidHVpIGFuZCB0aGUgZW5zdXJlcyB0aGUgb3V0cHV0CiAgICAgICAgICAgIGFwcGVhcnMgd2hlcmUgZXhwZWN0ZWQgaW4gb3RoZXIgZ2RiIGJhc2VkIGRlYnVnZ2VycyBzdWNoIGFzIEVjbGlwc2UgQ0RULgoKMjAxMi0wNy0yMDoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBzZWdmYXVsdC1vbi1leGl0IHByZXZlbnRpb24gaGFjayBub3cgcHJlc2VydmVzIGV4aXQgc3RhdHVzLCBhbmQgdXNlcyBDOTkgX0V4aXQoKS4KCjIwMTItMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBEZWJpYW4gYnVnIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvNjcyMDM1LCB0eXBlbWFwIGNvcHkgZmFpbHVyZSAtIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCAKICAgICAgICAgICAgaW4gc3dpZy0yLjAuNToKICAgICAgICAgICAgICAlaW5jbHVkZTxzdGwuaT4KICAgICAgICAgICAgICB1c2luZyBzdGQ6OnBhaXI7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFN0clBhaXIpIHBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjsKCjIwMTItMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgc28gdGhhdAogICAgICAgICAgICB0eXBlcyBhcmUgY29ycmVjdGx5IGZvdW5kIGluIHNjb3BlIGZvciB0ZW1wbGF0ZXMuIEV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFRoaW5nMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIE91dGVyMjsKICAgICAgICAgICAgICB1c2luZyBTcGFjZTI6OlRoaW5nMjsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUaGluZzIge307CiAgICAgICAgICAgICAgLy8gU1RJTEwgQlJPS0VOIHZvaWQgdXNlaXQyKFRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJhKE91dGVyMjo6U3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYig6Ok91dGVyMjo6U3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYyhTcGFjZTI6OlRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICB2b2lkIHVzZWl0MmQoU3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFRoaW5nMkludCkgVGhpbmcyPGludD47CgoKMjAxMi0wNi0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHRlbXBsYXRlIG5hbWVzcGFjZSBwcm9ibGVtcyBmb3Igc3ltYm9scyBkZWNsYXJlZCB3aXRoIGEgZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTEgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBZWVk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgU3BhY2UyOjpZWVkgewogICAgICAgICAgICAgICAgICBUIHl5eShUIGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgfSAgICAKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkxKFNwYWNlMTo6U3BhY2UyOjpZWVk8aW50PiB5eSkge30KICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTIoU3BhY2UyOjpZWVk8aW50PiB5eSkge30KICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTMoOjpTcGFjZTE6OlNwYWNlMjo6WVlZPGludD4geXkpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAldGVtcGxhdGUoWVlZSW50KSBTcGFjZTE6OlNwYWNlMjo6WVlZPGludD47CgoyMDEyLTA2LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbmFtZXNwYWNlIHByb2JsZW1zIGZvciBzeW1ib2xzIGRlY2xhcmVkIHdpdGggYSBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucywgc3VjaCBhczoKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMSB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgc3RydWN0IFhYWDsKICAgICAgICAgICAgICAgICAgc3RydWN0IFlZWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzdHJ1Y3QgU3BhY2UyOjpZWVkge307CiAgICAgICAgICAgICAgICBzdHJ1Y3QgU3BhY2UxOjpTcGFjZTI6OlhYWCB7fTsKCiAgICAgICAgICAgICAgICB2b2lkIHRlc3RYWFgyKFNwYWNlMjo6WFhYIHh4KSB7fQogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WVlZMihTcGFjZTI6OllZWSB5eSkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICB3aGVyZSB4eCBhbmQgeXkgd2VyZSBub3QgcmVjb2duaXNlZCBhcyB0aGUgcHJveHkgY2xhc3NlcyBYWFggYW5kIFlZWS4KCjIwMTItMDYtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgc28gdGhhdAogICAgICAgICAgICB0eXBlcyBhcmUgY29ycmVjdGx5IGZvdW5kIGluIHNjb3BlLiAKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgY2xhc3MgVGhpbmcyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgT3V0ZXIyOwogICAgICAgICAgICAgIHVzaW5nIFNwYWNlMjo6VGhpbmcyOwogICAgICAgICAgICAgIGNsYXNzIFRoaW5nMiB7fTsKICAgICAgICAgICAgICAvLyBOb25lIG9mIHRoZSBtZXRob2RzIGJlbG93IGNvcnJlY3RseSB1c2VkIHRoZSBUaGluZzIgcHJveHkgY2xhc3MKICAgICAgICAgICAgICB2b2lkIHVzZWl0MihUaGluZzIgdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmEoT3V0ZXIyOjpTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYig6Ok91dGVyMjo6U3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmMoU3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIHZvaWQgdXNlaXQyZChTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIH0KCjIwMTItMDYtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHNvIHRoYXQgdHlwZXMgYXJlIGNvcnJlY3RseSBmb3VuZCBpbiBzY29wZS4KICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgY2xhc3MgVGhpbmcyIHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgT3V0ZXIyOyAvLyB1c2luZyBkaXJlY3RpdmUKICAgICAgICAgICAgICB1c2luZyBTcGFjZTI6OlRoaW5nMjsgLy8gdXNpbmcgZGVjbGFyYXRpb24KICAgICAgICAgICAgICB2b2lkIHVzZWl0MihUaGluZzIgdCkge30KCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgdGVtcGxhdGVkIGNsYXNzZXMuCgoyMDEyLTA1LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM1Mjk2MDEgLSBzZWcgZmF1bHQgd2hlbiBhIHByb3RlY3RlZCBtZXRob2QgaGFzIHRoZSAiZGlyZWN0b3IiCiAgICAgICAgICAgIGZlYXR1cmUgYnV0IHRoZSBwYXJlbnQgY2xhc3MgZG9lcyBub3QuIEFsc28gZml4IHNpbWlsYXIgcHJvYmxlbXMgd2l0aAogICAgICAgICAgICB0aGUgYWxscHJvdGVjdGVkIGZlYXR1cmUuCgoyMDEyLTA1LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0IHdoZW4gYXR0ZW1wdGluZyB0byB3YXJuIGFib3V0IGFuIGlsbGVnYWwgZGVzdHJ1Y3RvciAtICMzNTMwMDU1LCAzNTMwMDc4IGFuZCAjMzUzMDExOC4KClZlcnNpb24gMi4wLjcgKDI2IE1heSAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KMjAxMi0wNS0yNjogd3NmdWx0b24KICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHlwZW1hcCBtb2RpZmljYXRpb25zIHNvIHRoZXkgY2FuIGJlIHVzZWQgd2l0aCAlYXBwbHkgZm9yIG90aGVyIHN0cmluZwogICAgICAgICAgICBjbGFzc2VzLgoKMjAxMi0wNS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4ZXMgZm9yIC1leHRlcm5hbC1ydW50aW1lIHRvIHdvcmsgYWdhaW4uCgoyMDEyLTA1LTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBEaXNhbWJpZ3VhdGUgU1dJR19Gcm9tX3Vuc2lnbmVkX1NTX2ludCBhbmQgU1dJR19Gcm9tX3Vuc2lnbmVkX1NTX2xvbmcuCgoyMDEyLTA1LTE4OiBvbGx5CgkgICAgW1BIUF0gRml4IGdldHRlcnMgZm9yIHRlbXBsYXRlIG1lbWJlcnMuIChTRiMzNDI4ODMzLCBTRiMzNTI4MDM1KQoKMjAxMi0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgbGFuZ3VhZ2UncyBzdGQ6Om1hcCB3cmFwcGVycyB0byByZWNvZ25pc2UgZGlmZmVyZW5jZV90eXBlLCBzaXplX3R5cGUsIGtleV90eXBlCiAgICAgICAgICAgIGFuZCBtYXBwZWRfdHlwZS4KCjIwMTItMDUtMTQ6IGt3d2V0dGUgKHNpZ25lZCBvZmYgYnkgeGF2aWVyOTgpCiAgICAgICAgICAgIFtPY3RhdmVdIFByZXZlbnQgT2N0YXZlIGZyb20gc2VnLWZhdWx0aW5nIGF0IGV4aXQgd2hlbiBTV0lHCiAgICAgICAgICAgIG1vZHVsZXMgYXJlIGxvYWRlZCwgZHVlIHRvIGJ1Z3MgaW4gT2N0YXZlJ3MgY2xlYW51cCBjb2RlOgogICAgICAgICAgICAqIFdyYXBwaW5nIGZ1bmN0aW9ucyBub3cgZGVjbGFyZWQgd2l0aCBPY3RhdmUgREVGVU5fRExEIG1hY3JvLAogICAgICAgICAgICAgIGFuZCBsb2FkZWQgdGhyb3VnaCBPY3RhdmUncyBkeW5hbWljIG1vZHVsZSBsb2FkZXIKICAgICAgICAgICAgKiBHbG9iYWwgdmFyaWFibGVzIG9mIHN3aWdyZWYgdHlwZSBhcmUgbm93IGFzc2lnbmVkIGEgbmV3KCkKICAgICAgICAgICAgICBjb3B5IG9mIHRoZSBzd2lncmVmIGNsYXNzLCB0byBwcmV2ZW50IGRvdWJsZS1mcmVlIGVycm9ycwogICAgICAgICAgICAqIFNXSUcgbW9kdWxlIGF0LWV4aXQgY2xlYW51cCBmdW5jdGlvbiBub3cgY3JlYXRlZCBpbiBPY3RhdmUKICAgICAgICAgICAgICB0aHJvdWdoIGV2YWwoKSwgc28gbm90IGRlcGVuZGVudCBvbiBsb2FkZWQgLm9jdCBsaWJyYXJ5CiAgICAgICAgICAgICogRm9yIE9jdGF2ZSB2ZXJzaW9ucyAzLjEuKiB0byAzLjMuKiwgcmVnaXN0ZXIgQy1sZXZlbCBhdC1leGl0CiAgICAgICAgICAgICAgZnVuY3Rpb24gd2hpY2ggdGVybWluYXRlcyBPY3RhdmUgaW1tZWRpYXRlbHkgKHdpdGggY29ycmVjdAogICAgICAgICAgICAgIHN0YXR1cyBjb2RlKSB3aXRob3V0IHBlcmZvcm1pbmcgbWVtb3J5IGNsZWFudXAuIFRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICBjYW4gYmUgY29udHJvbGxlZCB3aXRoIG1hY3JvcyBpbiBMaWIvb2N0YXZlL29jdHJ1bnRpbWUuc3dnCgogICAgICAgICAgICBbT2N0YXZlXSBOZXcgc3ludGF4IGZvciBkZXRlcm1pbmcgd2hldGhlciBTV0lHIG1vZHVsZSBzaG91bGQgYmUKICAgICAgICAgICAgbG9hZGVkIGdsb2JhbGx5IG9yIG5vbi1nbG9iYWxseS4gVG8gbG9hZCBtb2R1bGUgImV4YW1wbGUiIGdsb2JhbGx5LAogICAgICAgICAgICB0eXBlIHRoZSBtb2R1bGUgbmFtZQogICAgICAgICAgICAkIGV4YW1wbGU7CiAgICAgICAgICAgIGFzIGJlZm9yZTsgdG8gbG9hZCBtb2R1bGUgbm9uLWdsb2JhbGx5LCBhc3NpZ24gaXQgdG8gYSB2YXJpYWJsZToKICAgICAgICAgICAgJCBleGFtcGxlID0gZXhhbXBsZTsKICAgICAgICAgICAgb3IKICAgICAgICAgICAgJCBleCA9IGV4YW1wbGU7CiAgICAgICAgICAgIGZvciBhIHNob3J0ZXIgKGxvY2FsKSBtb2R1bGUgbmFtZS4gLWdsb2JhbC8tbm9nbG9iYWwgY29tbWFuZC1saW5lCiAgICAgICAgICAgIG9wdGlvbnMgYW5kIG1vZHVsZSBjb21tYW5kIGxpbmUgYXJlIGRlcHJlY2F0ZWQuIEFkZGVkIHVzYWdlIGluZm8KICAgICAgICAgICAgdG8gbW9kdWxlLCBzbyB0eXBpbmcKICAgICAgICAgICAgJCBoZWxwIGV4YW1wbGUKICAgICAgICAgICAgb3IgaW5jb3JyZWN0IHVzYWdlIHNob3VsZCBkaXNwbGF5IHByb3BlciB1c2FnZSwgd2l0aCBleGFtcGxlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTItMDUtMTI6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gY29kZSBnZW5lcmF0ZWQgZm9yIGEgY2FsbGJhY2suICBQYXRjaCBmcm9tCgkgICAgU0YgYnVnICMzNTEwODA2LgoKMjAxMi0wNS0xMjogb2xseQoJICAgIFtQSFBdIEF2b2lkIHVzaW5nIHplbmRfZXJyb3Jfbm9yZXR1cm4oKSBhcyBpdCBkb2Vzbid0IHdvcmsgd2l0aCBhbGwKCSAgICBidWlsZHMgb2YgUEhQIChTRiBidWcgIzMxNjY0MjMpLiAgSW5zdGVhZCB3ZSBub3cgd3JhcCBpdCBpbiBhCgkgICAgU1dJR19GQUlMKCkgZnVuY3Rpb24gd2hpY2ggd2UgYW5ub3RhdGUgYXMgIm5vcmV0dXJuIiBmb3IgR0NDIHRvCgkgICAgYXZvaWRzIHdhcm5pbmdzLiAgVGhpcyBhbHNvIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvbXBpbGVkCgkgICAgd3JhcHBlciAoZS5nLiB0aGUgc3RyaXBwZWQgc2l6ZSBpcyByZWR1Y2VkIGJ5IDYlIGZvciBYYXBpYW4ncyBQSFAKCSAgICBiaW5kaW5ncykuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgcGF0Y2ggIzM1MjI4NTUgRml4IHVuaW50ZW5kZWQgdW5pbml0aWFsaXNlZCBtZW1vcnkgYWNjZXNzIGluIE9VVFBVVCB0eXBlbWFwcy4KCjIwMTItMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiBwYXRjaCAjMzUyMjY3NCBGaXggcG9zc2libGUgdW5pbml0aWFsaXNlZCBtZW1vcnkgYWNjZXNzIGluIGNoYXIgKipTVFJJTkdfT1VUCiAgICAgICAgICAgIHR5cGVtYXAuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgcGF0Y2ggIzM1MjI2MTEgRml4IHVuaW5pdGlhbGlzZWQgc2l6ZSByZWdyZXNzaW9uIGluIGNoYXIgKipTVFJJTkdfQVJSQVkKICAgICAgICAgICAgaW50cm9kdWNlZCBpbiBzd2lnLTIuMC42LgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgU0YgYnVnICMzNTI1MDUwIC0gRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTIuMC41IHdoZXJlYnkgZGVmaW5pbmcgb25lIHR5cGVtYXAKICAgICAgICAgICAgbWV0aG9kIHN1Y2ggYXMgYW4gJ291dCcgdHlwZW1hcCBtYXkgaGlkZSBhbm90aGVyIHR5cGVtYXAgbWV0aG9kIHN1Y2ggYXMgYW4gJ2luJyB0eXBlbWFwIC0KICAgICAgICAgICAgb25seSBvY2N1cnMgd2hlbiB0aGUgdHlwZSBpcyBhIHRlbXBsYXRlIHR5cGUgd2hlcmUgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lCiAgICAgICAgICAgIHZpYSBhIHR5cGVkZWYuCgoyMDEyLTA1LTEwOiBvbGx5CgkgICAgW1BIUF0gRml4IHRoZSBjb25zdGFudCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUsIGV0YyAtIHByZXZpb3VzbHkKCSAgICB0aGVzZSB1c2VkIHRoZSB3cm9uZyBuYW1lIGZvciByZW5hbWVkIGNvbnN0YW50cy4gIEFkZAoJICAgIGF1dG9kb2NfcnVubWUucGhwIHRvIHRoZSB0ZXN0c3VpdGUgYXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIHRoaXMuCgoyMDEyLTA1LTAyOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gUmVtb3ZlIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBmb3IgZ2NjZ28gNC42LiAgVXNpbmcKCSAgICBTV0lHIHdpdGggZ2NjZ28gd2lsbCBub3cgcmVxdWlyZSBnY2NnbyA0LjcuICBVc2luZyBTV0lHCgkgICAgd2l0aCB0aGUgbW9yZSBjb21tb25seSB1c2VkIGdjIGNvbXBpbGVyIGlzIHVuYWZmZWN0ZWQuCgoyMDEyLTA1LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2VuZXJhdGVkIGNvZGUgZm9yIEMgZm9yd2FyZCBlbnVtIGRlY2xhcmF0aW9ucyBpbiBzb21lIGxhbmd1YWdlcy4KClZlcnNpb24gMi4wLjYgKDMwIEFwcmlsIDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTA0LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggdW5pbml0aWFsaXNlZCB2YXJpYWJsZSBpbiBTV0lHVFlQRSAqKk9VVFBVVCB0eXBlbWFwcyBhcyByZXBvcnRlZCBieSBKaW0gQW5kZXJzb24uCgoyMDEyLTA0LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggY29tcGlsYXRpb24gZXJyb3JzIHdoZW4gd3JhcHBpbmcgU1RMIGNvbnRhaW5lcnMgb24gTWFjIE9TWCBhbmQgcG9zc2libHkgb3RoZXIgc3lzdGVtcy4KCjIwMTItMDQtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAzNTIxODExIGZyb20gTGVvIERhdmlzIC0gY2hhciAqKlNUUklOR19BUlJBWSB0eXBlbWFwcyBmaXhlZCB0byBoYW5kbGUKICAgICAgICAgICAgbnVsbCBwb2ludGVycy4KClZlcnNpb24gMi4wLjUgKDE5IEFwcmlsIDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSBwYXRjaCAjMzUxNzQzNSBmcm9tIE1pbGVzIEJhZGVyIC0gcHJlZmVyIHRvIHVzZSBMdWFfcHVzaGdsb2JhbHRhYmxlCgoyMDEyLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggIzM1MTc3NjkgZnJvbSBSb2JpbiBTdG9ja2VyIHRvIGZpeCBjb21waWxlIGVycm9yIG9uIE1hY1J1YnkgdXNpbmcgUlNUUklOR19QVFIuCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzUxMTAwOSBmcm9tIExlaWYgTWlkZGVsc2NodWx0ZSBmb3Igc2xpZ2h0bHkgb3B0aW1pc2VkIGNoYXIgKiB2YXJpYWJsZSB3cmFwcGVycy4KCjIwMTItMDQtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFwcGx5ICMzMjE5Njc2IGZyb20gU2hhbmUgTGllc2VnYW5nIHdoaWNoIGFkZHM6CiAgICAgICAgICAgIC0gc3VwcG9ydCBmb3IgJWZhY3RvcnkKICAgICAgICAgICAgLSBhIF9fdG9zdHJpbmcgbWV0aG9kCiAgICAgICAgICAgIC0gYSBfX2Rpc293biBtZXRob2QKCjIwMTItMDQtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEFwcGx5ICMzNTEzNTY5IHdoaWNoIGFkZHMgYSBjYXRjaGxpc3QgdG8gdGhlIHhtbCBvdXRwdXQuCgoyMDEyLTA0LTA1OiBvbGx5CgkgICAgW0x1YV0gQWRkIHN1cHBvcnQgZm9yIEx1YSA1LjIgKHBhdGNoIFNGIzM1MTQ1OTMgZnJvbSBNaWxlcyBCYWRlcikKCjIwMTItMDMtMjY6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gQXBwbHkgcGF0Y2ggIzM0MjU5OTMgZnJvbSBqZ2lsbGlzOiBhZGQgZXh0cmEgbG9naWMgdG8gdGhlIG9jdGF2ZV9zd2lnX3R5cGU6OmRpbXModm9pZCkgbWV0aG9kOiBpdCBjaGVja3MgaWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBfX2RpbXNfXyBtZXRob2QgYW5kIHVzZXMgdGhpcyBpbiBzdGVhZCBvZiByZXR1cm5pbmcgKDEsMSkKCSAgICBbb2N0YXZlXSBBcHBseSBwYXRjaCAjMzQyNDgzMyBmcm9tIGpnaWxsaXM6IG1ha2UgaXNfb2JqZWN0IHJldHVybiB0cnVlIGZvciBzd2lnIHR5cGVzCgoyMDEyLTAzLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbRF0gQXBwbHkgIzM1MDI0MzEgdG8gZml4IGR1cGxpY2F0ZSBzeW1ib2xzIGluIG11bHRpcGxlIG1vZHVsZXMuCgoyMDEyLTAzLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM0OTQ3OTEgLSAlJGlzZ2xvYmFsIGZvciAlcmVuYW1lIG1hdGNoaW5nLgoKMjAxMi0wMy0yMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDg3NzA2IGFuZCAjMzM5MTkwNiAtIG1pc3Npbmcgc3RkZGVmLmggaW5jbHVkZSBmb3IgcHRyZGlmZl90IHdoZW4gdXNpbmcgJWltcG9ydAogICAgICAgICAgICBmb3IgU1RMIGNvbnRhaW5lcnMgYW5kIGNvbXBpbGluZyB3aXRoIGcrKy00LjYuIEFuIGluY2x1ZGUgb2Ygc3RkZGVmLmggaXMgbm93IG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gU1dJRyBnZW5lcmF0ZXMgU1RMIGhlbHBlciB0ZW1wbGF0ZXMgd2hpY2ggcmVxdWlyZSBwdHJkaWZmX3QuIElmIHlvdSAKICAgICAgICAgICAgd2VyZSBwcmV2aW91c2x5IHJlbHlpbmcgb24gIiNpbmNsdWRlIDxzdGRkZWYuaD4iIGFsd2F5cyBiZWluZyBnZW5lcmF0ZWQgd2hlbiB1c2luZyBhCiAgICAgICAgICAgICVpbmNsdWRlIG9mIGFuIFNUTCBoZWFkZXIsIHlvdSBtYXkgbm93IG5lZWQgdG8gYWRkIHRoaXMgaW4gbWFudWFsbHkuCgoyMDEyLTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzM5MjI2NCBmcm9tIFNlYmFzdGllbiBCaW5lIHRvIHBhcnNlICh1bnNpZ25lZCkgbG9uZyBsb25nIHR5cGVzIGluIGVudW0gdmFsdWUgYXNzaWdubWVudC4KCjIwMTItMDMtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzNTA1NTMwIGZyb20gS2FybCBXZXR0ZSB0byBhbGxvdyBjdXN0b20gYWxsb2NhdG9ycyBpbiBTVEwgc3RyaW5nIGNsYXNzZXMgZm9yIHRoZSBVVEwgbGFuZ3VhZ2VzLgoKMjAxMi0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzM0NjgzNjIgZnJvbSBLYXJsIFdldHRlIHRvIGZpeCAlaW5jbHVkZSBpbnNpZGUgJWRlZmluZS4KCjIwMTItMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jdGF2ZSwgUl0gRml4ICMzNDc1NDkyIC0gaXRlcmF0aW5nIHRocm91Z2ggc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb2YgZW51bWVyYXRpb25zLgoKMjAxMi0wMi0yNzogeGF2aWVyOTggKHBhdGNoZXMgZnJvbSBLYXJsIFdldHRlKQoJICAgIFtPY3RhdmVdIFVzZSAtZ2xvYmFscyAuIHRvIGxvYWQgZ2xvYmFsIHZhcmlhYmxlcyBpbiBtb2R1bGUgbmFtZXNwYWNlCgkgICAgW09jdGF2ZV0gQ29tbWVudCBkZWNsYXJhdGlvbiBvZiB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIHN3aWdfcmVnaXN0ZXJfZGlyZWN0b3IKCSAgICBbT2N0YXZlXSBGaXggT0NUQVZFX1BBVEggaW4gb2N0YXZlIE1ha2VmaWxlcwoJICAgIFtPY3RhdmVdIEFkZCBzdXBwb3J0IGZvciBzdGQ6Omxpc3QgLSBmaXggbGlfc3RkX2NvbnRhaW5lcnNfaW50IHRlc3QKCSAgICBbT2N0YXZlXSBGaXggaW1wb3J0cyB0ZXN0CgoyMDEyLTAyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTWFrZSBnZW5lcmF0ZWQgc3VwcG9ydCBmdW5jdGlvbnMgaW4gYXJyYXlzX2phdmEuaSBzdGF0aWMgc28gdGhhdCBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICBmcm9tIG11bHRpcGxlIGluc3RhbmNlcyBvZiBTV0lHIGNhbiBiZSBjb21waWxlZCBhbmQgbGlua2VkIHRvZ2V0aGVyIC0gcHJvYmxlbSByZXBvcnRlZCBieQogICAgICAgICAgICBFdmFuIEtyYXVzZS4KCjIwMTItMDEtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBjcmFzaCB3aXRoIGJhZCByZWdleCAtIGJ1ZyAjMzQ3NDI1MC4KCjIwMTItMDEtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBQeXRob24gc3RlcHBlZCBzbGljaW5nIHN1cHBvcnQgdG8gdGhlIFNUTCB3cmFwcGVycyAoc3RkOjp2ZWN0b3IsIHN0ZDo6bGlzdCkuCiAgICAgICAgICAgIEFzc2lnbmluZyB0byBhIHNsaWNlLCByZWFkaW5nIGEgc2xpY2UgYW5kIGRlbGV0aW5nIGEgc2xpY2Ugd2l0aCBzdGVwcyBub3cgd29yay4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD4KCiAgICAgICAgICAgICAgdmkgPSB2ZWN0b3JfaShyYW5nZSgxMCkpCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aSkKICAgICAgICAgICAgICB2aVsxOjQ6Ml0gPSBbMTExLCAzMzNdCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aSkKICAgICAgICAgICAgICBkZWwgdmlbMzoxMDozXQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aVs6Oi0xXSkKCiAgICAgICAgICAgIGdpdmVzIChzYW1lIGJlaGF2aW91ciBhcyBuYXRpdmUgUHl0aG9uIHNlcXVlbmNlcyBzdWNoIGFzIGxpc3QpOgoKICAgICAgICAgICAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KICAgICAgICAgICAgICBbMCwgMTExLCAyLCAzMzMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICAgICAgICAgICAgWzAsIDExMSwgMiwgNCwgNSwgNywgOF0KICAgICAgICAgICAgICBbOCwgNywgNSwgNCwgMiwgMTExLCAwXQoKMjAxMi0wMS0yMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIENvcnJlY3RseSBhbm5vdGF0ZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIEMgbGlua2FnZS4KICAgICAgICAgICAgW0RdIEV4Y2VwdGlvbiBhbmQgRXJyb3IgaGF2ZSBiZWNvbWUgYmxlc3NlZCBuYW1lczsgcmVtb3ZlZCBkX2V4Y2VwdGlvbl9uYW1lIHRlc3QgY2FzZS4KCjIwMTItMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzb21lIGluZGV4aW5nIGJ1Z3MgaW4gUHl0aG9uIFNUTCB3cmFwcGVycyB3aGVuIHRoZSBpbmRleCBpcyBuZWdhdGl2ZSwgZWc6CgogICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD4KCiAgICAgICAgICAgICAgaXY9dmVjdG9yX2koWzAsMSwyLDMsNCw1XSkKICAgICAgICAgICAgICBpdlstNzpdCgogICAgICAgICAgICBub3cgcmV0dXJucyBbMCwgMSwgMiwgMywgNCwgNV0gaW5zdGVhZCBvZiBbNV0uCgogICAgICAgICAgICAgIHZ2Wzc6OV0gPSBbMjIsMzNdCgogICAgICAgICAgICBub3cgcmV0dXJucyBbMCwgMSwgMiwgMywgNCwgNSwgMjIsIDMzXSBpbnN0ZWFkIG9mICJpbmRleCBvdXQgcmFuZ2UiIGVycm9yLgoKICAgICAgICAgICAgQWxzbyBmaXggc29tZSBzZWdmYXVsdHMgd2hlbiByZXBsYWNpbmcgcmFuZ2VzLCBlZyB3aGVuIGlsIGlzIGEgc3RkOjpsaXN0IHdyYXBwZXI6CgogICAgICAgICAgICAgIGlsWzA6Ml0gPSBbMTFdCgoyMDEyLTAxLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbR29dIEZpeCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9uIHdpdGhpbiBhIGNsYXNzIHdoZW4gdXNlZCBhcyBhIGJhc2UuCgoyMDEyLTAxLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBzdXBwb3J0IGZvciAlbnNwYWNlIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMjAxMi0wMS0wNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoICMzNDUyNTYwIGZyb20gQnJhbnQgS3lzZXIgLSBhZGQgc3VwcG9ydCBmb3IgJW5zcGFjZSB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjIwMTEtMTItMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSAnZGlyZWN0b3JpbicgdHlwZW1hcCBub3cgYWNjZXB0cyAkMSwgJDIgZXRjIGV4cGFuc2lvbnMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gdXNlIHdvcmthcm91bmRzIC0KICAgICAgICAgICAgJDFfbmFtZSwgJDJfbmFtZSBldGMuCgoyMDExLTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIGRpcmVjdG9yIHR5cGVtYXBzLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBHbywgSmF2YSwgRF0gQWRkIHN1cHBvcnQgZm9yIHRoZSAnZGlyZWN0b3JhcmdvdXQnIHR5cGVtYXAuCgoyMDExLTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2NhbWwsIE9jdGF2ZSwgUEhQLCBQeXRob24sIFJ1YnldIENvcnJlY3Qgc3BlY2lhbCB2YXJpYWJsZXMgaW4gJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwLgogICAgICAgICAgICBUaGlzIGNoYW5nZSB3aWxsIGJyZWFrIGFueSAnZGlyZWN0b3JhcmdvdXQnIHR5cGVtYXBzIHlvdSBtYXkgaGF2ZSB3cml0dGVuLiBQbGVhc2UgY2hhbmdlOgogICAgICAgICAgICAgICRyZXN1bHQgdG8gJDEKICAgICAgICAgICAgICAkaW5wdXQgdG8gJHJlc3VsdAoKICAgICAgICAgICAgQWxzbyBmaXggdGhlIG5hbWVkICdkaXJlY3RvcmFyZ291dCcgRElSRUNUT1JPVVQgdHlwZW1hcHMgZm9yIHRoZXNlIGxhbmd1YWdlcyB3aGljaCBkaWRuJ3QKICAgICAgICAgICAgcHJldmlvdXNseSBjb21waWxlIGFuZCBhZGQgaW4gJDEsICQyIGV0YyBleHBhbnNpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDExLTEyLTEwOiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNXSUdfZXJyb3IoKSBub3cgZ2V0cyBkZWNvcmF0ZWQgd2l0aCBwZXJsIHNvdXJjZSBmaWxlL2xpbmUgbnVtYmVyLgogICAgICAgICAgICBbcGVybDVdIGVycm9yIGhhbmRsaW5nIG5vdyBjb25mb3JtcyB0byBwdWJsaWMgWFMgYXBpIChmaXhlcyBwZXJsIHY1LjE0IGlzc3VlKS4KCjIwMTEtMTItMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtBbmRyb2lkL0phdmFdIEZpeCBkaXJlY3RvcnMgdG8gY29tcGlsZSBvbiBBbmRyb2lkLgoKICAgICAgICAgICAgQWRkZWQgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMgZm9yIEFuZHJvaWQuCgoyMDExLTEyLTA4OiB2YWR6CgkgICAgQnVnIGZpeDogSGFuZGxlIG1ldGhvZHMgcmVuYW1lZCBvciBpZ25vcmVkIGluIHRoZSBiYXNlIGNsYXNzIGNvcnJlY3RseSBpbiB0aGUgZGVyaXZlZCBjbGFzc2VzCgkgICAgKHRoZXkgY291bGQgYmUgc29tZXRpbWVzIG15c3RlcmlvdXNseSBub3QgcmVuYW1lZCBvciBpZ25vcmVkIHRoZXJlIGJlZm9yZSkuCgoyMDExLTEyLTAzOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gRml4IGV4Y2VwdGlvbiBnbHVlIGNvZGUgZm9yIG5ld2VyIERNRCAyIHZlcnNpb25zLgogICAgICAgICAgICBbRF0gRG8gbm90IGRlZmF1bHQgdG8gMzIgYml0IGdsdWUgY29kZSBmb3IgRE1EIGFueW1vcmUuCiAgICAgICAgICAgIFtEXSBVc2Ugc3RkYy5jb25maWcuY19sb25nL2NfdWxvbmcgdG8gcmVwcmVzZW50IEMgbG9uZyB0eXBlcy4KCjIwMTEtMTItMDE6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeGVkIGJ1ZyAzNDQ3NDI2OiBtZW1vcnkgbGVhayBpbiB2ZWN0b3IuX19nZXRpdGVtX18uCgoyMDExLTExLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUmVtb3ZlIEMrKyBjb21tZW50cyBmcm9tIGdlbmVyYXRlZCBDIGNvZGUuCgoyMDExLTExLTI3OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHNvbWUgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIHdyYXBwZXJzIHdpdGgKCSAgICBjZXJ0YWluIEdDQyB3YXJuaW5nIG9wdGlvbnMgKERlYmlhbiBidWcgIzY1MDI0NikuCgoyMDExLTExLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM0MzM1NDEgJXR5cGVtYXAoaW4sIG51bWlucHV0cz0wKSB3aXRoIDEwKyBhcmd1bWVudHMuCgoyMDExLTExLTI4OiBvbGx5CgkgICAgW1BlcmxdIEZpeCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgd3JhcHBlcnMgd2l0aCBjZXJ0YWluCgkgICAgR0NDIHdhcm5pbmcgb3B0aW9ucyAoRGViaWFuIGJ1ZyAjNDM2NzExKS4KCjIwMTEtMTEtMjg6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUga2V5d29yZCBsaXN0IHRvIGluY2x1ZGUga2V5d29yZHMgYWRkZWQgaW4gUEhQIHJlbGVhc2VzIHVwIHRvIDUuMy4KCjIwMTEtMTEtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gUHJvdmlkZSBhbiBlYXN5IHdheSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2aXNpYmlsaXR5IGZvciB0aGUgcHJveHkgY2xhc3MgcG9pbnRlcgogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGdldENQdHIoKSBtZXRob2QuIFRoZSB2aXNpYmlsaXR5IGlzICdpbnRlcm5hbCcgYnkgZGVmYXVsdCBhbmQgaWYgbXVsdGlwbGUKICAgICAgICAgICAgU1dJRyBtb2R1bGVzIGFyZSBiZWluZyB1c2VkIGFuZCBjb21waWxlZCBpbnRvIGRpZmZlcmVudCBhc3NlbWJsaWVzLCB0aGVuIHRoZXkgbmVlZCB0byBiZSAKICAgICAgICAgICAgJ3B1YmxpYycgaW4gb3JkZXIgdG8gdXNlIHRoZSBjb25zdHJ1Y3RvciBvciBnZXRDUHRyKCkgbWV0aG9kIGZyb20gYSBkaWZmZXJlbnQgYXNzZW1ibHkuCiAgICAgICAgICAgIFVzZSB0aGUgZm9sbG93aW5nIG1hY3JvcyB0byBjaGFuZ2UgdGhlIHZpc2liaWxpdGllcyBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzczoKCiAgICAgICAgICAgICAgU1dJR19DU0JPRFlfUFJPWFkocHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQogICAgICAgICAgICAgIFNXSUdfQ1NCT0RZX1RZUEVXUkFQUEVSKHB1YmxpYywgcHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQoKICAgICAgICAgICAgW0phdmFdIFByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBmb3IgdGhlIHByb3h5IGNsYXNzIHBvaW50ZXIKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBnZXRDUHRyKCkgbWV0aG9kLiBUaGUgdmlzaWJpbGl0eSBpcyAncHJvdGVjdGVkJyBieSBkZWZhdWx0IGFuZCBpZiBtdWx0aXBsZQogICAgICAgICAgICBTV0lHIG1vZHVsZXMgYXJlIGJlaW5nIHVzZWQgYW5kIGNvbXBpbGVkIGludG8gZGlmZmVyZW50IHBhY2thZ2VzLCB0aGVuIHRoZXkgbmVlZCB0byBiZSAKICAgICAgICAgICAgJ3B1YmxpYycgaW4gb3JkZXIgdG8gdXNlIHRoZSBjb25zdHJ1Y3RvciBvciBnZXRDUHRyKCkgbWV0aG9kIGZyb20gYSBkaWZmZXJlbnQgcGFja2FnZS4KICAgICAgICAgICAgVXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHRvIGNoYW5nZSB0aGUgdmlzaWJpbGl0aWVzIGluIHRoZSBwcm94eSBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzOgoKICAgICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1BST1hZKHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKICAgICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1RZUEVXUkFQUEVSKHB1YmxpYywgcHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgZm9yIEphdmEgaGFzIGNoYW5nZWQgZnJvbSBwdWJsaWMgdG8gcHJvdGVjdGVkIGZvciB0aGUgcHJveHkgY2xhc3Nlcy4gVXNlIHRoZQogICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1BST1hZIG1hY3JvIGFib3ZlIHRvIHJlc3RvcmUgdG8gdGhlIHByZXZpb3VzIHZpc2liaWxpdGllcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTEtMTEtMjI6IHN6YWdlcgoJICAgIFtweXRob25dIEJ1ZyAzNDQwMDQ0OiAjaWZkZWYgb3V0IFNXSUdfUHl0aG9uX05vbkR5bmFtaWNTZXRBdHRyIGlmIC1idWlsdGluCgkgICAgaXNuJ3QgYmVpbmcgdXNlZCwgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYmluYXJ5IGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4KCSAgICBweXRob24gaW5zdGFsbGF0aW9ucy4KCjIwMTEtMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1ZyBmaXg6IFJlbW92ZSByb290IGRpcmVjdG9yeSBmcm9tIGRpcmVjdG9yeSBzZWFyY2ggbGlzdCBpbiBXaW5kb3dzLgoKMjAxMS0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoICMzNDIxODc2IGZyb20gUm9iaW4gU3RvY2tlciB0byBmaXggIzM0MTY4MTggLSBzYW1lIGNsYXNzIG5hbWUgaW4gCiAgICAgICAgICAgIGRpZmZlcmVudCBuYW1lc3BhY2VzIGNvbmZ1c2lvbiB3aGVuIHVzaW5nIG11bHRpcGxlIG1vZHVsZXMuCgoyMDExLTExLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGNyZS1idWlsZC5zaCB0byB3b3JrIHdpdGggbm9uLWNvbXByZXNzZWQgdGFyYmFsbHMgLSBwcm9ibGVtIHJlcG9ydGVkIGJ5IEFkcmlhbiBCbGFrZWx5LgoKMjAxMS0xMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRXhwYW5kIHNwZWNpYWwgdmFyaWFibGVzIGluIHR5cGVtYXAgd2FybmluZ3MsIGVnOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbiwgd2FybmluZz0iMTAwMDpUZXN0IHdhcm5pbmcgZm9yICdpbicgdHlwZW1hcCBmb3IgJDFfdHlwZSAkMV9uYW1lIikgaW50ICIuLi4iCgoyMDExLTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbmFtZWQgb3V0cHV0IHR5cGVtYXBzIG5vdCBiZWluZyB1c2VkIHdoZW4gdGhlIHN5bWJvbCB1c2VzIGEgcXVhbGlmaWVyIGFuZCBjb250YWlucwogICAgICAgICAgICBhIG51bWJlciwgZWc6CgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgZG91YmxlIEFCQzo6bTEgIi4uLiIKCjIwMTEtMTAtMjQ6IHRhbGJ5CiAgICAgICAgICAgIFtwZXJsNV0gU0YgYnVnICMzNDIzMTE5IC0gb3ZlcmxvYWQgZGlzcGF0Y2ggc3RhY2sgY29ycnVwdGlvbiBmaXguICBCZXR0ZXIsIGJ1dCBtb3JlIHJlc2VhcmNoCiAgICAgICAgICAgIGlzIG5lZWRlZCBvbiBhIHN0YWJsZSBwYXRoIGZvciB0YWlsIGNhbGxzIGluIFhTLgoKICAgICAgICAgICAgQWxzbywgZml4IGZvciBsYXJnZSBsb25nIGxvbmdzIGluIDMyIGJpdCBwZXJsLgoKMjAxMS0xMC0xMzogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBBbGxvdyBPY3RhdmUgbW9kdWxlcyB0byBiZSByZS1sb2FkZWQgYWZ0ZXIgYSAiY2xlYXIgYWxsIi4KCjIwMTEtMDktMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuMSByZXBvcnRlZCBieSBUZWVtdSBJa29ub25lIGxlYWRpbmcgdG8gdW5jb21waWxhYmxlIGNvZGUKICAgICAgICAgICAgd2hlbiB1c2luZyB0eXBlZGVmIGFuZCBmdW5jdGlvbiBwb2ludGVyIHJlZmVyZW5jZXMsIGZvciBleGFtcGxlOiAKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgRk4oY29uc3QgaW50ICZhLCBpbnQgYik7CiAgICAgICAgICAgICAgdm9pZCAqdHlwZWRlZl9jYWxsMShGTiAqJiBwcmVjYWxsYmFjaywgRk4gKiBwb3N0Y2FsbGJhY2spOwoKMjAxMS0wOS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUGF0Y2ggIzM0MDgwMTIgZnJvbSBSYW1hbiBHb3BhbGFuIC0gYWRkIHN1cHBvcnQgZm9yIGVtYmVkZGVkIEx1YSAoZUx1YSkKICAgICAgICAgICAgaW5jbHVkaW5nIG9wdGlvbnMgZm9yIHRhcmdldGluZyBMdWEgVGlueSBSQU0gKExUUikuCgoyMDExLTA5LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBib29zdF9pbnRydXNpdmVfcHRyLmkgbGlicmFyeSBjb250cmlidXRpb24gZnJvbSBwYXRjaCAjMzQwMTU3MS4KCjIwMTEtMDktMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB3YXJuaW5ncyBmb3IgYmFkbHkgbmFtZWQgZGVzdHJ1Y3RvcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgS1N0cnVjdCB7CiAgICAgICAgICAgICAgICB+Tk9UX0tTdHJ1Y3QoKSB7fQogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBjcHBfZXh0ZW5kX2Rlc3RydWN0b3JzLmk6OTI6IFdhcm5pbmcgNTIxOiBJbGxlZ2FsIGRlc3RydWN0b3IgbmFtZSB+Tk9UX0tTdHJ1Y3QuIElnbm9yZWQuCgoyMDExLTA5LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWV4dGVuZCBhbmQgZGVzdHJ1Y3RvcnMgZm9yIHRlbXBsYXRlcy4gVGhlIGRlc3RydWN0b3IgaW4gJWV4dGVuZCB3YXMgbm90IGFsd2F5cyB3cmFwcGVkLAogICAgICAgICAgICBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4dGVuZCBGb29UIHsKICAgICAgICAgICAgICAgIH5Gb29UKCkgeyBkZWxldGUgJHNlbGY7IH0gLy8gd2FzIG5vdCB3cmFwcGVkIGFzIGV4cGVjdGVkCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb29UIHt9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29UaSkgRm9vVDxpbnQ+OwoKMjAxMS0wOS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNwZWNpYWwgdmFyaWFibGVzIHN1Y2ggYXMgIiRkZWNsIiBhbmQgIiRmdWxsZGVjbCIgaW4gZGVzdHJ1Y3RvcnMgdG8gaW5jbHVkZSB0aGUgfiBjaGFyYWN0ZXIuCgoyMDExLTA5LTEwOiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNGIGJ1ZyAjMTQ4MTk1OCAtIEltcHJvdmUgcmFuZ2UgY2hlY2tpbmcgZm9yIGludGVnZXIgdHlwZXMuCiAgICAgICAgICAgIEVuaGFuY2UgbGlfdHlwZW1hcHNfcnVubWUucGwKCjIwMTEtMDktMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlZXh0ZW5kIG9uIHR5cGVkZWYgY2xhc3NlcyBpbiBhIG5hbWVzcGFjZSB1c2luZyB0aGUgdHlwZWRlZiBuYW1lLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAlZXh0ZW5kIENTdHJ1Y3QgewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHRhZ0NTdHJ1Y3QgeyAuLi4gfSBDU3RydWN0OwogICAgICAgICAgICB9CgoyMDExLTA4LTMxOiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIHBhdGNoZXMgZnJvbSBLYXJsIFdldHRlOiBpbXByb3ZlbWVudHMgdG8gbW9kdWxlIGxvYWRpbmcgYmVoYXZpb3I7CgkgICAgYWRkZWQgZXhhbXBsZSBvZiBmcmllbmQgb3BlcmF0b3IgdG8gb3BlcmF0b3IgZXhhbXBsZTsgZml4ZWQgb2N0YXZlIHBhbmljL2NyYXNoIGluIDMuMC41OwoJICAgIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzCgoyMDExLTA4LTMwOiBzemFnZXIKCSAgICBbcHl0aG9uXSBCdWcgMzQwMDQ4NiwgZml4IGVycm9yIHNpZ25hbGxpbmcgZm9yIGJ1aWx0LWluIGNvbnN0cnVjdG9ycy4KCjIwMTEtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHb10gRml4IGZpbGUvbGluZSBudW1iZXIgZGlzcGxheSBmb3IgImdvdHlwZSIgd2hlbiB1c2luZyB0eXBlbWFwIGRlYnVnZ2luZyBvcHRpb25zCiAgICAgICAgICAgIC10bXNlYXJjaCBhbmQgLXRtdXNlZC4KCjIwMTEtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgRF0gRml4ICVjYWxsYmFjayB3aGljaCB3YXMgZ2VuZXJhdGluZyB1bmNvbXBpbGFibGUgY29kZS4KCjIwMTEtMDgtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBjb25zdHJ1Y3RvcnMgaW4gbmFtZWQgdHlwZWRlZiBjbGFzcyBkZWNsYXJhdGlvbnMgYXMgcmVwb3J0ZWQgYnkgR3JlZ29yeSBCcm9ubmVyOgoKICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgQSgpe30gLy8gQ29uc3RydWN0b3Igd2hpY2ggd2FzIG5vdCBhY2NlcHRlZCBieSBTV0lHCiAgICAgICAgICAgICAgQigpe30gLy8gTk9UIGEgY29uc3RydWN0b3IgLS1pbGxlZ2FsLCBidXQgd2FzIGFjY2VwdGVkIGJ5IFNXSUcKICAgICAgICAgICAgfSBCOwoKICAgICAgICAgICAgRm9yIEMgY29kZSwgdGhlIGZpeCBub3cgcmVzdWx0cyBpbiB0aGUgdXNlIG9mICdzdHJ1Y3QgQSAqJyBpbnN0ZWFkIG9mIGp1c3QgJ0IgKicgaW4KICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBjb2RlIHdoZW4gd3JhcHBpbmcgbWVtYmVycyBpbiBBLCBidXQgdWx0aW1hdGVseSB0aGlzIGRvZXMgbm90IG1hdHRlciwgYXMKICAgICAgICAgICAgdGhleSBhcmUgdGhlIHNhbWUgdGhpbmcuCgoyMDExLTA4LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJW5ld29iamVjdCB3aGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAlZmVhdHVyZSgicmVmIikgYXMgcmVwb3J0ZWQgYnkgSmFuIEJlY2tlci4gVGhlCiAgICAgICAgICAgIGNvZGUgZnJvbSB0aGUgInJlZiIgZmVhdHVyZSB3YXMgbm90IGFsd2F5cyBiZWluZyBnZW5lcmF0ZWQgZm9yIHRoZSBmdW5jdGlvbiBzcGVjaWZpZWQgYnkgJW5ld29iamVjdC4KICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBmb3IgInJlZiIgYW5kICJ1bnJlZiIgbW92ZWQgZnJvbSBQeXRob24gdG8gdGhlIEMrKyBjaGFwdGVyLgoKMjAxMS0wOC0yMjogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4ZWQgbWVtb3J5IGxlYWsgd2l0aCAtLWJ1aWx0aW4gb3B0aW9uIChidWcgMzM4NTA4OSkuCgoyMDExLTA4LTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBTRiBwYXRjaCAjMzM5NDMzOSBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZiAtIG5ldyBvcHRpb24gLW5vbW9kdWxlZ2xvYmFsIHRvIGRpc2FibGUgaW5zdGFsbGluZyAKICAgICAgICAgICAgdGhlIG1vZHVsZSB0YWJsZSBpbnRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBSZXF1aXJlIGNhbGwgYWxzbyByZXR1cm5zIHRoZSBtb2R1bGUgdGFibGUgaW5zdGVhZCAKICAgICAgICAgICAgb2YgYSBzdHJpbmcuCgoyMDExLTA4LTA5OiB4YXZpZXI5OAogICAgICAgICAgICBGaXggYnVnIDMzODczOTQ7IE9jdGF2ZSBwYXRjaGVzIGZvciAzLjQuMCBjb21wYXRpYmlsaXR5LCBldGMuIChmcm9tIEthcmwgV2V0dGUpCgoyMDExLTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgaW4gJHN5bW5hbWUgZXhwYW5zaW9uIGZvciBkaXJlY3RvciBtZXRob2RzLgoKMjAxMS0wNy0yOTogb2xseQoJICAgIFtQSFBdIERvbid0IGdlbmVyYXRlICJyZXR1cm4gJHI7IiBpbiBjYXNlcyB3aGVyZSAkciBoYXNuJ3QgYmVlbiBzZXQuCgkgICAgVGhpcyB3YXMgYmFzaWNhbGx5IGhhcm1sZXNzLCBleGNlcHQgaXQgZ2VuZXJhdGVkIGEgUEhQIEVfTk9USUNFIGlmCgkgICAgdGhlIGNhbGxpbmcgY29kZSBoYWQgZW5hYmxlZCB0aGVtLgoKMjAxMS0wNy0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNjb3Bpbmcgb2YgZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgbmVzdGVkIHdpdGhpbiBhIGNsYXNzIChmb3IgQysrKS4gUHJldmlvdXNseSB0aGUgc3ltYm9sCiAgICAgICAgICAgIHdhcyBpbmNvcnJlY3RseSBwdXQgaW50byB0aGUgb3V0ZXIgbmFtZXNwYWNlLCBlZwoKICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBUPiBzdHJ1Y3QgbWFwIHsKICAgICAgICAgICAgICAgIGNsYXNzIGl0ZXJhdG9yOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZXJhdG9yIHdhcyBzY29wZWQgYXMgc3RkOjppdGVyYXRvciwgYnV0IG5vdyBpdCBpcyBjb3JyZWN0bHkgc3RkOjptYXA8S2V5LCBUPjo6aXRlcmF0b3I7CgogICAgICAgICAgICBBbHNvIGZpeGVkIGlzICV0ZW1wbGF0ZSBhbmQgdGVtcGxhdGUgcGFyYW1ldGVycyB0aGF0IGFyZSBhIHR5cGVkZWYgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbnMKICAgICAgICAgICAgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCBlZzoKCiAgICAgICAgICAgIG5hbWVzcGFjZSBTdGQgewogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgQyA9IGludD4gc3RydWN0IE1hcCB7CiAgICAgICAgICAgICAgICB0eXBlZGVmIEtleSBrZXlfdHlwZTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgVCBtYXBwZWRfdHlwZTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIERPVUJMRTsKICAgICAgICAgICAgJXRlbXBsYXRlKE1NKSBTdGQ6Ok1hcDxpbnQsIERPVUJMRT47CgogICAgICAgICAgICBBbGwgc3ltYm9scyB3aXRoaW4gTWFwIHdpbGwgYmUgcmVzb2x2ZWQgY29ycmVjdGx5LCBlZyBrZXlfdHlwZSBhbmQgbWFwcGVkX3R5cGUgbm8gbWF0dGVyIGlmIHRoZQogICAgICAgICAgICB3cmFwcGVkIGNvZGUgdXNlcyBTdGQ6Ok1hcDxpbnQsIGRvdWJsZT4gb3Igc3RkOjpNYXA8aW50LCBET1VCTEU+IG9yIFN0ZDo6TWFwPGludCwgZG91YmxlLCBpbnQ+CgogICAgICAgICAgICBBbHNvIGZpeGVzIGJ1ZyAjMzM3ODE0NSAtIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAyLjAuNCAtICV0ZW1wbGF0ZSB1c2luZyB0cmFpdHMuCgoyMDExLTA3LTIwICBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXggY2xvc3VyZSBmb3IgdHBfY2FsbCBzbG90LgoKMjAxMS0wNy0xNjogd3NmdWx0b24KCSAgICBbcHl0aG9uXSBGaXggZGlyZWN0b3IgdHlwZW1hcCB1c2luZyBQeU9iamVjdCAqLgoKMjAxMS0wNy0xMzogc3phZ2VyCgkgICAgW3B5dGhvbl0gU0YgcGF0Y2ggIzMzNjU5MDggLSBBZGQgYWxsIHRlbXBsYXRlIHBhcmFtZXRlcnMgdG8gbWFwIHN1cHBvcnQgY29kZSBpbiBzdGRfbWFwLmkKCjIwMTEtMDctMTM6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeCBmb3IgYnVnIDMzMjQ3NTM6ICVyZW5hbWUgbWVtYmVyIHZhcmlhYmxlcyB3aXRoIC1idWlsdGluLgoKMjAxMS0wNy0wMTogd3NmdWx0b24KCSAgICBGaXggc29tZSBzY29wZSBhbmQgc3ltYm9sIGxvb2t1cCBwcm9ibGVtcyB3aGVuIHRlbXBsYXRlIGRlZmF1bHQgcGFyYW1ldGVycyBhcmUgYmVpbmcKICAgICAgICAgICAgdXNlZCB3aXRoIHR5cGVkZWYuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgWFgsIHR5cGVuYW1lIFRUID0gU29tZVR5cGU+IHN0cnVjdCBGb28gewogICAgICAgICAgICAgIHR5cGVkZWYgWFggWDsKICAgICAgICAgICAgICB0eXBlZGVmIFRUIFQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRUPiBzdHJ1Y3QgVXNlc0ZvbyB7CiAgICAgICAgICAgICAgdm9pZCB4KHR5cGVuYW1lIEZvbzxUVD46OlQsIHR5cGVuYW1lIEZvbzxUVD46OlgpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgQWxzbyBmaXhlcyB1c2Ugb2Ygc3RkOjp2ZWN0b3I8aW50Pjo6c2l6ZV90eXBlIGZvciBQeXRob24gYXMgcmVwb3J0ZWQgYnkgQXVicmV5IEJhcm5hcmQuCgoyMDExLTA2LTIzOiBvbGx5CgkgICAgW1BIUF0gRml4IGRpcmVjdG9yIGNvZGUgdG8gd29yayB3aGVuIFBIUCBpcyBidWlsdCB3aXRoIFpUUyBlbmFibGVkLAoJICAgIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIG9uIE1pY3Jvc29mdCBXaW5kb3dzLgoKMjAxMS0wNi0yMTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gdmFyaW91cyBzbWFsbCB0d2Vha3MgYW5kIGJ1ZyBmaXhlcy4KCSAgICAtIEF2b2lkIG5hbWUgY29uZmxpY3RzIGJldHdlZW4gc21hcnQgcG9pbnRlciB3cmFwcGVycyBhbmQgdGhlIHdyYXBwZXJzIGZvcgoJICAgIHRoZSBhY3R1YWwgY2xhc3MuCgkgICAgLSBGaXggZGVmYXVsdCB0eXBlbWFwcyBmb3IgQyBiaW5kaW5ncywgd2hpY2ggd2VyZSBpbmNvcnJlY3RseSBhdHRlbXB0aW5nIHRvCgkgICAgY2FsbCBub24tZXhpc3RlbnQgZGVzdHJ1Y3RvcnMgb24gdXNlci1kZWZpbmVkIHR5cGVzLgoJICAgIC0gTmV3IGZlYXR1cmUsIGZlYXR1cmU6YWNsbWl4aW5zLCBmb3IgYWRkaW5nIHN1cGVyY2xhc3MgdG8gdGhlIGZvcmVpZ24gY2xhc3MKCSAgICB3cmFwcGVycy4KCSAgICAtIEltcHJvdmUgbG9uZ2xvbmcgdHlwZW1hcHMuCgoyMDExLTA2LTE5OiB3c2Z1bHRvbgoJICAgIEZpeCBpbmNvcnJlY3QgdHlwZW1hcHMgYmVpbmcgdXNlZCBmb3IgYSBzeW1ib2wgd2l0aGluIGEgdGVtcGxhdGVkIHR5cGUsIGVnOgogICAgICAgICAgICBBPGludD46OnZhbHVlX3R5cGUgd291bGQgaW5jb3JyZWN0bHkgdXNlIGEgdHlwZW1hcCBmb3IgdHlwZSBBLgoKMjAxMS0wNi0xODogb2xseQoJICAgIFtUY2xdIEZpeCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgaW4gbWlkZGxlIG9mIGJsb2NrcyB3aGljaCBpc24ndAoJICAgIHBlcm1pdHRlZCBpbiBDOTAgKGlzc3VlIHByb2JhYmx5IGludHJvZHVjZWQgaW4gMi4wLjMgYnkgcGF0Y2ggIzMyMjQ2NjMpLgoJICAgIFJlcG9ydGVkIGJ5IFBhdWwgT2Jlcm1laWVyIGluIFNGIzMyODg1ODYuCgoyMDExLTA2LTE3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBTRiAjMzMxMjUwNSAtIHNsaWdodGx5IGVhc2llciB0byB3cmFwIGNoYXJbXSBvciBjaGFyW0FOWV0gd2l0aCBhIEphdmEgYnl0ZVtdCiAgICAgICAgICAgIHVzaW5nIGFycmF5c19qYXZhLmkuCgoyMDExLTA2LTEzOiB3c2Z1bHRvbgoJICAgIFtSdWJ5LCBPY3RhdmVdIFNGICMzMzEwNTI4IEF1dG9kb2MgZml4ZXMgc2ltaWxhciB0byB0aG9zZSBkZXNjcmliZWQgYmVsb3cgZm9yIFB5dGhvbi4KCjIwMTEtMDYtMTA6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRmV3IHN1YnRsZSBidWdmaXhlcyBpbiBhdXRvZG9jIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbiwKICAgICAgICAgICAgLSBVbm5hbWVkIGFyZ3VtZW50IG5hbWVzIGZpeCBmb3IgYXV0b2RvYyBsZXZlbHMgPiAwLgogICAgICAgICAgICAtIERpc3BsYXkgb2YgdGVtcGxhdGUgdHlwZXMgZml4ZWQgZm9yIGF1dG9kb2MgbGV2ZWxzID4gMS4KICAgICAgICAgICAgLSBGaXggU0YgIzMzMTA1MjggLSBkaXNwbGF5IG9mIHR5cGVkZWYgc3RydWN0cyBmb3IgYXV0b2RvYyBsZXZlbHMgPiAxLgogICAgICAgICAgICAtIEFkZCBtaXNzaW5nIHR5cGUgZm9yIHNlbGYgZm9yIGF1dG9kb2MgbGV2ZWxzIDEgYW5kIDMuCiAgICAgICAgICAgIC0gYXV0b2RvYyBsZXZlbHMgMiBhbmQgMyBkb2N1bWVudGVkLgogICAgICAgICAgICAtIE1pbm9yIHR3ZWFrcyB0byBhdXRvZG9jIHN0eWxlIHRvIGNvbmZvcm0gd2l0aCBQRVA4LgoKMjAxMS0wNS0zMDogb2xseQoJICAgIFtQSFBdIEZpeCBoYW5kbGluZyBvZiBkaXJlY3RvcnMgd2hlbiAtcHJlZml4IGlzIHVzZWQuCgoyMDExLTA1LTI0OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIG1ldGhvZHMgb2YgY2xhc3NlcyB3aXRoIGEgdmlydHVhbCBiYXNlIGNsYXNzIChTRiMzMTI0NjY1KS4KClZlcnNpb24gMi4wLjQgKDIxIE1heSAyMDExKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTEtMDUtMTk6IHdzZnVsdG9uCgkgICAgW0d1aWxlXSBQYXRjaCAjMzE5MTYyNSBmaXhpbmcgb3ZlcmxvYWRpbmcgb2YgaW50ZWdlciB0eXBlcy4KCjIwMTEtMDUtMTk6IHdzZnVsdG9uCgkgICAgW1BlcmxdIFBhdGNoICMzMjYwMjY1IGZpeGluZyBvdmVybG9hZGluZyBvZiBub24tcHJpbWl0aXZlIHR5cGVzIGFuZCBpbnRlZ2VycyBpbiAKICAgICAgICAgICAgUGVybCA1LjEyIGFuZCBsYXRlci4KCjIwMTEtMDUtMTk6IHdzZnVsdG9uCgkgICAgW1J1YnldIEZpeCAlaW1wb3J0IHdoZXJlIG9uZSBvZiB0aGUgaW1wb3J0ZWQgZmlsZXMgJWluY2x1ZGUgb25lIG9mIHRoZSBTVEwgaW5jbHVkZQogICAgICAgICAgICBmaWxlcyBzdWNoIGFzIHN0ZF92ZWN0b3IuaS4KCjIwMTEtMDUtMTc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEFwcGx5ICMzMjg5ODUxIGZyb20gQWxhbiBIYXJkZXIgdG8gZml4IG1lbW9yeSBsZWFrIGluIGRpcmVjdG9ycyB3aGVuIGNoZWNraW5nCiAgICAgICAgICAgIGZvciBwZW5kaW5nIGV4Y2VwdGlvbnMuCgoyMDExLTA1LTE3OiB3c2Z1bHRvbgoJICAgIFtUY2xdIEFwcGx5ICMzMzAwMDcyIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlIHRvIGZpeCBtdWx0aXBsZSBtb2R1bGUgbG9hZGluZyBub3QKICAgICAgICAgICAgYWx3YXlzIHNoYXJpbmcgdmFyaWFibGVzIGFjcm9zcyBtb2R1bGVzLgoKMjAxMS0wNS0xNjogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBGaXggYW4gaW5jb21wYXRpYmlsaXR5IHdpdGggbmV2ZXIgdmVyc2lvbnMgb2YgT2N0YXZlLiBDYXNlIG9uIE9jdGF2ZQoJICAgIEFQSSA+PSA0MCB0byBoYW5kbGUgcmVuYW1lIG9mIE9jdGF2ZV9tYXAgdG8gb2N0YXZlX21hcC4KCSAgICBbb2N0YXZlXSBBZGQgc3VwcG9ydCBmb3IgeS5fX3JvcF9fKHgpIG9wZXJhdG9ycyB3aGVuIHguX19vcF9fKHkpIGRvZXNuJ3QgZXhpc3QuCgkgICAgW29jdGF2ZV0gQWxsb3cgZ2xvYmFsIG9wZXJhdG9ycyB0byBiZSBkZWZpbmVkIGJ5IFNXSUctd3JhcHBlZCBmdW5jdGlvbnMuCgkgICAgW29jdGF2ZV0gRml4IHNldmVyYWwgYnVncyBhcm91bmQgbW9kdWxlIG5hbWVzcGFjZXM7IGFkZCAtZ2xvYmFsLCAtbm9nbG9iYWwsCgkgICAgLWdsb2JhbHMgPG5hbWU+IGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIHRoZSBtb2R1bGUuCgoyMDExLTA1LTE0OiB3c2Z1bHRvbgoJICAgICV2YXJhcmdzIHdoZW4gdXNlZCB3aXRoIGEgbnVtZXJpYyBhcmd1bWVudCB1c2VkIHRvIGNyZWF0ZSBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IAogICAgICAgICAgICB3aGljaCB3YXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZWQgc2VudGluZWwgdmFsdWUuIFRoaXMgbmV2ZXIgd29ya2VkIGFuZCBub3cKICAgICAgICAgICAgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnQgaXMgbm90IGdlbmVyYXRlZC4KCjIwMTEtMDUtMTM6IHdzZnVsdG9uCgkgICAgW3B5dGhvbl0gQWRkaXRpb25hbCBmaXhlcyBmb3IgcHl0aG9uMy4yIHN1cHBvcnQuCgoyMDExLTA1LTA3OiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXhlZCBQeUdldFNldERlc2NyIGZvciBweXRob24zLjIuCgoyMDExLTA1LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhLCBQeXRob24sIFRjbF0gQy9DKysgcHJvdG90eXBlcyBzaG93biBpbiBlcnJvciBtZXNzYWdlIHdoZW4gY2FsbGluZyBhbiBvdmVybG9hZGVkCiAgICAgICAgICAgIG1ldGhvZCB3aXRoIGluY29ycmVjdCBhcmd1bWVudHMgaW1wcm92ZWQgdG8gc2hvdyBhbHdheXMgc2hvdyBmdWxseSBxdWFsaWZpZWQgbmFtZQogICAgICAgICAgICBhbmQgaWYgYSBjb25zdCBtZXRob2QuIAoKICAgICAgICAgICAgQWxzbyBmaXhlZCBvdGhlciBMdWEgZXJyb3IgbWVzc2FnZXMgaW4gZ2VuZXJhdGVkIGNvZGUgd2hpY2ggd2VyZW4ndCBjb25zaXN0ZW50bHkKICAgICAgICAgICAgdXNpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBDKysgbmFtZSAtIHJlcXVlc3RlZCBieSBHZWRhbGlhIFBhc3Rlcm5hay4KCjIwMTEtMDQtMjk6IHN6YWdlcgoJICAgIEJ1ZyAyNjM1OTE5OiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29udmVydCBzdGQ6Om1hcCB0byBhIHB5dGhvbiBkaWN0LgoKMjAxMS0wNC0yOTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgYnVnIDI4MTE1NDk6IHJldHVybiBub24tY29uc3QgaXRlcmF0b3JzIGZyb20gU1RMCgkgICAgbWV0aG9kcyBiZWdpbigpLCBlbmQoKSwgcmJlZ2luKCksIHJlbmQoKS4KCjIwMTEtMDQtMjU6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIGJ1ZyAxNDk4OTI5OiBBY2Nlc3MgdG8gbWVtYmVyIGZpZWxkcyBpbiBtYXAgZWxlbWVudHMKCjIwMTEtMDQtMjM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBuc3BhY2U6IENvcnJlY3RseSBnZW5lcmF0ZSBpZGVudGlmaWVycyBmb3IgYmFzZSBjbGFzc2VzIHdoZW4KICAgICAgICAgICAgbm90IGluIHNwbGl0IHByb3h5IG1vZGUuCgoyMDExLTA0LTEzOiBzemFnZXIKCSAgICBGaXhlZCBidWcgMzI4NjMzMzogaW5maW5pdGUgcmVjdXJzaW9uIHdpdGggbXV0dWFsICd1c2luZyBuYW1lc3BhY2UnIGNsYXVzZXMuCgoyMDExLTA0LTEyOiBzemFnZXIKCSAgICBGaXhlZCBidWcgMTE2MzQ0MDogdmFyYXJnIHR5cGVtYXBzLgoKMjAxMS0wNC0xMjogc3phZ2VyCgkgICAgRml4ZWQgYnVnICMzMjg1Mzg2OiBwYXJzZSBlcnJvciBmcm9tICdvcGVyYXRvciBUKiYoKScuICBBZGRlZCBvcGVyYXRvcl9wb2ludGVyX3JlZgoJICAgIHRlc3QgY2FzZSB0byBkZW1vbnN0cmF0ZS4KCjIwMTEtMDQtMTE6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIFB5VmFyT2JqZWN0X0hFQURfSU5JVCB0byBlbGltaW5hdGUgVkMrKyBjb21waWxlciBlcnJvcnMgYWJvdXQKCSAgICBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2Ygc3RydWN0IG1lbWJlcnMgd2l0aCBwb2ludGVycy4KCjIwMTEtMDQtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5IHBhdGNoICMzMjg0MzI2IGZyb20gQ29saW4gTWNEb25hbGQgdG8gZml4IHNvbWUgY29tcGlsZXIgd2FybmluZ3MuCgoyMDExLTA0LTExOiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBQeVZhck9iamVjdF9IRUFEX0lOSVQgdG8gZWxpbWluYXRlIFZDKysgY29tcGlsZXIgZXJyb3JzIGFib3V0CgkgICAgc3RhdGljIGluaXRpYWxpemF0aW9uIG9mIHN0cnVjdCBtZW1iZXJzIHdpdGggcG9pbnRlcnMuCgoyMDExLTA0LTEwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gRml4ZWQgd3JhcHBpbmcgb2YgZW51bXMgdGhhdCBhcmUgdHlwZSBjaGFyLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgZW51bSB7IFggPSAnWCc7IH0gKHRoaXMgd2FzIGFscmVhZHkgaW4gMi4wLjMgZm9yIEMjIGFuZCBKYXZhKQoKMjAxMS0wNC0xMDoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIG5zcGFjZTogRml4ZWQgcmVmZXJlbmNpbmcgdHlwZXMgaW4gdGhlIHJvb3QgbmFtZXNwYWNlIHdoZW4KICAgICAgICAgICAgbm90IGluIHNwbGl0IHByb3h5IG1vZGUuCgoyMDExLTA0LTA5OiBzemFnZXIKCSAgICBbUHl0aG9uXSBBcHBsaWVkIHBhdGNoICMxOTMyNDg0OiBtaWdyYXRlIFB5Q09iamVjdCB0byBQeUNhcHN1bGUuCgoyMDExLTA0LTA5OiBzemFnZXIKCSAgICBbUHl0aG9uXSBBZGRlZCBwcmVwcm9jZXNzb3IgZ3VhcmRzIGZvciBweXRob24gZnVuY3Rpb25zIFB5VW5pY29kZV9Bc1dpZGVDaGFyIGFuZAoJICAgIFB5U2xpY2VfR2V0SW5kaWNlcywgd2hpY2ggY2hhbmdlZCBzaWduYXR1cmVzIGluIHB5dGhvbjMuMi4KCjIwMTEtMDQtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBjb25zdCBhcnJheSB0eXBlZGVmcyB3aGljaCB3ZXJlIGdlbmVyYXRpbmcgdW5jb21waWxhYmxlIGNvZGUgYXMKICAgICAgICAgICAgcmVwb3J0ZWQgYnkgS2FybCBXZXR0ZS4KCjIwMTEtMDQtMDM6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIHRoZSBiZWhhdmlvciBvZiAlcHl0aG9ubm9uZHluYW1pYyB0byBjb25mb3JtIHRvIHRoZSBzcGVjIGluIExpYi9weXVzZXJkaXIuc3dnLgoKMjAxMS0wNC0wMzogc3phZ2VyCgkgICAgW1B5dGhvbl0gTWVyZ2VkIGluIHRoZSBzemFnZXItcHl0aG9uLWJ1aWx0aW4gYnJhbmNoLCBhZGRpbmcgdGhlIC1idWlsdGluIGZlYXR1cmUKCSAgICBmb3IgcHl0aG9uLiAgVGhlIC1idWlsdGluIG9wdGlvbiBtYXkgcHJvdmlkZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGdhaW4KCSAgICBpbiBweXRob24gd3JhcHBlcnMuICBGb3IgZnVsbCBkZXRhaWxzIGFuZCBsaW1pdGF0aW9ucywgcmVmZXIgdG8gRG9jL01hbnVhbC9QeXRob24uaHRtbC4KCSAgICBBIHNtYWxsIHRlc3Qgc3VpdGUgZGVzaWduZWQgdG8gZGVtb25zdHJhdGUgdGhlIHBlcmZvcm1hbmNlIGdhaW4gaXMgaW4KCSAgICBFeGFtcGxlcy9weXRob24vcGVyZm9ybWFuY2UuCgoyMDExLTA0LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgaW4gbWlzc2luZyB3cmFwcGVycyBmb3IgZnJpZW5kIGZ1bmN0aW9ucyBmb3Igc29tZSB0YXJnZXQgbGFuZ3VhZ2VzLCBtb3N0bHkKICAgICAgICAgICAgdGhlIG5vbi1zY3JpcHRpbmcgbGFuZ3VhZ2VzIGxpa2UgSmF2YSBhbmQgQyMuCgpWZXJzaW9uIDIuMC4zICgyOSBNYXJjaCAyMDExKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEFwcGx5IHBhdGNoICMzMjM5MDc2IGZyb20gTWFyaWUgV2hpdGUgZml4aW5nIHN0cmluZ3MgZm9yIFIgPj0gMi43LjAKCjIwMTEtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5IHBhdGNoICMzMjQ4MjgwIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlIHdoaWNoIGFkZHMgYmV0dGVyIGVycm9yIG1lc3NhZ2VzIHdoZW4KICAgICAgICAgICAgdGhlIGluY29ycmVjdCBudW1iZXIgb3IgdHlwZSBvZiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byBvdmVybG9hZGVkIG1ldGhvZHMuCgoyMDExLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSBwYXRjaCAjMzIyNDY2MyBmcm9tIENocmlzdGlhbiBEZWxiYWVyZS4KICAgICAgICAgICAgMS4gRml4IHdoZW4gZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgdmFsdWUsIGEgIk5VTEwiIGNvbW1hbmQgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBUY2wgaW50ZXJwcmV0ZXIKICAgICAgICAgICAgYW5kIGNhbGxpbmcgdGhpcyBjb21tYW5kIHdpbGwgY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQuIAoKICAgICAgICAgICAgMi4gUHJldmlvdXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIGNsYXNzIG1ldGhvZHMgdXNpbmcgYSBsaW5lYXIgc2VhcmNoIGNhdXNpbmcgcGVyZm9ybWFuY2UgaXNzdWVzCiAgICAgICAgICAgIGluIHdyYXBwZXJzIGZvciBjbGFzc2VzIHdpdGggbWFueSBtZW1iZXIgZnVuY3Rpb25zLiBUaGUgcGF0Y2ggYWRkcyBhIG1ldGhvZCBoYXNoIHRhYmxlIHRvIGNsYXNzZXMgYW5kCiAgICAgICAgICAgIGNoYW5nZXMgbWV0aG9kIG5hbWUgbG9va3VwIHRvIHVzZSB0aGUgaGFzaCB0YWJsZSBpbnN0ZWFkIG9mIGRvaW5nIGEgbGluZWFyIHNlYXJjaC4KCjIwMTEtMDMtMjY6IHdzZnVsdG9uCgkgICAgW0MjLCBKYXZhXSBTRiBidWcgIzMxOTUxMTIgLSBmaXggd3JhcHBpbmcgb2YgZW51bXMgdGhhdCBhcmUgdHlwZSBjaGFyLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBlbnVtIHsgWCA9ICdYJzsgfQoKMjAxMS0wMy0yMTogdmFkegoJICAgIEFsbG93IHNldHRpbmcgUENSRV9DRkxBR1MgYW5kIFBDUkVfTElCUyBkdXJpbmcgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5CgkgICAgcGNyZS1jb25maWcsIGUuZy4gdG8gYWxsb3cgdXNpbmcgYSBzdGF0aWMgdmVyc2lvbiBvZiBQQ1JFIGxpYnJhcnkuCgoyMDExLTAzLTE3OiB3c2Z1bHRvbgoJICAgIFtVVExdIEFkZCBtaXNzaW5nIGhlYWRlcnMgaW4gZ2VuZXJhdGVkIFNUTCB3cmFwcGVycyB0byBmaXggY29tcGlsYXRpb24gd2l0aCBnY2MtNC42LgoKMjAxMS0wMy0xNzogd3NmdWx0b24KCSAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjIgd2hlcmUgZmlsZW5hbWVzIHdpdGggc3BhY2VzIHdlcmUgbm90IGZvdW5kCgkgICAgd2hlbiB1c2VkIHdpdGggJWluY2x1ZGUgYW5kICVpbXBvcnQuIFJlcG9ydGVkIGJ5IFNoYW5lIExpZXNlZ2FuZy4KCjIwMTEtMDMtMTU6IHdzZnVsdG9uCgkgICAgW1VUTF0gRml4IG92ZXJsb2FkaW5nIHdoZW4gdXNpbmcgY29uc3QgY2hhcltdLCBwcm9ibGVtIHJlcG9ydGVkIGJ5IERhdmlkIE1heHdlbGwuCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgY2hhcltBTlldIGFuZCBjb25zdCBjaGFyW0FOWV0uCgoyMDExLTAzLTE1OiB3c2Z1bHRvbgoJICAgIFtDI10gQXBwbHkgcGF0Y2ggIzMyMTI2MjQgZml4aW5nIHN0ZDo6bWFwIEtleXMgcHJvcGVydHkuCgoyMDExLTAzLTE0OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIG92ZXJsb2FkZWQgbWV0aG9kcy9mdW5jdGlvbnMgd2hlcmUgc29tZQoJICAgIHJldHVybiB2b2lkIGFuZCBvdGhlcnMgZG9uJ3QgLSB3aGV0aGVyIHRoaXMgd29ya2VkIG9yIG5vdCBkZXBlbmRlZAoJICAgIG9uIHRoZSBvcmRlciB0aGV5IHdlcmUgZW5jb3VudGVyZWQgaW4gKFNGIzMyMDgyOTkpLgoJCjIwMTEtMDMtMTM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBFeHRlbmRlZCBzdXBwb3J0IGZvciBDKysgbmFtZXNwYWNlcyAobnNwYWNlIGZlYXR1cmUpLgoKMjAxMS0wMy0xMjogb2xseQoJICAgIFtQSFBdIEZpeCBzaGFyaW5nIG9mIHR5cGUgaW5mb3JtYXRpb24gYmV0d2VlbiBtdWx0aXBsZSBTV0lHLXdyYXBwZWQKCSAgICBtb2R1bGVzIChTRiMzMjAyNDYzKS4KCjIwMTEtMDMtMDk6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRml4IFNGICMzMTk0Mjk0IC0gY29ybmVyIGNhc2UgYnVnIHdoZW4gJ05VTEwnIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgZm9yIGEgcHJpbWl0aXZlIHR5cGUgcGFyYW1ldGVyIGluIGEgbWV0aG9kIGRlY2xhcmF0aW9uLgoKMjAxMS0wMy0wNzogb2xseQoJICAgIFtQSFBdIERvbid0IHVzZSB6ZW5kX2Vycm9yX25vcmV0dXJuKCkgZm9yIGNhc2VzIHdoZXJlIHRoZSBmdW5jdGlvbgoJICAgIHJldHVybnMgdm9pZCAtIG5vdyB0aGlzIGlzc3VlIGNhbiBvbmx5IG1hdHRlciBpZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uCgkgICAgb3IgbWV0aG9kIHdoaWNoIGlzIGRpcmVjdGVkIGFuZCByZXR1cm5zIG5vbi12b2lkLgoKMjAxMS0wMy0wNjogb2xseQoJICAgIFtQSFBdIEFkZCBjYXN0cyB0byB0aGUgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZwoJICAgIGxvbmcgdG8gYXZvaWQgaXNzdWVzIHdoZW4gdGhleSBhcmUgdXNlZCB3aXRoIHNob3J0ZXIgdHlwZXMgdmlhCgkgICAgJWFwcGx5LgoKMjAxMS0wMy0wMjogd3NmdWx0b24KCSAgICBUZW1wbGF0ZWQgc21hcnQgcG9pbnRlcnMgb3ZlcmxvYWRlZCB3aXRoIGJvdGggY29uc3QgYW5kIG5vbiBjb25zdCBvcGVyYXRvci0+IGdlbmVyYXRlZCB1bmNvbXBpbGFibGUKCSAgICBjb2RlIHdoZW4gdGhlIHBvaW50ZWUgd2FzIGEgY2xhc3Mgd2l0aCBlaXRoZXIgcHVibGljIG1lbWJlciB2YXJpYWJsZXMgb3Igc3RhdGljIG1ldGhvZHMuCgkgICAgUmVncmVzc2lvbiBpbiAyLjAueCByZXBvcnRlZCBhcyB3b3JraW5nIGluIDEuMy40MCBieSB4YW50YXJlcyBvbiBzd2lnLXVzZXIgbWFpbGluZyBsaXN0LgoKVmVyc2lvbiAyLjAuMiAoMjAgRmVicnVhcnkgMjAxMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTEtMDItMTk6IHdzZnVsdG9uCgkgICAgW1BIUF0gQWRkIG1pc3NpbmcgSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaW4gdGhlIHR5cGVtYXBzLmkgbGlicmFyeQogICAgICAgICAgICBmb3IgcHJpbWl0aXZlIHJlZmVyZW5jZSB0eXBlcyBhcyB3ZWxsIGFzIHNpZ25lZCBjaGFyICogYW5kIGJvb2wgKi4KCjIwMTEtMDItMTk6IG9sbHkKCSAgICBbUEhQXSBBZGRyZXNzIGJ1ZyBpbiBQSFAgb24gc29tZSBwbGF0Zm9ybXMvYXJjaGl0ZWN0dXJlcyB3aGljaAoJICAgIHJlc3VsdHMgaW4gemVuZF9lcnJvcl9ub3JldHVybigpIG5vdCBiZWluZyBhdmFpbGFibGUgdXNpbmcKCSAgICBTV0lHX1pFTkRfRVJST1JfTk9SRVRVUk4gd2hpY2ggZGVmYXVsdHMgdG8gemVuZF9lcnJvcl9ub3JldHVybiBidXQKCSAgICBjYW4gYmUgb3ZlcnJpZGRlbiB3aGVuIGJ1aWxkaW5nIHRoZSBtb2R1bGUgYnkgcGFzc2luZwoJICAgIC1EU1dJR19aRU5EX0VSUk9SX05PUkVUVVJOPXplbmRfZXJyb3IgdG8gdGhlIGNvbXBpbGVyLiAgVGhpcyBtYXkKCSAgICByZXN1bHQgaW4gY29tcGlsZXIgd2FybmluZ3MsIGJ1dCBzaG91bGQgYXQgbGVhc3QgYWxsb3cgYSBtb2R1bGUKCSAgICB0byBiZSBidWlsdCBvbiB0aG9zZSBwbGF0Zm9ybXMvYXJjaGl0ZWN0dXJlcyAoU0YjMzE2NjQyMykuCgoyMDExLTAyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMxODQ1NDkgLSB2YXJhcmcgZnVuY3Rpb25zIGFuZCBmdW5jdGlvbiBvdmVybG9hZGluZyB3aGVuIHVzaW5nIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbi4KCjIwMTEtMDItMTg6IG9sbHkKCSAgICBbUEhQXSBBbiBvdmVybG9hZGVkIG1ldGhvZCB3aGljaCBjYW4gcmV0dXJuIGFuIG9iamVjdCBvciBhCgkgICAgcHJpbWl0aXZlIHR5cGUgbm8gbG9uZ2VyIGNhdXNlcyBTV0lHIHRvIHNlZ2ZhdWx0LiAgUmVwb3J0ZWQgYnkgUGF1bAoJICAgIENvbGJ5IGluIFNGIzMxNjg1MzEuCgoyMDExLTAyLTE4OiBvbGx5CgkgICAgW1BIUF0gRml4IGludmFsaWQgZXJhc2UgZHVyaW5nIGl0ZXJhdGlvbiBvZiBzdGQ6Om1hcCBpbiBnZW5lcmF0ZWQKCSAgICBkaXJlY3RvciBjb2RlLiAgUmVwb3J0ZWQgYnkgQ29yeSBCZW5uZXR0IGluIFNGIzMxNzU4MjAuCgoyMDExLTAyLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBQcmVwcm9jZXNzaW5nIG5vdyB3YXJucyBpZiBleHRyYSB0b2tlbnMgYXBwZWFyIGFmdGVyICNlbHNlIGFuZCAjZW5kLgoKMjAxMS0wMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNjUzMDkyIFByZXByb2Nlc3NvciBkb2VzIG5vdCBlcnJvciBvdXQgd2hlbiAjZWxpZiBpcyBtaXNzaW5nIGFuIGV4cHJlc3Npb24uCiAgICAgICAgICAgIFRoaXMgYW5kIG90aGVyIGNhc2VzIG9mIG1pc3NpbmcgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zIG5vdyByZXN1bHQgaW4gYW4gZXJyb3IuCgoyMDExLTAyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2NhbWxdIEFwcGx5IHBhdGNoICMzMTUxNzg4IGZyb20gSm9lbCBSZXltb250LiBCcmluZ3MgT2NhbWwgc3VwcG9ydCB1cCB0byBkYXRlIAogICAgICAgICAgICAodmVyIDMuMTEgYW5kIDMuMTIpLCBpbmNsdWRpbmcgc3RkOjpzdHJpbmcuCgoyMDExLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggIzMxNzYyNzQgZnJvbSBKYW1lcyBNYXN0ZXJzIC0gdHlwZWNoZWNrIHR5cGVtYXAgZm9yIHRpbWVfdC4KCjIwMTEtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzMTcxNzkzIGZyb20gc3phZ2VyIC0gcHJvdGVjdGVkIGRpcmVjdG9yIG1ldGhvZHMgZmFpbGluZyB3aGVuIC1mdmlydHVhbCBpcyB1c2VkLgoKMjAxMS0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTI3ODUyIC0gI2luY2x1ZGUgZGlyZWN0aXZlcyBkb24ndCBwcmVwcm9jZXNzIHRoZSBmaWxlIHBhc3NlZCB0byBpdC4gVGhlIGZpeCBpcyBmb3IKICAgICAgICAgICAgI2luY2x1ZGUgd2l0aCAtaW1wb3J0YWxsIG9yIC1pbmNsdWRlYWxsLCAlaW5jbHVkZSBhbmQgJWltcG9ydCwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgI2RlZmluZSBGSUxFTkFNRSAiYWJjLmgiCiAgICAgICAgICAgICAgJWluY2x1ZGUgRklMRU5BTUUKCjIwMTEtMDItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTk0MDUzNiwgb3ZlcmFjdGl2ZSBwcmVwcm9jZXNzb3Igd2hpY2ggd2FzIGV4cGFuZGluZyBkZWZpbmVkKC4uLikgb3V0c2lkZSBvZiAjaWYgYW5kICNlbGlmCiAgICAgICAgICAgIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgW016U2NoZW1lXSBTRiAjMjk0Mjg5OSBBZGQgdXNlciBzdXBwbGllZCBkb2N1bWVudGF0aW9uIHRvIGhlbHAgZ2V0dGluZyBzdGFydGVkIHdpdGggTXpTY2hlbWUuCiAgICAgICAgICAgIFVwZGF0ZSBjaGFwdGVyIG5hbWUgdG8gTXpTY2hlbWUvUmFja2V0IGFjY291bnRpbmcgZm9yIHRoZSByZW5hbWUgb2YgTXpTY2hlbWUgdG8gUmFja2V0LgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTRiAjMzA4NTkwNiAtIFBvc3NpYmxlIGZpeCBydW5uaW5nIHRlc3Qtc3VpdGUgb24gTWFjIE9TWC4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMzMTczMzY3IEJldHRlciBpbmZvcm1hdGlvbiBkdXJpbmcgY29uZmlndXJlIGFib3V0IEJvb3N0IHByZXJlcXVpc2l0ZSBmb3IgcnVubmluZwogICAgICAgICAgICB0aGUgdGVzdC1zdWl0ZS4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMzMTI3NjMzIEZpeCBpbmZpbml0ZSBsb29wIGluIHJlY3Vyc2l2ZSB0eXBlZGVmIHJlc29sdXRpb24uCgoyMDExLTAyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gU0YgIzMxNjg2NzYgRml4ICVyZW5hbWUgbm90IHdvcmtpbmcgZm9yIG1lbWJlciB2YXJpYWJsZXMgYW5kIG1ldGhvZHMuCgoyMDExLTAyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbY2xpc3BdIFNGICMzMTQ4MjAwIEZpeCBzZWdmYXVsdCBwYXJzaW5nIG5lc3RlZCB1bmlvbnMuCgoyMDExLTAyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIERpcmVjdG9ycyAtIGEgY2FsbCB0byBhIG1ldGhvZCBiZWluZyBkZWZpbmVkIGluIHRoZSBiYXNlIGNsYXNzLCBub3QKICAgICAgICAgICAgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzLCBidXQgYWdhaW4gb3ZlcnJpZGRlbiBpbiBhIGNsYXNzIGRlcml2ZWQgZnJvbQogICAgICAgICAgICB0aGUgZmlyc3Qgc3ViY2xhc3Mgd2FzIG5vdCBiZWluZyBkaXNwYXRjaGVkIGNvcnJlY3RseSB0byB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzLgogICAgICAgICAgICBTZWUgZGlyZWN0b3JfYWx0ZXJuYXRpbmcuaSBmb3IgYW4gZXhhbXBsZS4KCjIwMTEtMDItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQW55ICd1c2luZycgc3RhdGVtZW50cyBpbiB0aGUgcHJvdGVjdGVkIHNlY3Rpb24gb2YgYSBjbGFzcyB3ZXJlIHByZXZpb3VzbHkKICAgICAgICAgICAgaWdub3JlZCB3aXRoIGRpcmVjdG9yIHByb3RlY3RlZCAoZGlycHJvdCkgbW9kZS4KCjIwMTEtMDEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvdmVybG9hZGluZyB3aXRoIGNvbnN0IHBvaW50ZXIgcmVmZXJlbmNlIChTV0lHVFlQRSAqY29uc3QmKSBwYXJhbWV0ZXJzIGZvciBhCiAgICAgICAgICAgIG51bWJlciBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLgoKMjAxMS0wMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgTmV3IHdhcm5pbmcgZm9yIHNtYXJ0IHBvaW50ZXJzIGlmIG9ubHkgc29tZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgaW5oZXJpdGFuY2UKICAgICAgICAgICAgY2hhaW4gYXJlIG1hcmtlZCBhcyBzbWFydCBwb2ludGVyLCBlZywgJXNoYXJlZF9wdHIgc2hvdWxkIGJlIHVzZWQgZm9yIGFsbCBjbGFzc2VzCiAgICAgICAgICAgIGluIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgc28gdGhpcyBuZXcgd2FybmluZyBoaWdobGlnaHRzIGNvZGUgd2hlcmUgdGhpcyBpcwogICAgICAgICAgICBub3QgdGhlIGNhc2UuCgogICAgICAgICAgICAgIGV4YW1wbGUuaToxMjogV2FybmluZyA1MjA6IEJhc2UgY2xhc3MgJ0EnIG9mICdCJyBpcyBub3Qgc2ltaWxhcmx5IG1hcmtlZCBhcyBhIHNtYXJ0IHBvaW50ZXIuCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjE2OiBXYXJuaW5nIDUyMDogRGVyaXZlZCBjbGFzcyAnQycgb2YgJ0InIGlzIG5vdCBzaW1pbGFybHkgbWFya2VkIGFzIGEgc21hcnQgcG9pbnRlci4KCjIwMTEtMDEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHNvbWUgbWlzc2luZyBtdWx0aS1hcmd1bWVudCB0eXBlbWFwczogKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgYW5kIAogICAgICAgICAgICAoY2hhciAqU1RSSU5HLCBpbnQgTEVOR1RIKS4gRG9jdW1lbnRhdGlvbiBmb3IgdGhpcyB1cGRhdGVkLiBKYXZhIHBhdGNoIGZyb20KICAgICAgICAgICAgVm9sa2VyIEdyYWJzY2guCgoyMDExLTAxLTExOiBpYW50CgkgICAgUmVxdWlyZSBHbyB2ZXJzaW9uIDcwNzcgb3IgbGF0ZXIuCgoyMDEwLTEyLTMwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbQyMsIEQsIEphdmFdIENoZWNrIGZvciBjb2xsaXNpb24gb2YgcGFyYW1ldGVyIG5hbWVzIHdpdGggdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlIGtleXdvcmRzIHdoZW4gZ2VuZXJhdGluZyB0aGUgZGlyZWN0b3IgZ2x1ZSBjb2RlLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlIHNpdHVhdGlvbiBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIGNvdWxkIHdvdWxkIHByZXZpb3VzbHkgYmUKICAgICAgICAgICAgaW52YWxpZCBpcyBpbGx1c3RyYXRlZCBpbiB0aGUgbmV3ICdkaXJlY3Rvcl9rZXl3b3JkcycgdGVzdCBjYXNlLgoKMjAxMC0xMi0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggJGNzaW5wdXQgc3BlY2lhbCB2YXJpYWJsZSBub3QgYmVpbmcgZXhwYW5kZWQgZm9yIGNzdmFyaW4gdHlwZW1hcHMKICAgICAgICAgICAgd2hlbiB1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzLiBSZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKMjAxMC0xMi0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICRiYXNlbWFuZ2xlIGV4cGFuc2lvbiBpbiBhcnJheSB0eXBlbWFwcy4gRm9yIGV4YW1wbGUgaWYgdHlwZSBpcyBpbnQgKlszXSwKICAgICAgICAgICAgJGJhc2VtYW5nbGUgZXhwYW5kcyB0byBfcF9pbnQuCgoyMDEwLTEyLTA3OiBpYW50CgkgICAgQ2hlY2sgdGhhdCB3ZSBhcmUgdXNpbmcgYSBzdWZmaWNpZW50bHkgbmV3IHZlcnNpb24gb2YgdGhlCgkgICAgNmcgb3IgOGcgR28gY29tcGlsZXIgZHVyaW5nIGNvbmZpZ3VyZSB0aW1lLiBJZiBub3QsIGRpc2FibGUgR28uCiAgICAgICAgICAgIE1pbmltdW0gdmVyc2lvbiBpcyBub3cgNjcwNy4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTEyLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMxMjczOTQgLSB1c2Ugb2YgbmV0d29yayBwYXRocyBvbiBXaW5kb3dzL01TeXMuCgoyMDEwLTExLTE4OiBrbGlja3ZlcmJvdAoJICAgIFtEXSBBZGRlZCB0aGUgRCBsYW5ndWFnZSBtb2R1bGUuCgoyMDEwLTExLTEyOiB2YWR6CgkgICAgRml4IGhhbmRsaW5nIG9mIG11bHRpcGxlIHJlZ2V4LXVzaW5nICVyZW5hbWVzIGF0dGFjaGVkIHRvIHRoZSBzYW1lCgkgICAgZGVjbGFyYXRpb24uIEZvciBleGFtcGxlLCBub3cKCgkgICAgICAlcmVuYW1lKCIlKHJlZ2V4Oi9eU2V0KC4qKS9wdXRcXDEvKXMiKSAiIjsKCSAgICAgICVyZW5hbWUoIiUocmVnZXg6L15HZXQoLiopL2dldFxcMS8pcyIpICIiOwoKCSAgICB3b3JrcyBhcyBleHBlY3RlZCB3aGVyZWFzIGJlZm9yZSBvbmx5IHRoZSBsYXN0IGFub255bW91cyByZW5hbWUgd2FzCgkgICAgdGFrZW4gaW50byBhY2NvdW50LgoKMjAxMC0xMC0xNzogZHJqb2UKCSAgICBbUl0gRml4IGZhaWx1cmUgaW4gb3ZlcmxvYWRlZCBmdW5jdGlvbnMgd2hpY2ggd2FzIGJyZWFraW5nCgkgICAgUXVhbnRMaWItU1dJRwoKMjAxMC0xMC0xNDogb2xseQoJICAgIFtQSFBdIEFsbG93IGNvbXBpbGF0aW9uIG9uIG5vbi1jb25mb3JtaW5nIE1pY3Jvc29mdCBDKysgY29tcGlsZXJzCgkgICAgd2hpY2ggZG9uJ3QgYWNjZXB0OiByZXR1cm4gZnVuY3Rpb25fcmV0dXJuaW5nX3ZvaWQoKTsKCSAgICBSZXBvcnRlZCBieSBGcmFuayBWYW5kZW4gQmVyZ2hlbiBvbiB0aGUgU1dJRyBtYWlsaW5nIGxpc3QuCgoyMDEwLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSAoZ2xvYmFsIHNjb3BlKSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMi4wLjAsIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJlbiBXYWxrZXIuIFRoZSBtYW5nbGVkIHN5bWJvbCBuYW1lcyB3ZXJlIGluY29ycmVjdCwgc29tZXRpbWVzIHJlc3VsdGluZyBpbiB0eXBlcyBiZWluZwogICAgICAgICAgICBpbmNvcnJlY3RseSB0cmVhdGVkIGFzIG9wYXF1ZSB0eXBlcy4KCiAgICAgICAgICAgIEFsc28gZml4ZXMgIzI5NTg3ODEgYW5kIHNvbWUgb3RoZXIgdHlwZSBwcm9ibGVtcyBkdWUgdG8gYmV0dGVyIHR5cGVkZWYgcmVzb2x1dGlvbiwgZWcgCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQgKj46OnZhbHVlX3R5cGUgZGlkbid0IHJlc29sdmUgdG8gVCAqIHdoZW4gaXQgc2hvdWxkIGhhdmUuIFRoZSBtYW5nbGVkIHR5cGUKICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IFNXSUdUWVBFX3N0ZF9fdmVjdG9yVF9UZXN0X3Bfc3RkX19hbGxvY2F0b3JUX1Rlc3RfcF90X3RfX3ZhbHVlX3R5cGUgYW5kIG5vdwogICAgICAgICAgICBpdCBpcyBjb3JyZWN0bHkgU1dJR1RZUEVfcF9UZXN0LgoKVmVyc2lvbiAyLjAuMSAoNCBPY3RvYmVyIDIwMTApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMC0xMC0wMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzMwNjY5NTggZnJvbSBNaWthZWwgSm9oYW5zc29uIHRvIGZpeCBkZWZhdWx0IHNtYXJ0IHBvaW50ZXIKICAgICAgICAgICAgaGFuZGxpbmcgd2hlbiB0aGUgc21hcnQgcG9pbnRlciBjb250YWlucyBib3RoIGEgY29uc3QgYW5kIG5vbi1jb25zdCBvcGVyYXRvci0+LgoKMjAxMC0xMC0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIC1wY3JldmVyc2lvbiBvcHRpb24gdG8gZGlzcGxheSBQQ1JFIHZlcnNpb24gaW5mb3JtYXRpb24uCgoyMDEwLTEwLTAxOiBvbGx5CgkgICAgW1J1YnldIEF2b2lkIHNlZ2ZhdWx0IHdoZW4gYSBtZXRob2Qgbm9kZSBoYXMgbm8gcGFyZW50Tm9kZQoJICAgIChTRiMzMDM0MDU0KS4KCjIwMTAtMTAtMDE6IG9sbHkKCSAgICBbUHl0aG9uXSBBbGxvdyByZWluaXRpYWxpc2F0aW9uIHRvIHdvcmsgd2l0aCBhbiBlbWJlZGRlZCBQeXRob24KCSAgICBpbnRlcnByZXRlciAocGF0Y2ggZnJvbSBKaW0gQ2Fycm9sbCBpbiBTRiMzMDc1MTc4KS4KCjIwMTAtMDktMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQXBwbHkgcGF0Y2ggZnJvbSBUb21hcyBEaXJ2YW5hdXNrYXMgZm9yIHN0ZDo6bWFwIHdyYXBwZXJzIHRvIGF2b2lkCiAgICAgICAgICAgIHRocm93aW5nIGV4Y2VwdGlvbnMgd2l0aCBub3JtYWwgdXNhZ2Ugb2YgaXRlcmF0b3JzLgoKMjAxMC0wOS0yNzogb2xseQoJICAgIFtQeXRob25dIEltcHJvdmUgZXJyb3IgbWVzc2FnZSBnaXZlbiB3aGVuIGEgcGFyYW1ldGVyIG9mIHRoZSB3cm9uZwoJICAgIHR5cGUgaXMgcGFzc2VkIHRvIGFuIG92ZXJsb2FkZWQgbWV0aG9kIChTRiMzMDI3MzU1KS4KCjIwMTAtMDktMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IFNGIHBhdGNoICMzMDc1MTUwIC0gSmF2YSBkaXJlY3RvcnMgdXNpbmcgc3RhdGljIHZhcmlhYmxlcyBpbgogICAgICAgICAgICBuYW1lZCBuYW1lc3BhY2UuCgoyMDEwLTA5LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIGZpbGUgYW5kIGxpbmUgZXJyb3Ivd2FybmluZyByZXBvcnRpbmcgZml4ZXMgd2hlcmUgU1dJRyBtYWNyb3MKICAgICAgICAgICAgYXJlIHVzZWQgd2l0aGluIHt9IGJyYWNlcyAod2hlcmUgdGhlIHByZXByb2Nlc3NvciBleHBhbmRzIG1hY3JvcyksCiAgICAgICAgICAgIGZvciBleGFtcGxlIG1hY3JvcyB3aXRoaW4gJWlubGluZSB7Li4ufSBhbmQgJWZyYWdtZW50KC4uLikgey4uLn0KICAgICAgICAgICAgYW5kIG5lc3RlZCBzdHJ1Y3RzLgoKMjAxMC0wOS0xODogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBmaWxlIGFuZCBsaW5lIGVycm9yL3dhcm5pbmcgcmVwb3J0aW5nIGZpeGVzIGZvciB2YXJpb3VzIGluaGVyaXRlZAogICAgICAgICAgICBjbGFzcyBwcm9ibGVtcy4KCjIwMTAtMDktMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEEgbXVjaCBpbXByb3ZlZCBkZWJ1Z2dpbmcgb2YgU1dJRyBzb3VyY2UgZXhwZXJpZW5jZSBpcyBub3cgYXZhaWxhYmxlIGFuZAogICAgICAgICAgICBkb2N1bWVudGVkIGluIHRoZSAiRGVidWdnaW5nIFNXSUciIHNlY3Rpb24gaW4gdGhlIERvYy9EZXZlbC9pbnRlcm5hbHMuaHRtbAogICAgICAgICAgICBmaWxlLCBpbmNsdWRpbmcgYSBzd2lnLmRiZyBzdXBwb3J0IGZpbGUgZm9yIHRoZSBnZGIgZGVidWdnZXIuCgoyMDEwLTA5LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMvd2FybmluZ3Mgd2hlbiBhIG1hY3JvCiAgICAgICAgICAgIGRlZmluaXRpb24gZW5kcyB3aXRoICcvJyBhbmQgaXQgaXMgbm90IHRoZSBlbmQgb2YgYSBDIGNvbW1lbnQuCgoyMDEwLTA5LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMvd2FybmluZ3MgYWZ0ZXIgcGFyc2luZwogICAgICAgICAgICBtYWNybyBpbnZvY2F0aW9ucyB3aXRoIHBhcmFtZXRlcnMgZ2l2ZW4gb3ZlciBtb3JlIHRoYW4gb25lIGxpbmUuCgoyMDEwLTA5LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgZXh0cmFuZW91cyBleHRyYSBsaW5lIGluIHByZXByb2Nlc3NlZCBvdXRwdXQgYWZ0ZXIgaW5jbHVkaW5nIGZpbGVzCiAgICAgICAgICAgIHdoaWNoIHdvdWxkIHNvbWV0aW1lcyBsZWFkIHRvIGVycm9yL3dhcm5pbmcgbWVzc2FnZXMgdHdvIGxpbmVzIGFmdGVyIHRoZQogICAgICAgICAgICBlbmQgb2YgdGhlIGZpbGUuCgoyMDEwLTA5LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzIxNDk1MjMgLSBJbmNvcnJlY3QgbGluZSBudW1iZXIgcmVwb3J0aW5nIGluIGVycm9ycyBhZnRlciBwYXJzaW5nIG1hY3JvcwogICAgICAgICAgICBjb250YWluaW5nIEMrKyBjb21tZW50cy4KCjIwMTAtMDktMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgT1VUUFVUIHR5cGVtYXBzIChQYXRjaCBmcm9tIFJ5YW4gaW4gU0YjMzA1ODM5NCkuCgoyMDEwLTA5LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZXJyb25lb3VzIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBmb3IgbWFjcm8gZXhwYW5zaW9ucywgZm9yIGV4YW1wbGUsCiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlIG5vdyBwb2ludHMgdG8gaW5zdGFudGlhdGlvbiBvZiB0aGUgbWFjcm8sIGllIHRoZSBsYXN0IGxpbmUgaGVyZToKCiAgICAgICAgICAgICAgI2RlZmluZSBNQUNSTzIoYSwgYikgCgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk8xKE5BTUUpIE1BQ1JPMihOQU1FLDIsMykgCgogICAgICAgICAgICAgIE1BQ1JPMShhYmMpCgoyMDEwLTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXJzIGluIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIGZvciBwcmVwcm9jZXNzb3IgbWVzc2FnZXMgd2l0aGluCiAgICAgICAgICAgICVpbmxpbmUsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgI2RlZmluZSBGT09CQVIgMQogICAgICAgICAgICAgICNkZWZpbmUgRk9PQkFSICJoaSIKICAgICAgICAgICAgICAlfQoKMjAxMC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVycyBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyB3aGljaCB3ZXJlIGN1bXVsYXRpdmVseSBvbmUKICAgICAgICAgICAgbGVzcyB0aGFuIHRoZXkgc2hvdWxkIGhhdmUgYmVlbiBhZnRlciBwYXJzaW5nIGVhY2ggJWluY2x1ZGUvJWltcG9ydCAtIGJ1ZwogICAgICAgICAgICBpbnRyb2R1Y2VkIGluIHN3aWctMS4zLjMyLiBBbHNvIGZpeCBsaW5lIG51bWJlcnMgaW4gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgICAgd2hlbiBuZXcgbGluZSBjaGFyYWN0ZXJzIGFwcGVhciBiZXR3ZWVuIHRoZSAlaW5jbHVkZSAvICVpbXBvcnQgc3RhdGVtZW50IGFuZAogICAgICAgICAgICB0aGUgZmlsZW5hbWUuCgoyMDEwLTA4LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXIgYW5kIGZpbGUgbmFtZSByZXBvcnRpbmcgZm9yIHNvbWUgbWFjcm8gcHJlcHJvY2Vzc29yIHdhcm5pbmdzLgogICAgICAgICAgICBUaGUgbGluZSBudW1iZXIgb2YgdGhlIG1hY3JvIGFyZ3VtZW50IGhhcyBiZWVuIGNvcnJlY3RlZCBhbmQgdGhlIGxpbmUgbnVtYmVyCiAgICAgICAgICAgIG9mIHRoZSBzdGFydCBvZiB0aGUgbWFjcm8gaW5zdGVhZCBvZiBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBtYWNybyBpcyB1c2VkLgogICAgICAgICAgICBTb21lIGV4YW1wbGVzOgogICAgICAgICAgICAgIGZpbGUuaDoxMTogRXJyb3I6IElsbGVnYWwgbWFjcm8gYXJndW1lbnQgbmFtZSAnLi4nCiAgICAgICAgICAgICAgZmlsZS5oOjE5OiBFcnJvcjogTWFjcm8gJ0RVUExJQ0FURScgcmVkZWZpbmVkLAogICAgICAgICAgICAgIGZpbGUuaDoxNTogRXJyb3I6IHByZXZpb3VzIGRlZmluaXRpb24gb2YgJ0RVUExJQ0FURScuCiAgICAgICAgICAgICAgZmlsZS5oOjI1OiBFcnJvcjogVmFyaWFibGUtbGVuZ3RoIG1hY3JvIGFyZ3VtZW50IG11c3QgYmUgbGFzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgICBmaWxlLmg6MzI6IEVycm9yOiBJbGxlZ2FsIGNoYXJhY3RlciBpbiBtYWNybyBhcmd1bWVudCBuYW1lCiAgICAgICAgICAgICAgZmlsZS5pOjM3OiBFcnJvcjogTWFjcm8gJ1NJVCcgZXhwZWN0cyAyIGFyZ3VtZW50cwoKMjAxMC0wOC0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IF9fTElORV9fIGFuZCBfX0ZJTEVfXyBleHBhbnNpb24gcmVwb3J0ZWQgYnkgQ2FtaWxsZSBHaWxsb3QuIE1vc3RseSB0aGlzCiAgICAgICAgICAgIGRpZCBub3Qgd29yayBhdCBhbGwuIEFsc28gZml4ZXMgU0YgIzI4MjI4MjIuCgoyMDEwLTA4LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGNvcm5lciBjYXNlIG1hcnNoYWxsaW5nIG9mIGRvdWJsZXMgLSBlcnJubyB3YXMgbm90IGJlaW5nIGNvcnJlY3RseQogICAgICAgICAgICBzZXQgYmVmb3JlIGNhbGxpbmcgc3RydG9kIC0gcGF0Y2ggZnJvbSBKdXN0aW4gVmFsbG9uIC0gU0YgQnVnICMzMDM4OTM2LgoKMjAxMC0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IG1ha2UgZGlzdGNsZWFuIHdoZW4gc29tZSBvZiB0aGUgbW9yZSBvYnNjdXJlIGxhbmd1YWdlcyBhcmUgZGV0ZWN0ZWQgYnkKICAgICAgICAgICAgY29uZmlndXJlIC0gZml4ZXMgZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYuCgoyMDEwLTA3LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBSZXN0b3JlIGNvbmZpZ3VyaW5nIG91dCBvZiBzb3VyY2UgZm9yIHRoZSB0ZXN0LXN1aXRlIHNpbmNlIGl0IGJyb2tlIGluIDEuMy4zNy4KICAgICAgICAgICAgQXMgcHJldmlvdXNseSwgaWYgcnVubmluZyAnbWFrZSBjaGVjay10ZXN0LXN1aXRlJyBvdXQgb2Ygc291cmNlLCBpdCBuZWVkcyB0byBiZQogICAgICAgICAgICBkb25lIGJ5IGludm9raW5nIGNvbmZpZ3VyZSB3aXRoIGEgcmVsYXRpdmUgcGF0aC4gSW52b2tpbmcgY29uZmlndXJlIHdpdGggYW4KICAgICAgICAgICAgYWJzb2x1dGUgcGF0aCB3aWxsIG5vdCB3b3JrLiBSdW5uaW5nIHRoZSBmdWxsICdtYWtlIGNoZWNrJyBzdGlsbCBuZWVkcyB0byBiZQogICAgICAgICAgICBkb25lIGluIHRoZSBzb3VyY2UgdHJlZS4KCjIwMTAtMDctMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBmdW5jdGlvbiBwb2ludGVycyBhbmQgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIHJldHVybnMgYnkgcmVmZXJlbmNlLgoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIHRoZSBvbGQgZXhwZXJpbWVudGFsICJyeHNwZW5jZXIiIGVuY29kZXIgYW5kCiAgICAgICAgICAgICJbbm90XXJ4c21hdGNoIiBpbiAlcmVuYW1lIChzZWUgdGhlIDAxLzE2LzIwMDYgZW50cnkpLiBUaGUgbmV3IGFuZAogICAgICAgICAgICBvZmZpY2lhbGx5IHN1cHBvcnRlZCAicmVnZXgiIGVuY29kZXIgYW5kICJbbm90XXJlZ2V4bWF0Y2giIGNoZWNrcwogICAgICAgICAgICBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIChzZWUgdGhlIHR3byBwcmV2aW91cyBlbnRyaWVzKS4gUGxlYXNlCiAgICAgICAgICAgIHJlcGxhY2UgIiUocnhzcGVuY2VyOltwYXRdW3N1YnN0XSlzIiB3aXRoICIlKHJlZ2V4Oi9wYXQvc3Vic3QvKXMiCiAgICAgICAgICAgIHdoZW4gdXBncmFkaW5nLiBOb3RpY2UgdGhhdCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gcmVwbGFjZSB0aGUgYmFjay0KICAgICAgICAgICAgcmVmZXJlbmNlcyBvZiBmb3JtICJAMSIgd2l0aCB0aGUgbW9yZSBzdGFuZGFyZCAiXFwxIiBhbmQgbWF5IG5lZWQgdG8KICAgICAgICAgICAgYWRqdXN0IHlvdXIgcmVndWxhciBleHByZXNzaW9ucyBzeW50YXggYXMgdGhlIG5ldyByZWdleCBlbmNvZGVyIHVzZXMKICAgICAgICAgICAgUGVybC1jb21wYXRpYmxlIHN5bnRheCBhbmQgbm90IChleHRlbmRlZCkgUE9TSVggc3ludGF4IGFzIHRoZSBvbGQgb25lLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIEFkZCAicmVnZXhtYXRjaCIsICJyZWdleHRhcmdldCIgYW5kICJub3RyZWdleG1hdGNoIiB3aGljaCBjYW4gYmUKICAgICAgICAgICAgdXNlZCB0byBhcHBseSAlcmVuYW1lIGRpcmVjdGl2ZXMgdG8gdGhlIGRlY2xhcmF0aW9ucyBtYXRjaGluZyB0aGUKICAgICAgICAgICAgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbmx5LiBUaGUgZmlyc3QgdHdvIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGludGVyY2hhbmdlYWJseSwgYm90aCBvZiB0aGUgJXJlbmFtZXMgYmVsb3cgZG8gdGhlIHNhbWUgdGhpbmc6CgogICAgICAgICAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsIHJlZ2V4bWF0Y2gkbmFtZT0iT2xkJCIpICIiOwogICAgICAgICAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsIHJlZ2V4dGFyZ2V0PTEpICJPbGQkIjsKCiAgICAgICAgICAgIChuYW1lbHkgaWdub3JlIHRoZSBkZWNsYXJhdGlvbnMgaGF2aW5nICJPbGQiIHN1ZmZpeCkuCgogICAgICAgICAgICAibm90cmVnZXhtYXRjaCIgcmVzdHJpY3RzIHRoZSBtYXRjaCB0byBvbmx5IHRoZSBkZWNsYXJhdGlvbnMgd2hpY2gKICAgICAgICAgICAgZG8gbm90IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGUuZy4gaGVyZSBpcyBob3cgdG8gcmVuYW1lIHRvCiAgICAgICAgICAgIGxvd2VyIGNhc2UgdmVyc2lvbnMgYWxsIGRlY2xhcmF0aW9ucyBleGNlcHQgdGhvc2UgY29uc2lzdGluZyBmcm9tCiAgICAgICAgICAgIGNhcGl0YWwgbGV0dGVycyBvbmx5OgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiQobG93ZXJjYXNlKXMiLCBub3RyZWdleG1hdGNoJG5hbWU9Il5bQS1aXSskIikgIiI7CgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIEFkZCB0aGUgbmV3ICJyZWdleCIgZW5jb2RlciB0aGF0IGNhbiBiZSB1c2VkIGluICVyZW5hbWUsIGUuZy4KCiAgICAgICAgICAgICAgICAlcmVuYW1lKCJyZWdleDovKFxcdyspXyguKikvXFwyLyIpICIiOwoKICAgICAgICAgICAgdG8gcmVtb3ZlIGFueSBhbHBoYWJldGljYWwgcHJlZml4IGZyb20gYWxsIGlkZW50aWZpZXJzLiBUaGUgc3ludGF4CiAgICAgICAgICAgIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGlzIFBlcmwtbGlrZSBhbmQgUENSRSBsaWJyYXJ5CiAgICAgICAgICAgIChodHRwOi8vd3d3LnBjcmUub3JnLykgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhpcyBmZWF0dXJlIGJ1dCBub3RpY2UKICAgICAgICAgICAgdGhhdCBiYWNrc2xhc2hlcyBuZWVkIHRvIGJlIGVzY2FwZWQgYXMgdXN1YWwgaW5zaWRlIEMgc3RyaW5ncy4KCiAgICAgICAgICAgIE9yaWdpbmFsIHBhdGNoIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAxMC0wNy0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzMDI0ODc1IC0gc2hhcmVkX3B0ciBvZiBjbGFzc2VzIHdpdGggbm9uLXB1YmxpYyBkZXN0cnVjdG9ycy4gVGhpcyBhbHNvIGZpeGVzCiAgICAgICAgICAgIHRoZSAidW5yZWYiIGZlYXR1cmUgd2hlbiB1c2VkIG9uIGNsYXNzZXMgd2l0aCBub24tcHVibGljIGRlc3RydWN0b3JzLgoKMjAxMC0wNi0xNzogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBBZGQgdGhlIEdvIGxhbmd1YWdlIG1vZHVsZS4KCjIwMTAtMDYtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCBTV0lHX2x1YV9pc25pbHN0cmluZyBtdWx0aXBseSBkZWZpbmVkIHdoZW4gdXNpbmcgbXVsdGlwbGUKICAgICAgICAgICAgbW9kdWxlcyBhbmQgd3JhcHBpbmcgc3RyaW5ncy4gUGF0Y2ggZnJvbSAnTnVtYmVyIENydW5jaGVyJy4KCjIwMTAtMDYtMTA6IG9sbHkKCSAgICBbUEhQXSBGaXggZGlyZWN0b3JzIHRvIGNvcnJlY3RseSBjYWxsIGEgbWV0aG9kIHdpdGggaGFzIGEKCSAgICBkaWZmZXJlbnQgbmFtZSBpbiBQSFAgdG8gQysrICh3ZSB3ZXJlIGFsd2F5cyB1c2luZyB0aGUgQysrIG5hbWUKCSAgICBpbiB0aGlzIGNhc2UpLgoKMjAxMC0wNi0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVuY29tcGlsYWJsZSBjb2RlIHdoZW4gJXJlbmFtZSByZXN1bHRzIGluIHR3byBlbnVtIGl0ZW1zCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZS4gUmVwb3J0ZWQgYnkgVmFkaW0gWmVpdGxpbi4KClZlcnNpb24gMi4wLjAgKDIgSnVuZSAyMDEwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTAtMDYtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRCBtYWNybyB1c2VkIGluIHN0ZDo6dmVjdG9yIHRvIHdvcmsgd2l0aAogICAgICAgICAgICB0eXBlcyBjb250YWluaW5nIGNvbW1hcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRChzdGQ6OnBhaXI8IGRvdWJsZSwgc3RkOjpzdHJpbmcgPikKCjIwMTAtMDYtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBpbiBzdGRfc2hhcmVkX3B0ci5pIGZvciB3cmFwcGluZyBzdGQ6OnNoYXJlZF9wdHIuIFJlcXVpcmVzIHRoZSAlc2hhcmVkX3B0cgogICAgICAgICAgICBtYWNybyBsaWtlIGluIHRoZSBib29zdF9zaGFyZWRfcHRyLmkgbGlicmFyeS4gc3RkOjp0cjE6OnNoYXJlZF9wdHIgY2FuIGFsc28gYmUKICAgICAgICAgICAgd3JhcHBlZCBpZiB0aGUgZm9sbG93aW5nIG1hY3JvIGlzIGRlZmluZWQ6CgogICAgICAgICAgICAgICNkZWZpbmUgU1dJR19TSEFSRURfUFRSX1NVQk5BTUVTUEFDRSB0cjEKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX3NoYXJlZF9wdHIuaT4KCiAgICAgICAgICAgIHNoYXJlZF9wdHIgaXMgYWxzbyBkb2N1bWVudGVkIGluIExpYnJhcnkuaHRtbCBub3cuCgoyMDEwLTA1LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIGFiaWxpdHkgZm9yICR0eXBlbWFwIHNwZWNpYWwgdmFyaWFibGUgbWFjcm9zIHRvIGNhbGwgb3RoZXIgJHR5cGVtYXAKICAgICAgICAgICAgc3BlY2lhbCB2YXJpYWJsZSBtYWNyb3MsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIENDICJDQyIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIEJCICIkdHlwZW1hcChjc3R5cGUsIENDKSIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIEFBICIkdHlwZW1hcChjc3R5cGUsIEJCKSIKICAgICAgICAgICAgICB2b2lkIGhhaChBQSBhYSk7CgogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgQyMgc3RkOjp2ZWN0b3IgY29udGFpbmVycyBvZiBzaGFyZWRfcHRyIGFuZCAlc2hhcmVkX3B0ci4KCiAgICAgICAgICAgIEFsc28gYWRkZWQgZGlhZ25vc3RpY3MgZm9yICR0eXBlbWFwIHdpdGggLWRlYnVnLXRtc2VhcmNoLCBmb3IgZXhhbXBsZSwgdGhlCiAgICAgICAgICAgIGFib3ZlIGRpc3BsYXlzIGFkZGl0aW9uYWwgZGlhZ25vc3RpYyBsaW5lcyBzdGFydGluZyAiQ29udGFpbmluZzogIjoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM0OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IEFBIGFhCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQUEgYWEKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBBQQogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQUEKICAgICAgICAgICAgICAgIENvbnRhaW5pbmc6ICR0eXBlbWFwKGNzdHlwZSwgQkIpCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjMxOiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IEJCCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQkIKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIEJCCiAgICAgICAgICAgICAgICBDb250YWluaW5nOiAkdHlwZW1hcChjc3R5cGUsIENDKQogICAgICAgICAgICAgIGV4YW1wbGUuaToyOTogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdjc3R5cGUnIHR5cGVtYXAgZm9yOiBDQwogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IENDCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBDQwoKMjAxMC0wNS0yNjogb2xseQoJICAgIEZpeCAlYXR0cmlidXRlMnJlZiBub3QgdG8gcHJvZHVjZSBhIHN5bnRheCBlcnJvciBpZiB0aGUgbGFzdAoJICAgIGFyZ3VtZW50IChBY2Nlc3Nvck1ldGhvZCkgaXMgb21pdHRlZC4gIFBhdGNoIGZyb20gRGF2aWQgUGllcGdyYXMKCSAgICBpbiBTRiMyMjM1NzU2LgoKMjAxMC0wNS0yNjogb2xseQoJICAgIFtQSFBdIFdoZW4gdXNpbmcgJXRocm93cyBvciAlY2F0Y2hlcywgU1dJRy1nZW5lcmF0ZWQgUEhQNSB3cmFwcGVycwoJICAgIG5vdyB0aHJvdyBQSFAgRXhjZXB0aW9uIG9iamVjdHMgaW5zdGVhZCBvZiBnaXZpbmcgYSBQSFAgZXJyb3Igb2YKCSAgICB0eXBlIEVfRVJST1IuCgoJICAgIFRoaXMgY2hhbmdlIHNob3VsZG4ndCBjYXVzZSBpbmNvbXBhdGliaWxpdHkgaXNzdWVzLCBzaW5jZSB5b3UgY2FuJ3QKCSAgICBzZXQgYW4gZXJyb3IgaGFuZGxlciBmb3IgRV9FUlJPUiwgc28gcHJldmlvdXNseSBQSFAgd291bGQganVzdCBleGl0CgkgICAgd2hpY2ggYWxzbyBoYXBwZW5zIGZvciB1bmhhbmRsZWQgZXhjZXB0aW9ucy4gIFRoZSBiZW5lZml0IGlzIHlvdSBjYW4KCSAgICBub3cgY2F0Y2ggdGhlbSBpZiB5b3Ugd2FudCB0by4KCgkgICAgRml4ZXMgU0YjMjU0NTU3OCBhbmQgU0YjMjk1NTUyMi4KCjIwMTAtMDUtMjU6IG9sbHkKCSAgICBbUEhQXSBBZGQgbWlzc2luZyBkaXJlY3RvcmluIHR5cGVtYXAgZm9yIGNvbnN0IHN0ZDo6c3RyaW5nICYuCgkgICAgRml4ZXMgU0YjMzAwNjQwNCByZXBvcnRlZCBieSB0LUxlZ2lhdy4KCjIwMTAtMDUtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ICMyOTU3Mzc1IC0gU1dJR1N0cmluZ0hlbHBlciBhbmQgU1dJR0V4Y2VwdGlvbkhlbHBlciBub3QgYWx3YXlzIGJlaW5nCiAgICAgICAgICAgIGluaXRpYWxpemVkIGJlZm9yZSB1c2UgaW4gLk5FVCA0IGFzIHRoZSBjbGFzc2VzIHdlcmUgbm90IG1hcmtlZCBiZWZvcmVmaWVsZGluaXQuCiAgICAgICAgICAgIEEgc3RhdGljIGNvbnN0cnVjdG9yIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlcHJhZ21hKGNzaGFycCkgaW1jbGFzc2NvZGU9JXsKICAgICAgICAgICAgICAgIHN0YXRpYyAkaW1jbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIElmIHlvdSBoYWQgYWRkZWQgeW91ciBvd24gY3VzdG9tIHN0YXRpYyBjb25zdHJ1Y3RvciB0byB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzIGluCiAgICAgICAgICAgIHRoZSBzYW1lIHdheSBhcyBhYm92ZSwgeW91IHdpbGwgaGF2ZSB0byBtb2RpZnkgeW91ciBhcHByb2FjaCB0byB1c2Ugc3RhdGljIHZhcmlhYmxlCiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG9yIGRlZmluZSBTV0lHX0NTSEFSUF9OT19JTUNMQVNTX1NUQVRJQ19DT05TVFJVQ1RPUiAtIFNlZSBjc2hhcnBoZWFkLnN3Zy4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI0MDgyMzIuIEltcHJvdmUgc2hhcmVkX3B0ciBhbmQgaW50cnVzaXZlX3B0ciB3cmFwcGVycyBmb3IgY2xhc3NlcyBpbiBhbgogICAgICAgICAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIE5vIHNwZWNpYWwgdHJlYXRtZW50IGlzIG5lZWRlZCBmb3IgZGVyaXZlZCBjbGFzc2VzLgogICAgICAgICAgICBUaGUgcHJveHkgY2xhc3MgYWxzbyBubyBsb25nZXIgbmVlZHMgdG8gYmUgc3BlY2lmaWVkLCBpdCBpcyBhdXRvbWF0aWNhbGx5CiAgICAgICAgICAgIGRlZHVjZWQuIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZXByZWNhdGVkOgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCiAgICAgICAgICAgIGFuZCBoYXZlIGJlZW4gcmVwbGFjZWQgYnkKICAgICAgICAgICAgICAlc2hhcmVkX3B0cihUWVBFKQogICAgICAgICAgICBTaW1pbGFybHkgZm9yIGludHJ1c2l2ZV9wdHIgd3JhcHBlcnMsIHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgZGVwcmVjYXRlZDoKICAgICAgICAgICAgICBTV0lHX0lOVFJVU0lWRV9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgICBTV0lHX0lOVFJVU0lWRV9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQogICAgICAgICAgICBhbmQgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgICAgJWludHJ1c2l2ZV9wdHIoVFlQRSkKCjIwMTAtMDUtMjE6IG9sbHkKCSAgICBbUEhQXSBTdG9wIGdlbmVyYXRpbmcgYSBib2d1cyBsaW5lIG9mIGNvZGUgaW4gY2VydGFpbiBjb25zdHJ1Y3RvcnMuCgkgICAgVGhpcyB3YXMgbW9zdGx5IGhhcm1sZXNzLCBidXQgY2F1c2VkIGEgUEhQIG5vdGljZSB0byBiZSBpc3N1ZWQsIGlmCgkgICAgZW5hYmxlZCAoU0YjMjk4NTY4NCkuCgoyMDEwLTA1LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IG1lbWJlciBwb2ludGVycyBvbiA2NCBiaXQgcGxhdGZvcm1zLgoKMjAxMC0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIEMrKyBlbnVtIGJvb2xlYW4gdmFsdWVzIHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZjoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0geyBQTEFZID0gdHJ1ZSwgU1RPUCA9IGZhbHNlIH0gcGxheV9zdGF0ZTsKCjIwMTAtMDUtMTQ6IG9sbHkKCSAgICBbUEhQXSBGaXggd3JhcHBpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCB3YXMgcHJvZHVjaW5nCgkgICAgdW5jb21waWxhYmxlIGNvZGUgaW4gc29tZSBjYXNlcy4KCjIwMTAtMDUtMTI6IGRyam9lCgkgICAgW1JdIEFkZCB0d28gbW9yZSBjaGFuZ2VzIGZyb20gV2lsIE5vbGFuLiAgR2V0IGdhcmJhZ2UKCSAgICBjb2xsZWN0aW9uIHRvIHdvcmsuICBJbXBsZW1lbnQgbmV3ZnJlZQoKMjAxMC0wNS0wOTogZHJqb2UKICAgICAgICAgICAgRml4IGJ1ZyByZXBvcnRlZCBieSBXaWwgTm9sYW4gY2hhbmdlIGNyZWF0aW9uIG9mIHN0cmluZyBzbwogICAgICAgICAgICB0aGF0IFIgMi43LjArIGNhbiB1c2UgY2hhciBoYXNoZXMKCjIwMTAtMDUtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMyOTU1MTQ2IGZyb20gU2VyZ2V5IFNhdHNraXkgdG8gZml4IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgZGl2aWRlIGJ5CiAgICAgICAgICAgIG9wZXJhdG9yIGluIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uIGxpc3RzLgoKMjAxMC0wNS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1JdIE1lbW9yeSBsZWFrIGZpeCBoYW5kbGluZyBjb25zdCBzdGQ6OnN0cmluZyAmIGlucHV0cywgcmVwb3J0ZWQgYnkgV2lsbCBOb2xhbi4KCjIwMTAtMDUtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFR5cGVtYXAgbWF0Y2hpbmcgZW5oYW5jZW1lbnQgZm9yIG5vbi1kZWZhdWx0IHR5cGVtYXBzLiBQcmV2aW91c2x5IGFsbAogICAgICAgICAgICBxdWFsaWZpZXJzIHdlcmUgc3RyaXBwZWQgaW4gb25lIHN0ZXAsIG5vdyB0aGV5IGFyZSBzdHJpcHBlZCBvbmUgYXQgYSB0aW1lCiAgICAgICAgICAgIHN0YXJ0aW5nIHdpdGggdGhlIGxlZnQgbW9zdCBxdWFsaWZpZXIuIEZvciBleGFtcGxlLCBpbnQgY29uc3QqY29uc3QgCiAgICAgICAgICAgIGlzIGZpcnN0IHN0cmlwcGVkIHRvIGludCAqY29uc3QgdGhlbiBpbnQgKi4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTA0LTI1OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMyOTg1NjU1IC0gYnJva2VuIGNvbnN0cnVjdG9yIHJlbmFtaW5nLgoKMjAxMC0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgVHlwZW1hcCBmcmFnbWVudHMgYXJlIG5vdyBvZmZpY2lhbCBhbmQgZG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCAjMjA0ODA2NCBhbmQgIzI0MDgwMjAuCiAgICAgICAgICAgIEFwcGx5IFVidW50dSBwYXRjaCB0byBmaXggUnVieSBhbmQgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgd2l0aCAtbWluaGVyaXQuCiAgICAgICAgICAgIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3N3aWcxLjMvK2J1Zy81MjI4NzQKCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtNenNjaGVtZV0gQXBwbHkgVWJ1bnR1IHBhdGNoIHRvIGZpeCBzdGQ6Om1hcCB3cmFwcGVyczoKICAgICAgICAgICAgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2Uvc3dpZzEuMy8rYnVnLzIwMzg3NgoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzI5NTIzNzQgLSBmaXggZGlyZWN0b3JzIGFuZCB0aGUgLW5vcnR0aSBvcHRpb24uCgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggIzI4ODcyNTQgYW5kICMyOTQ2MDMyIC0gU1dJR19MdWFfdHlwZW5hbWUgdXNpbmcgd3Jvbmcgc3RhY2sgaW5kZXguCgoyMDEwLTA0LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggZXhjZXB0aW9ucyBiZWluZyB0aHJvd24gd2l0aCB0aGUgLXRocmVhZHMgb3B0aW9uIGJhc2VkIG9uIHBhdGNoIGZyb20gQXJ0byBWdW9yaS4KICAgICAgICAgICAgRml4ZXMgYnVnICMyODE4NDk5LgoKMjAxMC0wNC0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IE1ha2VmaWxlIHRhcmdldHM6IGRpc3RjbGVhbiBhbmQgbWFpbnRhaW5lci1jbGVhbgoKMjAxMC0wNC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4IGNoYXIgcG9pbnRlcnMsIHdjaGFyX3QgcG9pbnRlcnMgYW5kIGNoYXIgYXJyYXlzIHNvIHRoYXQgbmlsIGNhbiBiZSBwYXNzZWQgYXMgYQogICAgICAgICAgICB2YWxpZCB2YWx1ZS4gQnVnIHJlcG9ydGVkIGJ5IEdlZGFsaWEgUGFzdGVybmFrLgoKMjAxMC0wNC0wMTogd3NmdWx0b24KICAgICAgICAgICAgTnVtZXJvdXMgc3VidGxlIHR5cGVtYXAgbWF0Y2hpbmcgcnVsZSBmaXhlcyB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0IHR5cGUuIFRoZSB0eXBlbWFwCiAgICAgICAgICAgIG1hdGNoaW5nIHJ1bGVzIGFyZSB0byB0YWtlIGEgdHlwZSBhbmQgZmluZCB0aGUgYmVzdCBkZWZhdWx0IHR5cGVtYXAgKFNXSUdUWVBFLCBTV0lHVFlQRSogZXRjKSwKICAgICAgICAgICAgdGhlbiBsb29rIGZvciB0aGUgbmV4dCBiZXN0IG1hdGNoIGJ5IHJlZHVjaW5nIHRoZSBjaG9zZW4gZGVmYXVsdCB0eXBlLiBUaGUgdHlwZSBkZWR1Y3Rpb24KICAgICAgICAgICAgbm93IGZvbGxvd3MgQysrIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gbWF0Y2hpbmcgcnVsZXMuCgogICAgICAgICAgICBCZWxvdyBhcmUgdGhlIHNldCBvZiBjaGFuZ2VzIG1hZGUgc2hvd2luZyB0aGUgZGVmYXVsdCB0eXBlIGRlZHVjdGlvbgogICAgICAgICAgICBhbG9uZyB3aXRoIHRoZSBvbGQgcmVkdWNlZCB0eXBlIGFuZCB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIHJlZHVjZWQgdHlwZToKCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAmW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICZbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKCYpW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqY29uc3QgW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0IFtBTlldCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAqY29uc3QgW0FOWV0KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgY29uc3QgKltBTlldCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgY29uc3QgKmNvbnN0ICYKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICpjb25zdCAmCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSBjb25zdCAqJgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCAqCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCAqCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqKgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCAmCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCAmCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqJgoKICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBhIGNvbnN0IFNXSUdUWVBFIGxvb2t1cCBpcyB1c2VkIG5vdyBmb3IgYW55IGNvbnN0YW50IHR5cGUuIFNvbWUgZXhhbXBsZXMsIHdoZXJlCiAgICAgICAgICAgIFQgaXMgc29tZSByZWR1Y2VkIHR5cGUsIGVnIGludCwgc3RydWN0IEZvbzoKCiAgICAgICAgICAgICAgICAgICBUIGNvbnN0CiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdAogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUKCiAgICAgICAgICAgICAgICAgICBUICpjb25zdAogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0CiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAqCgogICAgICAgICAgICAgICAgICAgVCBjb25zdFtdCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdFtdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRVtdCgogICAgICAgICAgICAgICAgICAgZW51bSBUIGNvbnN0CiAgICAgICAgICAgICAgbmV3OiBlbnVtIFNXSUdUWVBFIGNvbnN0CiAgICAgICAgICAgICAgb2xkOiBlbnVtIFNXSUdUWVBFCgogICAgICAgICAgICAgICAgICAgVCAoKmNvbnN0IClbXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKCpjb25zdCApW10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICgqKVtdCgogICAgICAgICAgICBSZW1pbmRlcjogdGhlIHR5cGVtYXAgbWF0Y2hpbmcgcnVsZXMgY2FuIG5vdyBiZSBzZWVuIGZvciBhbnkgdHlwZXMgYmVpbmcgd3JhcHBlZCBieSB1c2luZwogICAgICAgICAgICBlaXRoZXIgdGhlIC1kZWJ1Zy10bXNlYXJjaCBvciAtZGVidWctdG11c2VkIG9wdGlvbnMuCgogICAgICAgICAgICBJbiBwcmFjdGljZSB0aGlzIGxlYWRzIHRvIHNvbWUgc3VidGxlIG1hdGNoaW5nIHJ1bGUgY2hhbmdlcyBhbmQgdGhlIG1ham9yaXR5IG9mIHVzZXJzCiAgICAgICAgICAgIHdvbid0IG5vdGljZSBhbnkgY2hhbmdlcywgZXhjZXB0IGluIHRoZSBwcmltZSBhcmVhIG9mIG1vdGl2YXRpb24gZm9yIHRoaXMgY2hhbmdlOiBJbXByb3ZlCiAgICAgICAgICAgIFNUTCBjb250YWluZXJzIG9mIGNvbnN0IHBvaW50ZXJzIGFuZCBwYXNzaW5nIGNvbnN0IHBvaW50ZXJzIGJ5IHJlZmVyZW5jZS4gVGhpcyBpcyBmaXhlZAogICAgICAgICAgICBiZWNhdXNlIG1hbnkgb2YgdGhlIFNUTCBjb250YWluZXJzIHVzZSBhIHR5cGUgJ1QgY29uc3QmJyBhcyBwYXJhbWV0ZXJzIGFuZCB3aGVuIFQgaXMgCiAgICAgICAgICAgIGEgY29uc3QgcG9pbnRlciwgZm9yIGV4YW1wbGUsICdLIGNvbnN0KicsIHRoZW4gdGhlIGZ1bGwgdHlwZSBpcyAnSyBjb25zdCpjb25zdCYnLiBUaGlzCiAgICAgICAgICAgIG1lYW5zIHRoYXQgdGhlICdTV0lHVFlQRSAqY29uc3QmJyB0eXBlbWFwcyBub3cgbWF0Y2ggd2hlbiBUIGlzIGVpdGhlciBhIG5vbi1jb25zdCBvcgogICAgICAgICAgICBjb25zdCBwb2ludGVyLiBGdXJ0aGVybW9yZSwgc29tZSB0YXJnZXQgbGFuZ3VhZ2VzIGluY29ycmVjdGx5IGhhZCAnU1dJR1RZUEUgKiYnIHR5cGVtYXBzCiAgICAgICAgICAgIHdoZW4gdGhlc2Ugc2hvdWxkIGhhdmUgYmVlbiAnU1dJR1RZUEUgKmNvbnN0JicuIFRoZXNlIGhhdmUgYmVlbiBjb3JyZWN0ZWQgKEphdmEsIEMjLCBMdWEsIFBIUCkuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNvbWUgdmVyeSBvbGQgZGVwcmVjYXRlZCBwcmFnbWEgd2FybmluZ3MgYXJlIG5vdyBlcnJvcnMuCgoyMDEwLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBJbXByb3ZlIGhhbmRsaW5nIG9mIGZpbGUgbmFtZXMgYW5kIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgZG91YmxlL211bHRpcGxlIHBhdGggc2VwYXJhdG9ycy4KCjIwMTAtMDMtMTA6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBVc2UgZnVsbHkgcXVhbGlmaWVkIHN5bWJvbCBuYW1lIG9mIGNsOjppZGVudGl0eSBpbiBlbWl0X2RlZnVuKCkuCgoyMDEwLTAzLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gVGhlIGludGVybWVkaWFyeSBKTkkgY2xhc3MgbW9kaWZpZXJzIGFyZSBub3cgcHVibGljIGJ5IGRlZmF1bHQgbWVhbmluZyB0aGVzZQogICAgICAgICAgICBpbnRlcm1lZGlhcnkgbG93IGxldmVsIGZ1bmN0aW9ucyBhcmUgbm93IGFjY2Vzc2libGUgYnkgZGVmYXVsdCBmcm9tIG91dHNpZGUgYW55IHBhY2thZ2UKICAgICAgICAgICAgdXNlZC4gVGhlIHByb3h5IGNsYXNzIHBvaW50ZXIgY29uc3RydWN0b3IgYW5kIGdldENQdHIoKSBtZXRob2RzIGFyZSBhbHNvIG5vdyBwdWJsaWMuCiAgICAgICAgICAgIFRoZXNlIGFyZSBuZWVkZWQgaW4gb3JkZXIgZm9yIHRoZSBuc3BhY2Ugb3B0aW9uIHRvIHdvcmsgd2l0aG91dCBhbnkgb3RoZXIgbW9kcy4KICAgICAgICAgICAgVGhlIHByZXZpb3VzIGRlZmF1bHQgb2YgcHJvdGVjdGVkIGFjY2VzcyBjYW4gYmUgcmVzdG9yZWQgdXNpbmc6CgogICAgICAgICAgICAgIFNXSUdfSkFWQUJPRFlfTUVUSE9EUyhwcm90ZWN0ZWQsIHByb3RlY3RlZCwgU1dJR1RZUEUpCiAgICAgICAgICAgICAgJXByYWdtYShqYXZhKSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzID0gImNsYXNzIgoKMjAxMC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCB0aGUgbnNwYWNlIGZlYXR1cmUgZm9yIEMjLiBEb2N1bWVudGF0aW9uIGZvciB0aGUgbnNwYWNlIGZlYXR1cmUgaXMgbm93IGF2YWlsYWJsZS4KCjIwMTAtMDMtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBuc3BhY2UgZmVhdHVyZS4gVGhpcyBhZGRzIHNvbWUgaW1wcm92ZWQgbmFtZXNwYWNlIHN1cHBvcnQuIEN1cnJlbnRseSBvbmx5IEphdmEKICAgICAgICAgICAgaXMgc3VwcG9ydGVkIGZvciB0YXJnZXQgbGFuZ3VhZ2VzLCB3aGVyZSBDKysgbmFtZXNwYWNlcyBhcmUgYXV0b21hdGljYWxseSB0cmFuc2xhdGVkIGludG8KICAgICAgICAgICAgSmF2YSBwYWNrYWdlcy4gVGhlIGZlYXR1cmUgb25seSBhcHBsaWVzIHRvIGNsYXNzZXMsc3RydWN0LHVuaW9ucyBhbmQgZW51bXMgZGVjbGFyZWQgd2l0aGluCiAgICAgICAgICAgIGEgbmFtZXNwYWNlLiBNZXRob2RzIGFuZCB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gbmFtZXNwYWNlcyBzdGlsbCBlZmZlY3RpdmVseSBoYXZlIHRoZWlyCiAgICAgICAgICAgIG5hbWVzcGFjZXMgZmxhdHRlbmVkLiBFeGFtcGxlIHVzYWdlOgoKICAgICAgICAgICAgICAlZmVhdHVyZShuc3BhY2UpIE91dGVyOjpJbm5lcjE6OkNvbG9yOwogICAgICAgICAgICAgICVmZWF0dXJlKG5zcGFjZSkgT3V0ZXI6OklubmVyMjo6Q29sb3I7CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlciB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgSW5uZXIxIHsKICAgICAgICAgICAgICAgICAgc3RydWN0IENvbG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBJbm5lcjIgewogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29sb3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZvciBKYXZhLCB0aGUgLXBhY2thZ2Ugb3B0aW9uIGlzIGFsc28gcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgbnNwYWNlIGZlYXR1cmUuIFNheQogICAgICAgICAgICB3ZSB1c2UgLXBhY2thZ2UgY29tLm15Y28sIHRoZSB0d28gY2xhc3NlcyBjYW4gdGhlbiBiZSBhY2Nlc3NlZCBhcyBmb2xsb3dzIGZyb20gSmF2YToKCiAgICAgICAgICAgICAgY29tLm15Y28uT3V0ZXIuSW5uZXIxLkNvbG9yIGFuZCBjb20ubXljby5PdXRlci5Jbm5lcjIuQ29sb3IuCgoyMDEwLTAyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBSZW1vdmUgLWRpcnZ0YWJsZSBmcm9tIHRoZSBvcHRpbWl6YXRpb25zIGluY2x1ZGVkIGJ5IC1PIGFzIGl0IHRoaXMgb3B0aW9uCiAgICAgICAgICAgIGN1cnJlbnRseSBsZWFkcyB0byBtZW1vcnkgbGVha3MgYXMgcmVwb3J0ZWQgYnkgSm9oYW4gQmxha2UuCgoyMDEwLTAyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBMaWNlbnNlIGNvZGUgY2hhbmdlczogU1dJRyBTb3VyY2UgaXMgR1BMLXYzIGFuZCBsaWJyYXJ5IGNvZGUgbGljZW5zZSBpcyBub3cgY2xlYXJlcgogICAgICAgICAgICBhbmQgaXMgcHJvdmlkZWQgdW5kZXIgYSB2ZXJ5IHBlcm1pc3NpdmUgbGljZW5zZS4gU2VlIGh0dHA6Ly93d3cuc3dpZy5vcmcvbGVnYWwuaHRtbC4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBIGZldyBmaXhlcyBmb3IgY29tcGlsaW5nIHVuZGVyIHJ1YnktMS45LnggaW5jbHVkaW5nIHBhdGNoIGZyb20gJ05pYmJsZScuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggZnJvbSBQYXRyaWNrIEJlbm5ldHQgdG8gZml4IFJBUlJBWV9MRU4gYW5kIFJBUlJBWV9QVFIgdXNhZ2UgZm9yIFJ1YnkgMS45LngKICAgICAgICAgICAgdXNlZCBpbiB2YXJpb3VzIFNUTCB3cmFwcGVycy4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4IGluY29ycmVjdCBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbCBuYW1lIGVycm9yIHdoZW4gYW4gZW51bSBpdGVtCiAgICAgICAgICAgIGFuZCBjbGFzcyBuYW1lIGhhdmUgdGhlIHNhbWUgbmFtZSwgYXMgcmVwb3J0ZWQgYnkgTmF0aGFuIEtyaWVnZXIuIEV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIFZlY3RvciB7fTsKICAgICAgICAgICAgICBuYW1lc3BhY2UgVGV4dCB7CiAgICAgICAgICAgICAgICBlbnVtIFByZWZlcmVuY2UgeyBWZWN0b3IgfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgb3RoZXIgaW5jb3JyZWN0IGNvcm5lciBjYXNlIHRhcmdldCBsYW5ndWFnZSBzeW1ib2wgbmFtZSBjbGFzaGVzLgoKMjAxMC0wMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSAtZGVidWctbHN5bWJvbHMgb3B0aW9uIGZvciBkaXNwbGF5aW5nIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgbGF5ZXIgc3ltYm9scy4KCjIwMTAtMDItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAtTU0gYW5kIC1NTUQgb3B0aW9ucyBvbiBXaW5kb3dzLiBUaGV5IHdlcmUgbm90IG9taXR0aW5nIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkgYXMKICAgICAgICAgICAgdGhleSBzaG91bGQgYmUuCgoyMDEwLTAyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE4MDczMjkgLSBXaGVuIE1ha2VmaWxlIGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZ2VuZXJhdGVkIHVzaW5nIHRoZSAtTSBmYW1pbHkgb2Ygb3B0aW9ucwogICAgICAgICAgICBvbiBXaW5kb3dzLCB0aGUgZmlsZSBwYXRocyBoYXZlIGJlZW4gY29ycmVjdGVkIHRvIHVzZSBzaW5nbGUgYmFja3NsYXNoZXMgcmF0aGVyIHRoYW4gZG91YmxlCiAgICAgICAgICAgIGJhY2tzbGFzaGVzIGFzIHBhdGggc2VwYXJhdG9ycy4KCjIwMTAtMDItMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjkxODkwMiAtIGxhbmd1YWdlIHNwZWNpZmljIGZpbGVzIG5vdCBiZWluZyBnZW5lcmF0ZWQgaW4gY29ycmVjdCBkaXJlY3Rvcnkgb24KICAgICAgICAgICAgV2luZG93cyB3aGVuIHVzaW5nIGZvcndhcmQgc2xhc2hlcyBmb3IgLW8sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiAtYysrIC1vIHN1YmRpcmVjdG9yeS90aGVpbnRlcmZhY2Vfd3JhcC5jcHAgc3ViZGlyZWN0b3J5L3RoZWludGVyZmFjZS5pCgoyMDEwLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI4OTQ0MDUgLSBhc3NlcnRpb24gd2hlbiB1c2luZyAteG1sb3V0LgoKMjAxMC0wMS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGVtYXAgbWF0Y2hpbmcgYnVnIHdoZW4gYSB0ZW1wbGF0ZWQgdHlwZSBoYXMgYSB0eXBlbWFwIGJvdGggc3BlY2lhbGl6ZWQgYW5kIG5vdAogICAgICAgICAgICBzcGVjaWFsaXplZC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBYWCB7IC4uLiB9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYWCAmICIuLi4iCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFhYPCBpbnQgPiAmICIuLi4iCgogICAgICAgICAgICByZXN1bHRlZCBpbiB0aGUgMm5kIHR5cGVtYXAgYmVpbmcgYXBwbGllZCBmb3IgYWxsIFQgaW4gWFg8IFQgPi4KCjIwMTAtMDEtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjkzMzEyOSAtIHR5cGVtYXBzIG5vdCBiZWluZyBmb3VuZCB3aGVuIHRoZSB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGlzIHVzZWQgdG8gZGVub3RlCiAgICAgICAgICAgIGdsb2JhbCBzY29wZSwgdGhlIHR5cGVtYXAgaXMgbm93IHVzZWQgaW4gc2l0dWF0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHt9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYICYgIi4uLiIKICAgICAgICAgICAgICB2b2lkIG0oY29uc3QgOjpYICYpOwoKICAgICAgICAgICAgYW5kIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHt9OwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCA6OlggJiAiLi4uIgogICAgICAgICAgICAgIHZvaWQgbShjb25zdCBYICYpOwoKMjAxMC0wMS0yMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSBkZW5vdGluZyBnbG9iYWwgc2NvcGUgcHJvYmxlbXMgaW4gdGhlIHR5cGVzIGdlbmVyYXRlZAogICAgICAgICAgICBpbnRvIHRoZSBDKysgbGF5ZXIuIFByZXZpb3VzbHkgdGhlIHVuYXJ5IHNjb3BlIG9wZXJhdG9yIHdhcyBkcm9wcGVkIGluIHRoZSBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICBpZiB0aGUgdHlwZSBoYWQgYW55IHNvcnQgb2YgcXVhbGlmaWVyLCBmb3IgZXhhbXBsZSB3aGVuIHVzaW5nIHBvaW50ZXJzLCByZWZlcmVuY2VzLCBsaWtlCiAgICAgICAgICAgIDo6Zm9vKiwgOjpmb28mLCBiYXI8IDo6Zm9vKiA+LgoKMjAxMC0wMS0xMzogb2xseQoJICAgIFtQSFBdIEFkZCBkYXRldGltZSB0byB0aGUgbGlzdCBvZiBQSFAgcHJlZGVmaW5lZCBjbGFzc2VzIChwYXRjaAoJICAgIGZyb20gRGF2aWQgRmxldGNoZXIgaW4gU0YjMjkzMTA0MikuCgoyMDEwLTAxLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBTbGlnaHQgY2hhbmdlIHRvIHdhcm5pbmcsIGVycm9yIGFuZCBkaWFnbm9zdGljIHJlcG9ydGluZy4gVGhlIHdhcm5pbmcgbnVtYmVyIGlzIG5vIAogICAgICAgICAgICBsb25nZXIgc2hvd24gd2l0aGluIGJyYWNrZXRzLiBUaGlzIGlzIHRvIGhlbHAgZGVmYXVsdCBwYXJzaW5nIG9mIHdhcm5pbmcgbWVzc2FnZXMgYnkKICAgICAgICAgICAgb3RoZXIgdG9vbHMsIHZpbSBvbiBVbml4IGluIHBhcnRpY3VsYXIuCgogICAgICAgICAgICBFeGFtcGxlIG9yaWdpbmFsIGRpc3BsYXkgdXNpbmcgLUZzdGFuZGFyZDoKICAgICAgICAgICAgICBleGFtcGxlLmk6MjA6IFdhcm5pbmcoNDAxKTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCJy4gSWdub3JlZC4KICAgICAgICAgICAgTmV3IGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pOjIwOiBXYXJuaW5nIDQwMTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCJy4gSWdub3JlZC4KCiAgICAgICAgICAgIEFsc28gc3VidGxlIGZpeCB0byAtRm1pY3Jvc29mdCBmb3JtYXQgYWRkaW5nIGluIG1pc3Npbmcgc3BhY2UuIEV4YW1wbGUgb3JpZ2luYWwgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmkoMjApOiBXYXJuaW5nKDQwMSk6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQmFzZScuIElnbm9yZWQuCiAgICAgICAgICAgIE5ldyBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaSgyMCkgOiBXYXJuaW5nIDQwMTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCYXNlJy4gSWdub3JlZC4KCjIwMTAtMDEtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBhIGZldyBpbmNvbnNpc3RlbmNpZXMgaW4gcmVwb3J0aW5nIG9mIGZpbGUvbGluZSBudW1iZXJpbmdzIGluY2x1ZGluZyBtb2RpZnlpbmcKICAgICAgICAgICAgdGhlIG92ZXJsb2FkIHdhcm5pbmdzIDUwOSwgNTEyLCA1MTYsIDQ3NCwgNDc1IHRvIG5vdyBiZSB0d28gbGluZSB3YXJuaW5ncy4KCjIwMTAtMDEtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmeSAtZGVidWctdGFncyBvdXRwdXQgdG8gdXNlIHN0YW5kYXJkIGZpbGUgbmFtZS9saW5lIHJlcG9ydGluZyBzbyB0aGF0IGVkaXRvcnMKICAgICAgICAgICAgY2FuIGVhc2lseSBuYXZpZ2F0ZSB0byB0aGUgYXBwcm9wcmlhdGUgbGluZXMuCiAgICAgICAgICAgIFdhcyB0eXBpY2FsbHk6CiAgICAgICAgICAgICAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAoL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWcuc3dnOjMxMikKICAgICAgICAgICAgICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlIC4gaW5jbHVkZSAoL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWd3YXJuaW5ncy5zd2c6MzkpCiAgICAgICAgICAgIG5vdzoKICAgICAgICAgICAgICAvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZy5zd2c6MzEyOiAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZQogICAgICAgICAgICAgIC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnd2FybmluZ3Muc3dnOjM5OiAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAuIGluY2x1ZGUKCjIwMTAtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBtaXNzaW5nIGZpbGUvbGluZSBudW1iZXJzIGZvciB0eXBlbWFwIHdhcm5pbmdzIGFuZCBpbiBvdXRwdXQgZnJvbSB0aGUKICAgICAgICAgICAtZGVidWctdG1zZWFyY2gvLWRlYnVnLXRtdXNlZCBvcHRpb25zLgoKMjAxMC0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHR5cGVtYXBzIHVzZWQgZGVidWdnaW5nIG9wdGlvbiAoLWRlYnVnLXRtdXNlZCkuIFdoZW4gdXNlZCBlYWNoIGxpbmUgZGlzcGxheXMKICAgICAgICAgICAgdGhlIHR5cGVtYXAgdXNlZCBmb3IgZWFjaCB0eXBlIGZvciB3aGljaCBjb2RlIGlzIGJlaW5nIGdlbmVyYXRlZCBpbmNsdWRpbmcgdGhlIGZpbGUKICAgICAgICAgICAgYW5kIGxpbmUgbnVtYmVyIHJlbGF0ZWQgdG8gdGhlIHR5cGUuIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBjb25kZW5zZWQgZm9ybSBvZiB0aGUKICAgICAgICAgICAgLWRlYnVnLXRtc2VhcmNoIG9wdGlvbi4gRG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0xMi0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlamF2YWV4Y2VwdGlvbiBhbmQgZGlyZWN0b3JzIHNvIHRoYXQgYWxsIHRoZSBhcHByb3ByaWF0ZSB0aHJvd3MgY2xhdXNlcyAKICAgICAgICAgICAgYXJlIGdlbmVyYXRlZC4gUHJvYmxlbSByZXBvcnRlZCBieSBQZXRlciBHcmVlbndvb2QuCgoyMDA5LTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgLWRlYnVnLXRtc2VhcmNoIG9wdGlvbiBmb3IgZGVidWdnaW5nIHRoZSB0eXBlbWFwIHBhdHRlcm4gbWF0Y2hpbmcgcnVsZXMuCiAgICAgICAgICAgIERvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMDktMTItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY3RhdmVdIFJlbW92ZSB0aGUgLWFwaSBvcHRpb24gYW5kIHVzZSB0aGUgbmV3IE9DVEFWRV9BUElfVkVSU0lPTl9OVU1CRVIKICAgICAgICAgICAgbWFjcm8gcHJvdmlkZWQgaW4gdGhlIG9jdGF2ZSBoZWFkZXJzIGZvciBkZXRlcm1pbmluZyB0aGUgYXBpIHZlcnNpb24gaW5zdGVhZC4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBbUnVieV0gSW1wcm92ZSBzdXBwb3J0IGZvciBSdWJ5IDEuOSB1bmRlciBHQ0MuICBBZGRyZXNzZXMgcGFydCBvZgoJICAgIFNGIzI4NTk2MTQuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgRml4IGhhbmRsaW5nIG9mIG1vZHVsbyBvcGVyYXRvciAoJSkgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMKCSAgICAoU0YjMjgxODU2MikuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgW1BIUF0gImVtcHR5IiBpcyBhIHJlc2VydmVkIHdvcmQgaW4gUEhQLCBzbyByZW5hbWUgZW1wdHkoKSBtZXRob2QKCSAgICBvbiBTVEwgY2xhc3NlcyB0byAiaXNfZW1wdHkoKSIgKHByZXZpb3VzbHkgdGhpcyB3YXMgYXV0b21hdGljYWxseQoJICAgIHJlbmFtZWQgdG8gImNfZW1wdHkoKSIpLgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0xMi0wMzogb2xseQoJICAgIFtQSFBdIEFkZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcsIGFuZCBmb3IKCSAgICBwb2ludGVyIHRvIG1ldGhvZC4KCjIwMDktMTItMDI6IG9sbHkKCSAgICBbUEhQXSBGaXggd2FybmluZyBhbmQgcmVuYW1lIG9mIHJlc2VydmVkIGNsYXNzIG5hbWUgdG8gYmUgY2FzZQoJICAgIGluc2Vuc2l0aXZlLgoKMjAwOS0xMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgUmV2ZXJ0IHN1cHBvcnQgZm9yICVleHRlbmQgYW5kIG1lbWJlcmluIHR5cGVtYXBzIGFkZGVkIGluIHN3aWctMS4zLjM5LiBUaGUKCSAgICBtZW1iZXJpbiB0eXBlbWFwcyBhcmUgaWdub3JlZCBhZ2FpbiBmb3IgbWVtYmVyIHZhcmlhYmxlcyB3aXRoaW4gYSAlZXh0ZW5kIGJsb2NrLgogICAgICAgICAgICBEb2N1bWVudGF0aW9uIGluY29uc2lzdGVuY3kgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAwOS0xMS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZ2VuZXJhdGVkIHF1b3Rpbmcgd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpIGZvciAKICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWVtYmVyIHZhcmlhYmxlcy4KCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBBOwogICAgICAgICAgICAgICVjc2NvbnN0KDEpIEE7CiAgICAgICAgICAgICAgc3RydWN0IFggewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgQSA9ICdBJzsgCiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4ICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkgZm9yIHN0YXRpYyBjb25zdCBtZW1iZXIgdmFyaWFibGVzIHRvCiAgICAgICAgICAgIHVzZSB0aGUgYWN0dWFsIGNvbnN0YW50IHZhbHVlIGlmIGl0IGlzIHNwZWNpZmllZCwgcmF0aGVyIHRoYW4gdGhlIEMrKyBjb2RlIHRvCiAgICAgICAgICAgIGFjY2VzcyB0aGUgbWVtYmVyLgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIEVOOwogICAgICAgICAgICAgICVjc2NvbnN0KDEpIEVOOwogICAgICAgICAgICAgIHN0cnVjdCBYIHsKICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgRU4gPSAyOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBDKysgbmVzdGVkIHR5cGVkZWYgY2xhc3NlcyBjYW4gbm93IGJlIGhhbmRsZWQgdG9vLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzdHJ1Y3QgT3V0ZXIgewogICAgICAgICAgICAgICAgdHlwZWRlZiBGb28geyB9IEZvb1R5cGVkZWYxLCBGb29UeXBlZGVmMjsKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0xODogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHdyYXBwZXJzIGZvciBDIG5lc3RlZCBzdHJ1Y3RzIGFyZSBub3cgZ2VuZXJhdGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIGRlY2xhcmVkIAogICAgICAgICAgICBpbiB0aGUgcGFyc2VkIGNvZGUuCgoyMDA5LTExLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzQ5MTQ3NiAtIG11bHRpcGxlIGRlY2xhcmF0aW9ucyBvZiBuZXN0ZWQgc3RydWN0cywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3RydWN0IE91dGVyIHsKICAgICAgICAgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgIGludCB2YWw7CiAgICAgICAgICAgICAgICB9IGlubmVyMSwgaW5uZXIyLCAqaW5uZXIzLCBpbm5lcjRbMV07CiAgICAgICAgICAgICAgfSBvdXRlcjsKCjIwMDktMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwYXJzaW5nIG9mIGVudW0gZGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZW51bSBBQkMgewogICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgIGIsCiAgICAgICAgICAgICAgICBjCiAgICAgICAgICAgICAgfSBBID0gYSwgKnBDID0gJkMsIGFycmF5WzNdID0ge2EsIGIsIGN9OwoKMjAwOS0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBhcnNpbmcgb2Ygc3RydWN0IGRlY2xhcmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN0cnVjdCBTIHsKICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICB9IGluc3RhbmNlID0geyAxMCB9OwoKMjAwOS0xMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTYwOTc3IC0gU3ludGF4IGVycm9yIHBhcnNpbmcgZGVyaXZlZCBuZXN0ZWQgY2xhc3MgZGVjbGFyYXRpb24gYW5kIG1lbWJlcgogICAgICAgICAgICB2YXJpYWJsZSBpbnN0YW5jZS4KCjIwMDktMTEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjMxMDQ4MyAtIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZiB3aXRoaW4gZXh0ZXJuICJDIiBibG9jay4KCjIwMDktMTEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2FnZSBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aXRoaW4gdGVtcGxhdGVkIGNsYXNzZXMgc28gdGhhdCBjb21waWxhYmxlIGNvZGUgCiAgICAgICAgICAgIGlzIGdlbmVyYXRlZC4KCjIwMDktMTEtMTM6IG9sbHkKCSAgICBbcGhwXSBGaXggcGxhY2Ugd2hlcmUgY2xhc3MgcHJlZml4IChhcyBzcGVjaWZpZWQgd2l0aCAtcHJlZml4KQoJICAgIHdhc24ndCBiZWluZyB1c2VkLiAgUGF0Y2ggZnJvbSBndmVyYnJ1Z2dlbiBpbiBTRiMyODkyNjQ3LgoKMjAwOS0xMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzYWdlIG9mIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHNvIHRoYXQgY29tcGlsYWJsZSBjb2RlIGlzIGdlbmVyYXRlZCAtIHRoZSBuZXN0ZWQKICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgaXMgbm93IHRyZWF0ZWQgbGlrZSBhIG5vcm1hbCBuZXN0ZWQgY2xhc3NlcywgdGhhdCBpcywgYXMgYW4gb3BhcXVlIHR5cGUKICAgICAgICAgICAgdW5sZXNzIHRoZSBuZXN0ZWR3b3JrYXJvdW5kIGZlYXR1cmUgaXMgdXNlZC4KCjIwMDktMTEtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlcGxhY2UgU1dJR1dBUk5fUEFSU0VfTkVTVEVEX0NMQVNTIHdpdGggU1dJR1dBUk5fUEFSU0VfTkFNRURfTkVTVEVEX0NMQVNTIGFuZAogICAgICAgICAgICBTV0lHV0FSTl9QQVJTRV9VTk5BTUVEX05FU1RFRF9DTEFTUyBmb3IgbmFtZWQgYW5kIHVubmFtZWQgbmVzdGVkIGNsYXNzZXMgcmVzcGVjdGl2ZWx5LgoKICAgICAgICAgICAgTmFtZWQgbmVzdGVkIGNsYXNzIGlnbm9yZWQgd2FybmluZ3MgY2FuIG5vdyBiZSBzdXBwcmVzc2VkIGJ5IG5hbWUgdXNpbmcgJXdhcm5maWx0ZXIsIGVnOgoKICAgICAgICAgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9QQVJTRV9OQU1FRF9ORVNURURfQ0xBU1MpIE91dGVyOjpJbm5lcjsKCiAgICAgICAgICAgIGJ1dCBjbGVhcmx5IHVubmFtZWQgbmVzdGVkIGNsYXNzZXMgY2Fubm90IGFuZCB0aGUgZ2xvYmFsIHN1cHByZXNzaW9uIGlzIHN0aWxsIHJlcXVpcmVkLCBlZzoKCiAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj1TV0lHV0FSTl9QQVJTRV9VTk5BTUVEX05FU1RFRF9DTEFTUwoKMjAwOS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG5lc3RlZHdvcmthcm91bmQgZmVhdHVyZSBhcyBhIHdheSB0byB1c2UgdGhlIGZ1bGwgZnVuY3Rpb25hbGl0eSBvZiBhIG5lc3RlZCBjbGFzcyAKICAgICAgICAgICAgKEMrKyBtb2RlIG9ubHkpLiBJdCByZW1vdmVzIHRoZSBuZXN0ZWQgY2xhc3MgZnJvbSBTV0lHJ3MgdHlwZSBpbmZvcm1hdGlvbiBzbyBpdCBpcyBhcyBpZiBTV0lHCiAgICAgICAgICAgIGhhZCBuZXZlciBwYXJzZWQgdGhlIG5lc3RlZCBjbGFzcy4gVGhlIGRvY3VtZW50ZWQgbmVzdGVkIGNsYXNzIHdvcmthcm91bmRzIHVzaW5nIGEgZ2xvYmFsCiAgICAgICAgICAgIGZha2UgY2xhc3Mgc3RvcHBlZCB3b3JraW5nIHdoZW4gU1dJRyB0cmVhdGVkIHRoZSBuZXN0ZWQgY2xhc3MgYXMgYW4gb3BhcXVlIHBvaW50ZXIsIGFuZAogICAgICAgICAgICB0aGlzIGZlYXR1cmUgcmV2ZXJ0cyB0aGlzIGJlaGF2aW91ci4gVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZCB3aXRoIGRldGFpbHMgb2YgaG93CiAgICAgICAgICAgIHRvIHVzZSBhbmQgaW1wbGVtZW50IGl0LCBzZWUgdGhlICJOZXN0ZWQgY2xhc3NlcyIgc2VjdGlvbiBpbiBTV0lHUGx1cy5odG1sLgoKMjAwOS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgVGhlcmUgd2VyZSBhIG51bWJlciBvZiBDKysgY2FzZXMgd2hlcmUgbmVzdGVkIGNsYXNzZXMvc3RydWN0cy91bmlvbnMgd2VyZSBiZWluZyBoYW5kbGVkCiAgICAgICAgICAgIGFzIGlmIEMgY29kZSB3YXMgYmVpbmcgcGFyc2VkIHdoaWNoIHdvdWxkIG9mdGVudGltZXMgbGVhZCB0byB1bmNvbXBpbGFibGUgY29kZSBhcyBhbgogICAgICAgICAgICBhdHRlbXB0IHdhcyBtYWRlIHRvIHdyYXAgdGhlIG5lc3RlZCBzdHJ1Y3RzIGxpa2UgaXQgaXMgZG9jdW1lbnRlZCBmb3IgQyBjb2RlLiBOb3cgYWxsCiAgICAgICAgICAgIG5lc3RlZCBzdHJ1Y3RzL2NsYXNzZXMvdW5pb25zIGFyZSBpZ25vcmVkIGluIEMrKyBtb2RlLCBhcyB3YXMgYWx3YXlzIGRvY3VtZW50ZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgIHRoZXJlIGlzIGFuIGltcHJvdmVtZW50IGFzIHVzYWdlIG9mIG5lc3RlZCBzdHJ1Y3RzL2NsYXNzZXMvdW5pb25zIGlzIG5vdyBhbHdheXMgdHJlYXRlZAogICAgICAgICAgICBhcyBhbiBvcGFxdWUgdHlwZSBieSBkZWZhdWx0LCByZXN1bHRpbmcgaW4gZ2VuZXJhdGVkIGNvZGUgdGhhdCBzaG91bGQgYWx3YXlzIGNvbXBpbGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMTEtMDk6IGRyam9lCgkgICAgRml4IFIgZm9yIC1mY29tcGFjdCBhbmQgYWRkIHN0ZF9tYXAuaQoKMjAwOS0xMS0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29uc2lzdGVuY3kgZm9yIG5lc3RlZCBzdHJ1Y3RzL3VuaW9ucy9jbGFzc2VzLiBVbmNvbXBpbGFibGUgY29kZSB3YXMgYmVpbmcKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5uZXIgc3RydWN0IGFuZCB1bmlvbiBkZWNsYXJhdGlvbnMgd2VyZSB1c2VkIGFzIHR5cGVzIHdpdGhpbiB0aGUKICAgICAgICAgICAgaW5uZXIgc3RydWN0LiBUaGUgaW5uZXIgc3RydWN0L3VuaW9uIGlzIG5vdyB0cmVhdGVkIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBtYWtpbmcgdGhlCiAgICAgICAgICAgIGJlaGF2aW91ciB0aGUgc2FtZSBhcyBhbiBpbm5lciBjbGFzcy4gKEMrKyBjb2RlKSwgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgSW5uZXJTdHJ1Y3QgeyBpbnQgeDsgfTsKICAgICAgICAgICAgICAgIElubmVyU3RydWN0KiBnZXRJbm5lclN0cnVjdCgpOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTA4OiB3c2Z1bHRvbgoJICAgIElnbm9yZWQgbmVzdGVkIGNsYXNzL3N0cnVjdCB3YXJuaW5ncyBub3cgZGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgaWdub3JlZCBjbGFzcy9zdHJ1Y3QuCgoyMDA5LTExLTA3OiB3c2Z1bHRvbgoJICAgIEJ1ZyAjMTUxNDY4MSAtIEZpeCBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aXRoaW4gYSBuYW1lc3BhY2UgZ2VuZXJhdGVkIHVuY29tcGlsYWJsZQogICAgICAgICAgICBjb2RlIGFuZCBpbnRyb2R1Y2VkIHN0cmFuZ2Ugc2lkZSBlZmZlY3RzIHRvIG90aGVyIHdyYXBwZXIgY29kZSBlc3BlY2lhbGx5IGNvZGUKICAgICAgICAgICAgYWZ0ZXIgdGhlIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzcy4gTm90ZSB0aGF0IG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIGFyZSBzdGlsbCBpZ25vcmVkLgoKMjAwOS0xMS0wNzogd3NmdWx0b24KCSAgICBBZGQgbmV3IGRlYnVnIG9wdGlvbnM6CiAgICAgICAgICAgICAgLWRlYnVnLXN5bXRhYnMgICAgLSBEaXNwbGF5IHN5bWJvbCB0YWJsZXMgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAtZGVidWctc3ltYm9scyAgICAtIERpc3BsYXkgdGFyZ2V0IGxhbmd1YWdlIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZXMKICAgICAgICAgICAgICAtZGVidWctY3N5bWJvbHMgICAtIERpc3BsYXkgQyBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGVzCgoyMDA5LTExLTAzOiB3c2Z1bHRvbgoJICAgIEZpeCBzb21lIHVzYWdlIG9mIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgZGVub3RpbmcgZ2xvYmFsIHNjb3BlLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIEFBIHsgLyogLi4uICovIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjpBQTsKCiAgICAgICAgICAgIGFuZCBidWcgIzE4MTY4MDIgLSBTd2lnVmFsdWVXcmFwcGVyIHNob3VsZCBiZSB1c2VkOgoKICAgICAgICAgICAgICBzdHJ1Y3QgQ0MgewogICAgICAgICAgICAgICAgQ0MoaW50KTsgLy8gbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgOjpDQyB4KCk7CgogICAgICAgICAgICBhbmQgaW4gdGVtcGxhdGUgcGFyYW1ldGVyIHNwZWNpYWxpemF0aW9uczoKCiAgICAgICAgICAgICAgc3RydWN0IFMge307CiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBYIHsgdm9pZCBhKCkge30gfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgWDxTPiB7IHZvaWQgYigpIHt9IH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKE15VENvbmNyZXRlKSBYPCA6OlMgPjsKCiAgICAgICAgICAgIHBsdXMgcHJvYmFibHkgc29tZSBvdGhlciBjb3JuZXIgY2FzZSB1c2FnZSBvZiA6Oi4KCjIwMDktMTEtMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggcG90ZW50aWFsIG1lbW9yeSBsZWFrIGluIGluaXRpYWxpc2F0aW9uIGNvZGUgZm9yIHRoZQoJICAgIGdlbmVyYXRlZCBtb2R1bGUuCgoyMDA5LTEwLTIzOiB3c2Z1bHRvbgoJICAgIEZpeCBzZWcgZmF1bHQgd2hlbiB1c2luZyBhIG5hbWVkIG5lc3RlZCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHVzaW5nICV0ZW1wbGF0ZShuYW1lKSAKICAgICAgICAgICAgd2l0aGluIGEgY2xhc3MuIEEgd2FybmluZyB0aGF0IHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGlzIG5vdyBpc3N1ZWQgcGx1cyBwcm9jZXNzaW5nIAogICAgICAgICAgICBjb250aW51ZXMgYXMgaWYgbm8gbmFtZSB3YXMgZ2l2ZW4uCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZpeCBzdGQ6OnZlY3Rvcjxjb25zdCBUKj4uIFRoaXMgd291bGQgcHJldmlvdXNseSBjb21waWxlLCBidXQgbm90IHJ1biBjb3JyZWN0bHkuCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIEZpeGVkIHByZXZpb3VzbHkgZmFpcmx5IHBvb3IgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhbmQgZXhwbGljaXQgCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uIHN1cHBvcnQuIE51bWVyb3VzIGJ1Z3MgaW4gdGhpcyBhcmVhIGhhdmUgYmVlbiBmaXhlZCBpbmNsdWRpbmc6CgogICAgICAgICAgICAtIFRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBpbXBsZW1lbnRlZCBmb3IgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMsIGVnIHRoaXMgbm93CiAgICAgICAgICAgICAgd29ya3M6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYICAgICAge307CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYPFQgKj4ge307CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoWDEpIFg8Y29uc3QgaW50ICo+OyAvLyBDaG9vc2VzIFQgKiBzcGVjaWFsaXphdGlvbgoKICAgICAgICAgICAgICBhbmQgbW9yZSBjb21wbGV4IGNhc2VzIHdpdGggbXVsdGlwbGUgcGFyYW1ldGVycyBhbmQgYSBtaXggb2YgdGVtcGxhdGUgYXJndW1lbnQKICAgICAgICAgICAgICBkZWR1Y3Rpb24gYW5kIGV4cGxpY2l0bHkgc3BlY2lhbGlzZWQgcGFyYW1ldGVycywgZWc6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBzdHJ1Y3QgVHdvUGFybSAgICAgICAgICAgICAgIHsgdm9pZCBhKCkge30gfTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMT4gICAgICAgICAgICAgIHN0cnVjdCBUd29QYXJtPFQxICosIGludCAqPiAgeyB2b2lkIGUoKSB7fSB9OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEUpIFR3b1Bhcm08aW50ICoqLCBpbnQgKj47CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIHByaW1hcnkgdGVtcGxhdGUgbXVzdCBub3cgYmUgaW4gc2NvcGUsIGxpa2UgaW4gQysrLCB3aGVuCiAgICAgICAgICAgIGFuIGV4cGxpY2l0IG9yIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMgaW5zdGFudGlhdGVkIHdpdGggJXRlbXBsYXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA5LTE0OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICVjc2F0dHJpYnV0ZXMgZm9yIGFkZGluZyBDIyBhdHRyaWJ1dGVzIHRvIGVudW0gdmFsdWVzLCBzZWUgZG9jcyBmb3IgZXhhbXBsZS4KCjIwMDktMDktMTE6IHdzZnVsdG9uCgkgICAgRml4IG1lbW1vdmUgcmVncmVzc2lvbiBpbiBjZGF0YS5pIGFzIHJlcG9ydGVkIGJ5IEFkcmlhYW4gUmVudGluZy4KCjIwMDktMDktMDc6IHdzZnVsdG9uCgkgICAgRml4IGNvbnN0YW50IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgPD0gb3IgPj0uCgoyMDA5LTA5LTAyOiB3c2Z1bHRvbgoJICAgIFRoZSBmb2xsb3dpbmcgb3BlcmF0b3JzIGluIGNvbnN0YW50IGV4cHJlc3Npb25zIG5vdyByZXN1bHQgaW4gdHlwZSBib29sIGZvciBDKysgCiAgICAgICAgICAgIHdyYXBwZXJzIGFuZCByZW1haW4gYXMgdHlwZSBpbnQgZm9yIEMgd3JhcHBlcnMsIGFzIHBlciBlYWNoIHN0YW5kYXJkOiAKCiAgICAgICAgICAgICAgJiYgfHwgPT0gIT0gPCA+IDw9ID49IChBY3R1YWxseSB0aGUgbGFzdCA0IGFyZSBzdGlsbCBicm9rZW4pLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgI2RlZmluZSBBIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBCIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBBX0VRX0IgIEEgPT0gQiAvLyBub3cgd3JhcHBlZCBhcyB0eXBlIGJvb2wgZm9yIEMrKwogICAgICAgICAgICAgICNkZWZpbmUgQV9BTkRfQiBBICYmIEIgLy8gbm93IHdyYXBwZWQgYXMgdHlwZSBib29sIGZvciBDKysKCjIwMDktMDktMDI6IHdzZnVsdG9uCgkgICAgRml4ICMyODQ1NzQ2LiB0cnVlIGFuZCBmYWxzZSBhcmUgbm93IHJlY29nbmlzZWQga2V5d29yZHMgKG9ubHkgd2hlbiB3cmFwcGluZyBDKyspLgogICAgICAgICAgICBDb25zdGFudHMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIGFyZSBub3cgd3JhcHBlZCAoYXMgdHlwZSBib29sKToKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyB0cnVlCiAgICAgICAgICAgICAgI2RlZmluZSBCQVIgRk9PICYmIGZhbHNlCgpWZXJzaW9uIDEuMy40MCAoMTggQXVndXN0IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUGVybF0gQWRkICIjdW5kZWYgZG9fZXhlYyIgdG8gb3VyIGNsZWFuIHVwIG9mIFBlcmwgZ2xvYmFsCgkgICAgbmFtZXNwYWNlIHBvbGx1dGlvbi4KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUEhQXSBGaXggdG8gd3JhcCBhIHJlc291cmNlIHJldHVybmVkIGJ5IF9fZ2V0KCkgaW4gYSBQSFAgb2JqZWN0IChTRiMyNTQ5MjE3KS4KCjIwMDktMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjc5NzQ4NSBBZnRlciBkb2luZyBhICdtYWtlIGNsZWFuJywgaW5zdGFsbCBmYWlscyBpZiB5b2RsMm1hbiBvciB5b2RsMmh0bWwgCiAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBDYXVnaHQgZXhjZXB0aW9ucyBkaXNwbGF5IHRoZSB0eXBlIG9mIHRoZSBDKysgZXhjZXB0aW9uIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgIGdlbmVyaWMgImMrKy1zaWRlIHRocmV3IGFuIGV4Y2VwdGlvbiIgbWVzc2FnZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBXaGVuICVjYXRjaGVzIGlzIHVzZWQsIGZpeCBzbyB0aGF0IGFueSBjbGFzc2VzIHNwZWNpZmllZCBpbiB0aGUgInRocm93cyIKICAgICAgICAgICAgYXR0cmlidXRlIG9mIHRoZSAidGhyb3dzIiB0eXBlbWFwIGFyZSBnZW5lcmF0ZWQgaW50byB0aGUgSmF2YSBtZXRob2QncyB0aHJvd3MgY2xhdXNlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZXhjZXB0aW9uIGhhbmRsaW5nIHdoZW4gJWNhdGNoZXMgaXMgdXNlZCwgcmVwb3J0ZWQgYnkgSnVhbiBNYW51ZWwgQWx2YXJlei4KCjIwMDktMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAldGVtcGxhdGUgc2VnIGZhdWx0IG9uIHNvbWUgY2FzZXMgb2Ygb3ZlcmxvYWRpbmcgdGhlIHRlbXBsYXRlZCBtZXRob2QuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBKYW4gS3VwZWMuCgoyMDA5LTA4LTE1OiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBBZGQgbnVtZXJvdXMgbWlzc2luZyB3cmFwcGVkIG1ldGhvZHMgZm9yIHN0ZDo6dmVjdG9yPGJvb2w+IHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgIGFzIHJlcG9ydGVkIGJ5IFlvdXNzZWYgSm9uZXMuCgoyMDA5LTA4LTE0OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBBZGQgU1dJR19Db252ZXJ0UHRyQW5kT3duKCkgbWV0aG9kIGludG8gdGhlIHJ1bnRpbWUgZm9yIHNtYXJ0IHBvaW50ZXIgCiAgICAgICAgICAgIG1lbW9yeSBvd25lcnNoaXAgY29udHJvbC4gc2hhcmVkX3B0ciBzdXBwb3J0IHN0aWxsIHRvIGJlIGFkZGVkLiBQYXRjaCBmcm9tIAogICAgICAgICAgICBEYXZpZCBGbGV0Y2hlci4KCjIwMDktMDgtMTQ6IG9sbHkKCSAgICBbUEhQXSBQSFA1IG5vdyB3cmFwcyBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcyBkb2N1bWVudGVkLgoKMjAwOS0wOC0xNDogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgUEhQICJjbGFzcyIgZXhhbXBsZSB0byB3b3JrIHdpdGggUEhQNSBhbmQgdXNlCgkgICAgbW9kZXJuIHdyYXBwaW5nIGZlYXR1cmVzLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBzdGQ6OnZlY3RvciB3cmFwcGVycyBvdmVyaGF1bC4gVGhleSBubyBsb25nZXIgcmVxdWlyZSB0aGUgCiAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX3ZlY3RvcigpIG1hY3JvLiBBZGRlZCB3cmFwcGVycyBmb3IgY2FwYWNpdHkoKSBhbmQgcmVzZXJ2ZSgpLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBBZGQgY29uc3QgcmVmZXJlbmNlIHR5cGVtYXBzLiBjb25zdCByZWZlcmVuY2UgcHJpbWl0aXZlIHR5cGVzIGFyZQogICAgICAgICAgICBub3cgcGFzc2VkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIHBvaW50ZXIgbGlrZSB0aGUgb3RoZXIgdGFyZ2V0IGxhbmd1YWdlcy4KCSAgICBGaXhlcyBTRiMyNTI0MDI5LgoKMjAwOS0wOC0wODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBNb3JlIHVzZXIgZnJpZW5kbHkgQXR0cmlidXRlRXJyb3IgaXMgcmFpc2VkIHdoZW4gdGhlcmUgYXJlCiAgICAgICAgICAgIG5vIGNvbnN0cnVjdG9ycyBnZW5lcmF0ZWQgZm9yIHRoZSBwcm94eSBjbGFzcyBpbiB0aGUgZXZlbnQgdGhhdCB0aGUKICAgICAgICAgICAgY2xhc3MgaXMgYWJzdHJhY3QgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBub3cgCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIC0gY2xhc3MgaXMgYWJzdHJhY3QiIHdoZXJlYXMgaWYgdGhlcmUgYXJlIG5vCiAgICAgICAgICAgIHB1YmxpYyBjb25zdHJ1Y3RvcnMgZm9yIGFueSBvdGhlciByZWFzb24gYW5kIHRoZSBjbGFzcyBpcyBub3QgYWJzdHJhY3QsCiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJlbWFpbnMKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQiLgogICAgICAgICAgICBbdGNsXSBTaW1pbGFybHkgZm9yIHRjbCB3aGVuIHVzaW5nIC1pdGNsLgoKMjAwOS0wOC0wNDogb2xseQoJICAgIFtQSFBdIEZpeCBnZW5lcmF0ZWQgY29kZSB0byB3b3JrIHdpdGggUEhQIDUuMy4KCjIwMDktMDgtMDQ6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gVmFyaW91cyBtYXRoZW1hdGljYWwgZnVuY3Rpb25zICh3aGljaCB3b3VsZCBjb25mbGljdAogICAgICAgICAgICB3aXRoIHRoZSBidWlsdC1pbiBQSFAgb25lcykgYXJlIG5vdyBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgYnkKICAgICAgICAgICAgYWRkaW5nIGEgJ2NfJyBwcmVmaXguCgoyMDA5LTA4LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSBzdGQ6OnZlY3RvcjxUPiBpbXBsZW1lbnRhdGlvbiBpcyBpbXByb3ZlZCBhbmQgbm93IHVzZXMgJHR5cGVtYXAgc3VjaAogICAgICAgICAgICB0aGF0IHRoZSBwcm94eSBjbGFzcyBmb3IgVCBubyBsb25nZXIgaGFzIHRvIGJlIHNwZWNpZmllZCBpbiBzb21lIG1hY3JvcwogICAgICAgICAgICBmb3IgY29ycmVjdCBDIyBjb21waWxhdGlvbjsgdGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQsIHdoZXJlCiAgICAgICAgICAgIENTVFlQRSB3YXMgdGhlIEMjIHR5cGUgZm9yIHRoZSBDKysgY2xhc3MgQ1RZUEU6CgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfU1BFQ0lBTElaRV9NSU5JTVVNKENTVFlQRSwgQ1RZUEUpCiAgICAgICAgICAgICAgdXNhZ2Ugc2hvdWxkIGJlIHJlbW92ZWQgYWx0b2dldGhlcgoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX1NQRUNJQUxJWkUoQ1NUWVBFLCBDVFlQRSkKICAgICAgICAgICAgICBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aDoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEKENUWVBFKQoKICAgICAgICAgICAgU29tZSBtb3JlIGRldGFpbHMgaW4gY3NoYXJwL3N0ZF92ZWN0b3IuaQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA3LTMxOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGluZGVudGF0aW9uIHNvIHRoYXQgd2UgZ2l2ZSBhIHVzZWZ1bCBlcnJvciBpZiB0aGUKCSAgICBtb2R1bGUgY2FuJ3QgYmUgbG9hZGVkLiAgUGF0Y2ggZnJvbSBHYWV0YW4gTGVobWFubiBpbiBTRiMyODI5ODUzLgoKMjAwOS0wNy0yOTogd3NmdWx0b24KICAgICAgICAgICAgQWRkICR0eXBlbWFwKG1ldGhvZCwgdHlwZWxpc3QpIHNwZWNpYWwgdmFyaWFibGUgbWFjcm8uIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIHRoZSBjb250ZW50cyBvZiBhIHR5cGVtYXAgdG8gYmUgaW5zZXJ0ZWQgd2l0aGluIGFub3RoZXIgdHlwZW1hcC4KICAgICAgICAgICAgRnVsbHkgZG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0wNy0yOTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBTdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcmUgbm93IHByZWZpeGVkIHdpdGggdGhlCiAgICAgICAgICAgIGNsYXNzIG5hbWUuIFRoaXMgYWxsb3dzIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIHdpdGggdGhlCiAgICAgICAgICAgIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgY2xhc3Nlcy4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgbWlzc2luZyBsb2NrcyB0byBzdGQ6Om1hcCB3cmFwcGVycy4gIFBhdGNoIGZyb20gCgkgICAgUGF1bCBIYW1wc29uIGluIFNGIzI4MTM4MzYuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIFBIUCBPVVRQVVQgdHlwZW1hcHMuICBSZXBvcnRlZCBieSBIaXRvc2hpCgkgICAgQW1hbm8gaW4gU0YjMjgyNjMyMi4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gUEhQIHJlc291cmNlIGRlc3RydWN0b3IgZm9yIGNsYXNzZXMKCSAgICB3aXRob3V0IGEgZGVzdHJ1Y3RvciBhbmQgbm9uLWNsYXNzIHR5cGVzLiAgUGF0Y2ggZnJvbSBIaXRvc2hpIEFtYW5vCgkgICAgaW4gU0YjMjgyNTMwMy4KCjIwMDktMDctMjg6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgd2FybmluZ3MgYWJvdXQgY2xhc2hlcyBiZXR3ZWVuIGlkZW50aWZpZXJzIGFuZCBQSFAKCSAgICBrZXl3b3JkcyBhbmQgYXV0b21hdGljIHJlbmFtaW5nIHRvIHdvcmsgd2l0aCB0aGUgUEhQNSBjbGFzcwoJICAgIHdyYXBwZXJzLiAgRml4ZXMgU0YjMTYxMzY3OS4KCjIwMDktMDctMjg6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gSWYgYSBtZW1iZXIgZnVuY3Rpb24gaXMgbm90IHB1YmxpYyBidXQgaXQgaGFzIGEgYmFzZQogICAgICAgICAgICB3aGljaCBpcyBwdWJsaWMsIHRoZW4gbm93IGEgd2FybmluZyBpcyBpc3N1ZWQgYW5kIHRoZSBtZW1iZXIKICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBiZSBwdWJsaWMsIGFzIFBIUCByZXF1aXJlcyB0aGlzLgoKMjAwOS0wNy0yMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBEaXJlY3RvciBzdXBwb3J0IGFkZGVkLgoKMjAwOS0wNy0xNTogb2xseQoJICAgIFtQZXJsXSBEb24ndCBzcGVjaWZ5IFBlcmwgcHJvdG90eXBlICIoKSIgZm9yIGEgY29uc3RydWN0b3Igd2l0aCBhCgkgICAgZGlmZmVyZW50IG5hbWUgdG8gdGhlIGNsYXNzLCBhcyBzdWNoIGNvbnN0cnVjdG9ycyBjYW4gc3RpbGwgdGFrZQoJICAgIHBhcmFtZXRlcnMuCgoyMDA5LTA3LTEyOiB4YXZpZXI5OAoJICAgIFtPY3RhdmVdIEFkZCBzdXBwb3J0IGZvciBPY3RhdmUgMy4yIEFQSQoKMjAwOS0wNy0wNTogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgbGlzdCBvZiBQSFAga2V5d29yZHMgLSAiY2Z1bmN0aW9uIiBpcyBubyBsb25nZXIgYQoJICAgIGtleXdvcmQgaW4gUEhQNSBhbmQgUEhQIDUuMyBhZGRlZCAiZ290byIsICJuYW1lc3BhY2UiLCAiX19ESVJfXyIsCgkgICAgYW5kICJfX05BTUVTUEFDRV9fIi4KCjIwMDktMDctMDM6IG9sbHkKCSAgICBbVGNsXSBUbyBjb21wbGVtZW50IFVTRV9UQ0xfU1RVQlMsIGFkZCBzdXBwb3J0IGZvciBVU0VfVEtfU1RVQlMKCSAgICBhbmQgU1dJR19UQ0xfU1RVQlNfVkVSU0lPTi4gIERvY3VtZW50IGFsbCB0aHJlZSBpbiB0aGUgVGNsIGNoYXB0ZXIKCSAgICBvZiB0aGUgbWFudWFsLiAgQmFzZWQgb24gcGF0Y2ggZnJvbSBTRiMyODEwMzgwIGJ5IENocmlzdGlhbgoJICAgIEdvbGx3aXR6ZXIuCgoyMDA5LTA3LTAyOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZGVkIGZhY3RvcnkuaSBmb3IgUEhQLCBzZWUgdGhlIGxpX2ZhY3RvcnkgdGVzdGNhc2UKICAgICAgICAgICAgZm9yIG1vcmUgaW5mbyBvbiBob3cgdG8gdXNlIGl0LgoKMjAwOS0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IC1XYWxsa3cgb3B0aW9uIGFzIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3ludGF4IGVycm9yIHdoZW4gYSBuZXN0ZWQgc3RydWN0IGNvbnRhaW5zIGEgY29tbWVudCBjb250YWluaW5nIGEgKiBmb2xsb3dlZCAKICAgICAgICAgICAgZXZlbnR1YWxseSBieSBhIC8uIFJlZ3Jlc3Npb24gZnJvbSAxLjMuMzcsIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFVua25vd24gcHJvcGVydGllcyBhcmUgbm8gbG9uZ2VyIGlnbm9yZWQgaW4gcHJveHkKICAgICAgICAgICAgY2xhc3Nlcy4KCjIwMDktMDctMDE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gRml4ZWQgJW5ld29iamVjdCBiZWhhdmlvdXIsIHByZXZpb3VzbHkgYW55IG1ldGhvZAogICAgICAgICAgICBtYXJrZWQgd2l0aCAlbmV3b2JqZWN0IHdhcyBoYW5kbGVkIGFzIGEgY29uc3RydWN0b3IuCgoyMDA5LTA2LTMwOiBvbGx5CgkgICAgW1J1YnldIFVuZGVmaW5lIGNsb3NlIGFuZCBjb25uZWN0IG1hY3JvcyBkZWZpbmVkIGJ5IFJ1YnkgQVBJCgkgICAgaGVhZGVycyBhcyB3ZSBkb24ndCBuZWVkIHRoZW0gYW5kIHRoZXkgY2FuIGNsYXNoIHdpdGggQysrIG1ldGhvZHMKCSAgICBiZWluZyB3cmFwcGVkLiAgUGF0Y2ggZnJvbSBWaXQgT25kcnVjaCBpbiBTRiMyODE0NDMwLgoKMjAwOS0wNi0yNjogb2xseQoJICAgIFtSdWJ5XSBGaXggdG8gaGFuZGxlIEZJWE5VTSB2YWx1ZXMgZ3JlYXRlciB0aGFuIE1BWElOVCBwYXNzZWQgZm9yIGEKCSAgICBkb3VibGUgcGFyYW1ldGVyLgoKMjAwOS0wNi0yNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgdGhlIGNvbXBhY3RkZWZhdWx0YXJncyBmZWF0dXJlIAogICAgICAgICAgICB3aGVyZSBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhbmQgaXMgYXNzaWduZWQgYSBkZWZhdWx0IHZhbHVlLiBUaGUgU3dpZ1ZhbHVlV3JhcHBlcgogICAgICAgICAgICB0ZW1wbGF0ZSB3b3JrYXJvdW5kIGZvciBhIG1pc3NpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBubyBsb25nZXIgdXNlZCBhcyB0aGUgY29kZSAKICAgICAgICAgICAgZ2VuZXJhdGVkIGRvZXMgbm90IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCgoyMDA5LTA2LTE2OiB3c2Z1bHRvbgoJICAgIFtKYXZhLEMjXSBGaXggZW51bSBtYXJzaGFsbGluZyB3aGVuICVpZ25vcmUgaXMgdXNlZCBvbiBvbmUgb2YgdGhlIGVudW0gaXRlbXMuCiAgICAgICAgICAgIEluY29ycmVjdCBlbnVtIHZhbHVlcyB3ZXJlIGJlaW5nIHBhc3NlZCB0byB0aGUgQysrIGxheWVyIG9yIGNvbXBpbGF0aW9uIGVycm9ycyByZXN1bHRlZC4KCjIwMDktMDYtMDI6IHRhbGJ5CgkgICAgW1BlcmxdIFJlc29sdmVkIHJlZmVyZW5jZS5pIG92ZXJsb2FkIHN1cHBvcnQgcHJvYmxlbQoJICAgIGlkZW50aWZpZWQgYnkgSm9obiBQb3Rvd3NreS4KCjIwMDktMDUtMjY6IHdzZnVsdG9uCgkgICAgW0MjXSBJbXByb3ZlZCBzdGQ6Om1hcCB3cmFwcGVycyBiYXNlZCBvbiBwYXRjaCBmcm9tIFl1dmFsIEJhcm9yLiBUaGUgQyMgcHJveHkKICAgICAgICAgICAgbm93IGltcGxlbWVudHMgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSURpY3Rpb25hcnk8Pi4KCgkgICAgVGhlc2Ugc3RkOm1hcCB3cmFwcGVycyBoYXZlIGEgbm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIG92ZXJoYXVsIHRvIG1ha2UgdGhlbQogICAgICAgICAgICBsaWtlIGEgLk5FVCBJRGljdGlvbmFyeS4gU29tZSBtZXRob2QgbmFtZXMgaGF2ZSBjaGFuZ2VkIGFzIGZvbGxvd2luZzoKICAgICAgICAgICAgICBzZXQgLT4gc2V0aXRlbSAodXNlIHRoaXNbXSBwcm9wZXJ0eSBub3cpCiAgICAgICAgICAgICAgZ2V0IC0+IGdldGl0ZW0gKHVzZSB0aGlzW10gcHJvcGVydHkgbm93KQogICAgICAgICAgICAgIGhhc19rZXkgLT4gQ29udGFpbnNLZXkKICAgICAgICAgICAgICBkZWwgLT4gUmVtb3ZlCiAgICAgICAgICAgICAgY2xlYXIgLT4gQ2xlYXIKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHVzZWQgZm9yIHN0ZDo6bWFwIHdyYXBwZXJzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIG5vIGxvbmdlciB3b3JrOgogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl9rZXkKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fdmFsdWUKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fYm90aAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA1LTIwOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZCB0aGUgJ3RoaXNvd24nIG1lbWJlciB0byBjbGFzc2VzLiBUaGUgdXNhZ2Ugb2YgaXQKICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIFB5dGhvbiB0aGlzb3duIG9uZTogaXQncyAxIGJ5IGRlZmF1bHQgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gc2V0IGl0IHRvIDAgaWYgeW91IHdhbnQgdG8gcHJldmVudCBmcmVlaW5nIGl0LiAoRm9yCiAgICAgICAgICAgIGV4YW1wbGUgdG8gcHJldmVudCBhIGRvdWJsZSBmcmVlLikKCjIwMDktMDUtMTQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIHdyb25nIHBvaW50ZXIgdmFsdWUgcmV0dXJuZWQgYnkgU3dpZ1B5T2JqZWN0X3JlcHIoKS4KCjIwMDktMDUtMTM6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBNaW5vciB0d2VhayB3aGVuIHdyYXBwaW5nIGluIC1ub2N3cmFwIG1vZGUuCgoyMDA5LTA1LTExOiB3c2Z1bHRvbgoJICAgIFtDI10gSW1wcm92ZWQgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb24gdGhlIEMjIHByb3h5IHNpZGUgZnJvbSBZdXZhbCBCYXJvci4gVGhlc2UKCSAgICBpbXBsZW1lbnQgSUxpc3Q8PiBpbnN0ZWFkIG9mIElFbnVtZXJhYmxlPD4gd2hlcmUgcG9zc2libGUuCgoyMDA5LTA0LTI5OiB3c2Z1bHRvbgoJICAgIFtKYXZhLCBDI10gQWRkIHRoZSAnbm90ZGVyaXZlZCcgYXR0cmlidXRlIHRvIHRoZSBqYXZhYmFzZSBhbmQgY3NiYXNlIHR5cGVtYXBzLgoJICAgIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgdHlwZW1hcCB3aWxsIG5vdCBhcHBseSB0byBjbGFzc2VzIHRoYXQgYXJlIGRlcml2ZWQKCSAgICBmcm9tIGEgQysrIGJhc2UgY2xhc3MsIGVnIAoJICAgICAgJXR5cGVtYXAoY3NiYXNlLCBub3RkZXJpdmVkPSIxIikgU1dJR1RZUEUgIkNvbW1vbkJhc2UiCgoyMDA5LTA0LTI5OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgYXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBHSUwgaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZQoJICAgIGtub3cgdGhhdCBpdCB3aWxsIGFscmVhZHkgYmUgbG9ja2VkLiAgVGhpcyBhdm9pZHMgc29tZSBkZWFkLWxvY2tzCgkgICAgd2l0aCBtb2RfcHl0aG9uIChkdWUgdG8gbW9kX3B5dGhvbiBidWdzIHdoaWNoIGFyZSBhcHBhcmVudGx5CgkgICAgdW5saWtlbHkgdG8gZXZlciBiZSBmaXhlZCksIGFuZCByZXN1bHRzIGluIHNtYWxsZXIgd3JhcHBlcnMgd2hpY2gKCSAgICBydW4gYSBsaXR0bGUgZmFzdGVyIChpbiB0ZXN0cyB3aXRoIFhhcGlhbiBvbiB4ODYtNjQgVWJ1bnR1IDkuMDQsCgkgICAgdGhlIHN0cmlwcGVkIHdyYXBwZXIgbGlicmFyeSB3YXMgMTElIHNtYWxsZXIgYW5kIHJhbiAyLjclIGZhc3RlcikuCgoyMDA5LTA0LTIxOiB3c2Z1bHRvbgoJICAgIFtDI10gRml4ICMyNzUzNDY5IC0gYm9vbCAmT1VUUFVUIGFuZCBib29sICpPVVRQVVQgdHlwZW1hcHMgaW5pdGlhbGlzYXRpb24uCgoyMDA5LTA0LTA5OiB3c2Z1bHRvbgoJICAgIEZpeCAjMjc0Njg1OCAtIEMgbWFjcm8gZXhwcmVzc2lvbiB1c2luZyBmbG9hdGluZyBwb2ludCBudW1iZXJzCgoyMDA5LTAzLTMwOiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlZmF1bHQgb3V0IHR5cGVtYXAgZm9yIGNoYXJbQU5ZXSBub3cgcmV0dXJucyB0aGUgc3RyaW5nIHVwIHRvIGEKCSAgICB6ZXJvIGJ5dGUsIG9yIHRoZSBlbmQgb2YgdGhlIGFycmF5IGlmIHRoZXJlIGlzIG5vIHplcm8gYnl0ZS4gIFRoaXMKCSAgICBpcyB0aGUgc2FtZSBhcyBQeXRob24gZG9lcywgYW5kIHNlZW1zIG1vcmUgZ2VuZXJhbGx5IHVzZWZ1bCB0aGFuCgkgICAgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBvZiByZXR1cm5pbmcgdGhlIHdob2xlIGNvbnRlbnRzIG9mIHRoZSBhcnJheQoJICAgIGluY2x1ZGluZyBhbnkgemVybyBieXRlcy4gIElmIHlvdSB3YW50IHRoZSBvbGQgYmVoYXZpb3VyLCB5b3UgY2FuIHByb3ZpZGUKCSAgICB5b3VyIG93biB0eXBlbWFwIHRvIGRvIHRoaXM6CgoJICAgICV0eXBlbWFwKG91dCkgY2hhciBbQU5ZXQoJICAgICV7CgkJUkVUVkFMX1NUUklOR0woJDEsICQxX2RpbTAsIDEpOwoJICAgICV9CgpWZXJzaW9uIDEuMy4zOSAoMjEgTWFyY2ggMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAzLTE5OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IHRoZSBtZW1vcnkgbGVhayByZWxhdGVkIHRvIFB5dGhvbiAzIHVuaWNvZGUgYW5kIEMgY2hhciogY29udmVyc2lvbiwKICAgICAgICAgICAgd2hpY2ggY2FuIGJlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBiZWZvcmUgdGhpcyBmaXg6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBmcm9tIGxpX2NzdHJpbmcgaW1wb3J0ICoKICAgICAgICAgICAgICAgICAgaT0wCiAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgICBpICs9IDEKICAgICAgICAgICAgICAgICAgICAgIG4gPSBzdHIoaSkqMTAKICAgICAgICAgICAgICAgICAgICAgIHRlc3QzKG4pCgogICAgICAgICAgICBUaGlzIGZpeCBhZmZlY3RlZCBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBzbyB5b3UgY2Fubm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoCiAgICAgICAgICAgIGEgbnVsbCBhbGxvYyBhbmQgbm9uLW51bGwgY3B0ciBhcmd1bWVudCBpbiBQeXRob24gMywgb3RoZXJ3aXNlIGEgcnVudGltZSBlcnJvcgogICAgICAgICAgICB3aWxsIGJlIHJhaXNlZC4KCjIwMDktMDMtMTg6IHdzZnVsdG9uCgkgICAgW0MjXSBzdGQ6OnZlY3RvcjxUPiB3cmFwcGVyIGltcHJvdmVtZW50cyBmb3IgLk5FVCAyIGFuZCBhbHNvIHByb3ZpZGluZyB0aGUKCSAgICBuZWNlc3NhcnkgbWFjaGluZXJ5IHRvIHVzZSB0aGUgc3RkOjp2ZWN0b3I8VD4gd3JhcHBlcnMgd2l0aCBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzIHN1Y2gKCSAgICBhcyBMSU5RIC0gdGhlIEMjIHByb3h5IGNsYXNzIG5vdyBkZXJpdmVzIGZyb20gSUVudW1lcmFibGU8Pi4gVGhlIGRlZmF1bHQgaXMgbm93IHRvIAoJICAgIGdlbmVyYXRlIGNvZGUgcmVxdWlyaW5nIC5ORVQgMiBhcyBhIG1pbmltdW0sIGFsdGhvdWdoIHRoZSBDIyBjb2RlIGNhbiBiZSBjb21waWxlZCAKCSAgICBmb3IgLk5FVCAxIGJ5IGRlZmluaW5nIHRoZSBTV0lHX0RPVE5FVF8xIEMjIHByZXByb2Nlc3NvciBjb25zdGFudC4gU2VlIHRoZSAKCSAgICBzdGRfdmVjdG9yLmkgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTAzLTEyOiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBGaXggIzI2NzY3MzggU1dJRyBnZW5lcmF0ZWQgc3ltYm9sIG5hbWUgY2xhc2hlcy4KCjIwMDktMDMtMDE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBTb21lIGZpeGVzIGZvciBQeXRob24gMy4wLjEgYW5kIGhpZ2hlciBzdXBwb3J0LiBJbiAzLjAuMSwgdGhlIEMgQVBJIGZ1bmN0aW9uCiAgICAgICAgICAgIFB5T2JqZWN0X0NvbXBhcmUgaXMgcmVtb3ZlZCwgc28gUHlPYmplY3RfUmljaENvbXBhcmVCb29sIGlzIHVzZWQgZm9yIHJlcGxhY2VtZW50LgogICAgICAgICAgICBTdHJ1Y3QgaW5pdGlsaXphdGlvbiBvZiBTd2lnUHlPYmplY3QgYW5kIFN3aWdQeU9iamVjdF9hc19udW1iZXIgY2hhbmdlZCB0byByZWZsZWN0CiAgICAgICAgICAgIHRoZSBkcm9wIG9mIHRwX2NvbXBhcmUgYW5kIG5iX2xvbmcuCgoyMDA5LTAzLTAxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1ODMxNjAuIE5vdyB0aGUgaW1wb3J0ZXIgaW4gUHl0aG9uIHNoYWRvdyB3cmFwcGVyIHRha2UgY2FyZSBvZiB0aGUKICAgICAgICAgICAgY2FzZSB0aGF0IG1vZHVsZSBhbHJlYWR5IGltcG9ydGVkIGF0IG90aGVyIHBsYWNlLgoKMjAwOS0wMi0yODogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNjM3MzUyLiBNb3ZlIHN0cnVjdCBkZWNsYXJhdGlvbiBvZiBTV0lHX21vZHVsZSBpbiBweWluaXQuc3dnIGJlZm9yZQogICAgICAgICAgICB0aGUgbWV0aG9kIGNhbGxzLCBzaW5jZSBzb21lIEMgY29tcGlsZXIgZG9uJ3QgYWxsb3cgZGVjbGFyYXRpb24gaW4gbWlkZGxlIG9mIGZ1bmN0aW9uCiAgICAgICAgICAgIGJvZHkuCgoyMDA5LTAyLTIxOiB3c2Z1bHRvbgoJICAgIFtBbGxlZ3JvY2xdIEZpeCBzZWcgZmF1bHQgd3JhcHBpbmcgc29tZSBjb25zdGFudCB2YXJpYWJsZSAoJWNvbnN0YW50KSB0eXBlcy4KCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgW0NGRkldIEZpeCBzZWcgZmF1bHRzIHdoZW4gZm9yICVleHRlbmQgYW5kIHVzaW5nIHN0YXRlbWVudHMuCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIEZpeCBTRiAjMjYwNTk1NTogLWNvIG9wdGlvbiB3aGljaCBicm9rZSBpbiAxLjMuMzcuIAoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBOZXcgJWluc2VydCgiYmVnaW4iKSBzZWN0aW9uIGFkZGVkLiBBbHNvIGNhbiBiZSB1c2VkIGFzICViZWdpbi4gVGhpcyBpcyBhIG5ldwoJICAgIGNvZGUgc2VjdGlvbiByZXNlcnZlZCBlbnRpcmVseSBmb3IgdXNlcnMgYW5kIHRoZSBjb2RlIHdpdGhpbiB0aGUgc2VjdGlvbiBpcyBnZW5lcmF0ZWQKCSAgICBhdCB0aGUgdG9wIG9mIHRoZSBDL0MrKyB3cmFwcGVyIGZpbGUgYW5kIHNvIHByb3ZpZGVzIGEgbWVhbnMgdG8gcHV0IGN1c3RvbSBjb2RlCgkgICAgaW50byB0aGUgd3JhcHBlciBmaWxlIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCgoyMDA5LTAyLTE3OiB3c2Z1bHRvbgoJICAgICdtYWtlIGNsZWFuLXRlc3Qtc3VpdGUnIHdpbGwgbm93IHJ1biBjbGVhbiBvbiBBTEwgbGFuZ3VhZ2VzLiBQcmV2aW91c2x5IGl0IG9ubHkKCSAgICByYW4gdGhlIGNvcnJlY3RseSBjb25maWd1cmVkIGxhbmd1YWdlcy4gVGhpcyB3YXkgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGNsZWFuIHVwCgkgICAgcHJvcGVybHkgYWZ0ZXIgcnVubmluZyAnbWFrZSBwYXJ0aWFsY2hlY2stdGVzdC1zdWl0ZScuCgoyMDA5LTAyLTE0OiB3c2Z1bHRvbgoJICAgIEV4dGVuZCBhdHRyaWJ1dGUgbGlicmFyeSBzdXBwb3J0IGZvciBzdHJ1Y3RzL2NsYXNzZXMgYW5kIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgdXNlCgkgICAgcGFzcy9yZXR1cm4gYnkgdmFsdWUgc2VtYW50aWNzLiBUd28gbmV3IG1hY3JvcyBhcmUgYXZhaWxhYmxlIGFuZCB1c2FnZSBpcyBpZGVudGljYWwKCSAgICB0byAlYXR0cmlidXRlLiBUaGVzZSBhcmUgJWF0dHJpYnV0ZXZhbCBmb3Igc3RydWN0cy9jbGFzc2VzIGFuZCAlYXR0cmlidXRlc3RyaW5nIGZvcgoJICAgIHN0cmluZyBjbGFzc2VzLCBsaWtlIHN0ZDo6c3RyaW5nLiBTZWUgYXR0cmlidXRlLnN3ZyBmb3IgbW9yZSBkZXRhaWxzLgoKMjAwOS0wMi0xMzogd3NmdWx0b24KCSAgICBBZGQgc3VwcG9ydCBmb3IgJWV4dGVuZCBhbmQgbWVtYmVyaW4gdHlwZW1hcHMuIFByZXZpb3VzbHkgdGhlIG1lbWJlcmluIHR5cGVtYXBzIHdlcmUKCSAgICBpZ25vcmVkIGZvciBtZW1iZXIgdmFyaWFibGVzIHdpdGhpbiBhICVleHRlbmQgYmxvY2suCgoyMDA5LTAyLTEyOiB3c2Z1bHRvbgoJICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZW1wb3JhcnkgdmFyaWFibGUgd2hlbiB3cmFwcGluZyByZXR1cm4gdmFsdWVzIHRoYXQgYXJlIHJlZmVyZW5jZXMuIAoJICAgIEV4YW1wbGUgb2YgZ2VuZXJhdGVkIGNvZGUgZm9yIHdyYXBwaW5nOgoKCSAgICAgIHN0cnVjdCBYWVogewoJCXN0ZDo6c3RyaW5nJiByZWZSZXR1cm4oKTsKCSAgICAgIH07CgoJICAgIHVzZWQgdG8gYmU6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmX3Jlc3VsdF9yZWYgPSAoYXJnMSktPnJlZlJldHVybigpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gKHN0ZDo6c3RyaW5nICopICZfcmVzdWx0X3JlZjsKICAgICAgICAgICAgICB9CgoJICAgICBOb3cgaXQgaXM6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICByZXN1bHQgPSAoc3RkOjpzdHJpbmcgKikgJihhcmcxKS0+cmVmUmV0dXJuKCk7CgoyMDA5LTAyLTA4OiBiaHkKICAgICAgICAgICAgQ2hhbmdlIHRoZSBTSVpFIG1hcHBlZCBieSAlcHlidWZmZXJfbXV0YWJsZV9iaW5hcnkgYW5kICVweWJ1ZmZlcl9iaW5hcnkgaW4gcHlidWZmZXIuaSBmcm9tCiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBidWZmZXIuCgoyMDA5LTAyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWZlYXR1cmUgbm90IHdvcmtpbmcgZm9yIGNvbnZlcnNpb24gb3BlcmF0b3JzLCByZXBvcnRlZCBieSBNYXR0IFNwcmFndWUsIGZvciBleGFtcGxlOgoJICAgICAgJWZlYXR1cmUoImNzOm1ldGhvZG1vZGlmaWVycyIpIG9wZXJhdG9yIGJvb2wgInByb3RlY3RlZCI7CgoyMDA5LTAyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpTY2hlbWVdIEFwcGx5ICMyMDgxOTY3IGNvbmZpZ3VyZSBjaGFuZ2VzIGZvciBleGFtcGxlcyB0byBidWlsZCB3aXRoIHJlY2VudCBQTFQgdmVyc2lvbnMuCgkgICAgQWxzbyBmaXhlcyBNYWtlZmlsZSBlcnJvcnMgYnVpbGRpbmcgU1dJRyBleGVjdXRhYmxlIHdoZW4gbXpzY2hlbWUgcGFja2FnZSBpcyBpbnN0YWxsZWQgCgkgICAgKHZlcnNpb24gMy43MiBhcHByb3ggYW5kIGxhdGVyKS4KCjIwMDktMDItMDQ6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBGaXggU0YjMjU2NDE5MiByZXBvcnRlZCBieSBEYXZpZCBLb2xvdnJhdG5rLgogICAgICAgICAgICBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBub3cgaGFuZGxlcyAiZ2V0IiBtYWdpYy4KClZlcnNpb24gMS4zLjM4ICgzMSBKYW51YXJ5IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTI0ODggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIE5vdyAlcHl0aG9ucHJlcGVuZAogICAgICAgICAgICBhbmQgJXB5dGhvbmFwcGVuZCBoYXZlIGNvcnJlY3QgaW5kZW50YXRpb24uCgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTIwNDggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIFRoZSBwYXJhbWV0ZXIgbGlzdAogICAgICAgICAgICBvZiBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGluIGdlbmVyYXRlZCBwcm94eSBjb2RlIHNob3VsZCBub3QgaGF2ZSB0aGUKICAgICAgICAgICAgJ3NlbGYnIHBhcmFtZXRlci4KCjIwMDktMDEtMjk6IHdzZnVsdG9uCgkgICAgRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAxLjMuMzcgd2hlcmUgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeQoJICAgIGZvciB0YXJnZXQgbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMgKGluIHRoZSBhYnNlbmNlIG9mIC1vdXRkaXIpIHdhcyBubwoJICAgIGxvbmdlciB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGdlbmVyYXRlZCBjL2MrKyBmaWxlLgoKMjAwOS0wMS0yODogd3NmdWx0b24KCSAgICBbSmF2YSwgQyNdIEZpeCBwcm94eSBjbGFzcyBub3QgYmVpbmcgdXNlZCB3aGVuIHRoZSBnbG9iYWwgc2NvcGUgb3BlcmF0b3IKCSAgICB3YXMgdXNlZCBmb3IgcGFyYW1ldGVycyBwYXNzZWQgYnkgdmFsdWUuIFJlcG9ydGVkIGJ5IERhdmlkIFBpZXBncmFzcy4KCjIwMDktMDEtMTU6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCBzZWcgZmF1bHQgd2hlbiBydW5uaW5nIHdpdGggLXYgb3B0aW9uLCByZXBvcnRlZCBieSBKb2huIEt5LgoKVmVyc2lvbiAxLjMuMzcgKDEzIEphbnVhcnkgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDEtMTM6IG1nb3NzYWdlCgkgICAgW0x1YV0gQWRkZWQgY29udHJhY3Qgc3VwcG9ydCBmb3IgcmVxdWlyaW5nIHRoYXQgdW5zaWduZWQgbnVtYmVycyBhcmUgPj0wCgkgICAgUmV3cm90ZSBtdWNoIG9mIEV4YW1wbGVzL0x1YS9lbWJlZDMuIAoJICAgIEFkZGVkIGEgbG90IHRvIHRoZSBMdWEgZG9jdW1lbnRhdGlvbi4KCjIwMDktMDEtMTM6IHdzZnVsdG9uCgkgICAgRml4IGNvbXBpbGF0aW9uIGVycm9yIHdoZW4gdXNpbmcgZGlyZWN0b3JzIG9uIHByb3RlY3RlZCB2aXJ0dWFsIG92ZXJsb2FkZWQgCgkgICAgbWV0aG9kcyByZXBvcnRlZCBieSBTYW0gSGVuZGxleS4KCjIwMDktMDEtMTI6IGRyam9lCiAgICAgICAgICAgIFtSXSBGaXhlZCBoYW5kbGluZyBvZiBpbnRlZ2VyIGFycmF5cwoKMjAwOS0wMS0xMDogZHJqb2UKCSAgICBbUl0gRml4IGludGVnZXIgaGFuZGxpbmcgaW4gciB0byBkZWFsIGNvcnJlY3RseSB3aXRoIHNpZ25lZAoJICAgIGFuZCB1bnNpZ25lZCBpc3N1ZXMKCjIwMDktMDEtMTA6IHdzZnVsdG9uCgkgICAgUGF0Y2ggICMxOTkyNzU2IGZyb20gQ29saW4gTWNEb25hbGQgLSAlY29udHJhY3Qgbm90IHdvcmtpbmcgZm9yIGNsYXNzZXMgCgkgICAgaW4gbmFtZXNwYWNlCgoyMDA5LTAxLTA1OiBvbGx5CgkgICAgTWFyayBTV0lHUEVSTDUsIFNXSUdQSFA1LCBhbmQgU1dJR1RDTDggYXMgZGVwcmVjYXRlZCBpbiB0aGUgc291cmNlCgkgICAgY29kZSBhbmQgcmVtb3ZlIGRvY3VtZW50YXRpb24gb2YgdGhlbS4KCjIwMDgtMTItMzA6IHdzZnVsdG9uCgkgICAgQnVnICMyNDMwNzU2LiBBbGwgdGhlIGxhbmd1YWdlcyBub3cgZGVmaW5lIGEgbWFjcm8gaW4gdGhlIGdlbmVyYXRlZCBDL0MrKwoJICAgIHdyYXBwZXIgZmlsZSBpbmRpY2F0aW5nIHdoaWNoIGxhbmd1YWdlIGlzIGJlaW5nIHdyYXBwZWQuIFRoZSBtYWNybyBuYW1lIGlzIHRoZQoJICAgIHNhbWUgYXMgdGhvc2UgZGVmaW5lZCB3aGVuIFNXSUcgaXMgcnVuLCBlZyBTV0lHSkFWQSwgU1dJR09DVEFWRSwgU1dJR0NTSEFSUCBldGMKCSAgICBhbmQgYXJlIGxpc3RlZCBpbiB0aGUgIkNvbmRpdGlvbmFsIENvbXBpbGF0aW9uIiBzZWN0aW9uIGluIHRoZSBkb2N1bWVudGF0aW9uLgoKMjAwOC0xMi0yMzogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMyMTUzNzczIC0gJW5vamF2YWV4Y2VwdGlvbiB3YXMgY2xlYXJpbmcgdGhlIGV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgIGluc3RlYWQgb2YgZGlzYWJsaW5nIGl0LiBDbGVhcmluZyBjaGVja2VkIEphdmEgZXhjZXB0aW9ucyBhbHNvIGRpZG4ndCB3b3JrLiAKCSAgICBUaGUgbmV3ICVjbGVhcmphdmFleGNlcHRpb24gY2FuIGJlIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBleGNlcHRpb24gZmVhdHVyZS4KCjIwMDgtMTItMjI6IHdzZnVsdG9uCgkgICAgRml4ICMyNDMyODAxIC0gTWFrZSBTd2lnVmFsdWVXcmFwcGVyIGV4Y2VwdGlvbiBzYWZlIGZvciB3aGVuIGNvcHkgY29uc3RydWN0b3JzCgkgICAgdGhyb3cgZXhjZXB0aW9ucy4KCjIwMDgtMTItMjE6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzI0NDAwNDYgd2hpY2ggZml4ZXMgcG9zc2libGUgc2VnIGZhdWx0cyBmb3IgbWVtYmVyIGFuZCBnbG9iYWwKCSAgICB2YXJpYWJsZSBjaGFyIGFycmF5cyB3aGVuIHRoZSBzdHJpbmdzIGFyZSBsYXJnZXIgdGhhbiB0aGUgc3RyaW5nIGFycmF5IHNpemUuCgoyMDA4LTEyLTIwOiB3c2Z1bHRvbgoJICAgIFRoZSBjY2FjaGUgY29tcGlsZXIgY2FjaGUgaGFzIGJlZW4gYWRhcHRlZCB0byB3b3JrIHdpdGggU1dJRyBhbmQKCSAgICBuYW1lZCBjY2FjaGUtc3dpZy4gSXQgbm93IHdvcmtzIHdpdGggQy9DKysgY29tcGlsZXJzIGFzIHdlbGwgYXMgU1dJRwoJICAgIGFuZCBjYW4gcmVzdWx0IGluIGltcHJlc3NpdmUgc3BlZWR1cHMgd2hlbiB1c2VkIHRvIHJlY29tcGlsZSB1bmNoYW5nZWQKCSAgICBjb2RlIHdpdGggZWl0aGVyIGEgQy9DKysgY29tcGlsZXIgb3IgU1dJRy4gRG9jdW1lbnRhdGlvbiBpcyBpbiBDQ2FjaGUuaHRtbAoJICAgIG9yIHRoZSBpbnN0YWxsZWQgY2NhY2hlLXN3aWcgbWFuIHBhZ2UuCgoyMDA4LTEyLTEyOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoIGZyb20gS2FseWFub3YgRG1pdHJ5IHdoaWNoIGZpeGVzIHBhcnNpbmcgb2YgbmVzdGVkIHN0cnVjdHMKCSAgICBjb250YWluaW5nIGNvbW1lbnRzLgoKMjAwOC0xMi0xMjogd3NmdWx0b24KCSAgICBGaXggZXJyb3IgbWVzc2FnZSBpbiBzb21lIG5lc3RlZCBzdHJ1Y3QgYW5kICVpbmxpbmUgcGFyc2luZyBlcnJvciBzaXR1YXRpb25zCgkgICAgc3VjaCBhcyB1bnRlcm1pbmF0ZWQgc3RyaW5ncyBhbmQgY29tbWVudHMuCgoyMDA4LTEyLTA3OiBvbGx5CgkgICAgW1BIUF0gRml4IHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVyIHdpdGggR0NDIDQuMy4KCjIwMDgtMTItMDY6IHdzZnVsdG9uCgkgICAgW1BIUF0gRGVwcmVjYXRlICVwcmFnbWEocGhwNCkuIFBsZWFzZSB1c2UgJXByYWdtYShwaHApIGluc3RlYWQuCgkgICAgVGhlIGZvbGxvd2luZyB0d28gd2FybmluZ3MgaGF2ZSBiZWVuIHJlbmFtZWQ6CgkgICAgV0FSTl9QSFA0X01VTFRJUExFX0lOSEVSSVRBTkNFIC0+IFdBUk5fUEhQX01VTFRJUExFX0lOSEVSSVRBTkNFCgkgICAgV0FSTl9QSFA0X1VOS05PV05fUFJBR01BICAgICAgIC0+IFdBUk5fUEhQX1VOS05PV05fUFJBR01BCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDgtMTItMDQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBBcHBsaWVkIHBhdGNoIFNGIzIxNTg5Mzg6IGFsbCB0aGUgU1dJRyBzeW1ib2wgbmFtZXMgc3RhcnRlZCB3aXRoIFB5CiAgICAgICAgICAgIGFyZSBjaGFuZ2VkLCBzaW5jZSB0aGV5IGFyZSBpbmFwcHJvcHJpYXRlIGFuZCBkaXNjb3VyYWdlZCBpbiBQeXRob24KICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiAoZnJvbSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuNS4yL2FwaS9pbmNsdWRlcy5odG1sKToKCiAgICAgICAgICAgICJBbGwgdXNlciB2aXNpYmxlIG5hbWVzIGRlZmluZWQgYnkgUHl0aG9uLmggKGV4Y2VwdCB0aG9zZSBkZWZpbmVkIGJ5CiAgICAgICAgICAgIHRoZSBpbmNsdWRlZCBzdGFuZGFyZCBoZWFkZXJzKSBoYXZlIG9uZSBvZiB0aGUgcHJlZml4ZXMgIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgTmFtZXMgYmVnaW5uaW5nIHdpdGggIl9QeSIgYXJlIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGV4dGVuc2lvbiB3cml0ZXJzLiBTdHJ1Y3R1cmUgbWVtYmVyIG5hbWVzIGRvCiAgICAgICAgICAgIG5vdCBoYXZlIGEgcmVzZXJ2ZWQgcHJlZml4LgoKICAgICAgICAgICAgSW1wb3J0YW50OiB1c2VyIGNvZGUgc2hvdWxkIG5ldmVyIGRlZmluZSBuYW1lcyB0aGF0IGJlZ2luIHdpdGggIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgVGhpcyBjb25mdXNlcyB0aGUgcmVhZGVyLCBhbmQgamVvcGFyZGl6ZXMgdGhlIHBvcnRhYmlsaXR5IG9mIHRoZSB1c2VyCiAgICAgICAgICAgIGNvZGUgdG8gZnV0dXJlIFB5dGhvbiB2ZXJzaW9ucywgd2hpY2ggbWF5IGRlZmluZSBhZGRpdGlvbmFsIG5hbWVzIGJlZ2lubmluZwogICAgICAgICAgICB3aXRoIG9uZSBvZiB0aGVzZSBwcmVmaXhlcy4iCgogICAgICAgICAgICBIZXJlIGlzIGEgYnJpZWYgbGlzdCBvZiB3aGF0IGNoYW5nZWQ6CgogICAgICAgICAgICAgICAgUHlTd2lnKiAtPiBTd2lnUHkqCiAgICAgICAgICAgICAgICBQeU9iamVjdF9wdHIgLT4gU3dpZ1B0cl9QeU9iamVjdAogICAgICAgICAgICAgICAgUHlPYmplY3RfdmFyIC0+IFN3aWdWYXJfUHlPYmplY3QKICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfQmFzZSwgUHlTZXF1ZW5jZV9Db250LCBQeVNlcXVlbmNlX1JlZiAtPgogICAgICAgICAgICAgICAgICAgICAgICBTd2lnUHlTZXF1ZW5jZV9CYXNlLCBTd2lnUHlTZXF1ZW5jZV9Db250LCBTd2lnUHlTZXF1ZW5jZV9SZWYKICAgICAgICAgICAgICAgIFB5TWFwKiAtPiBTd2lnUHlNYXAqCgogICAgICAgICAgICBXZSBwcm92aWRlZCBhIHB5bmFtZV9jb21wYXQuaSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gVXNlcnMgd2hvc2UgY29kZSBoYXZpbmcKICAgICAgICAgICAgdGhlc2Ugc3ltYm9scyBhbmQgZG8gbm90IHdhbnQgdG8gY2hhbmdlIGl0IGNvdWxkIHNpbXBseSBpbmNsdWRlIHRoaXMgZmlsZQogICAgICAgICAgICBhdCBmcm9udCBvZiB5b3VyIGNvZGUuIEEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHJ1biB0aGUgY29udmVydGluZyB0b29sIG9uCiAgICAgICAgICAgIHlvdXIgY29kZSwgd2hpY2ggaGFzIGJlZW4gcHV0IGluIFNXSUcncyBTVk4gdHJ1bmsgKFRvb2xzL3B5bmFtZV9wYXRjaC5weSkgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gZG93bmxvYWQgaXQgaGVyZToKICAgICAgICAgICAgaHR0cHM6Ly9zd2lnLnN2bi5zb3VyY2Vmb3JnZS5uZXQvc3Zucm9vdC9zd2lnL3RydW5rL1Rvb2xzL3B5bmFtZV9wYXRjaC5weSAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOC0xMi0wMjogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMjE0MzcyNyBmcm9tIFNlcmdlIE1vbmtld2l0eiB0byBmaXggaW1wb3J0aW5nIGJhc2UgY2xhc3NlcyAKCSAgICB3aGVuIHRoZSBwYWNrYWdlIG9wdGlvbiBpcyBzcGVjaWZpZWQgaW4gJW1vZHVsZSBhbmQgdGhhdCBtb2R1bGUgaXMgJWltcG9ydCdlZC4KCjIwMDgtMTEtMjg6IHdzZnVsdG9uCgkgICAgW1VUTF0gRml4ICMyMDgwNDk3LiBTb21lIGluY29ycmVjdCBhY2NlcHRhbmNlIG9mIHR5cGVzIGluIHRoZSBTVEwsIGVnIGEgZG91YmxlICogZWxlbWVudAoJICAgIHBhc3NlZCBpbnRvIGEgdmVjdG9yPGludCAqPiBjb25zdHJ1Y3RvciB3b3VsZCBiZSBhY2NlcHRlZCwgYnV0IHRoZSBlbnN1aW5nIGJlaGF2aW91cgoJICAgIHdhcyB1bmRlZmluZWQuIE5vdyB0aGUgdHlwZSBjb252ZXJzaW9uIGNvcnJlY3RseSByYWlzZXMgYW4gZXhjZXB0aW9uLgoKMjAwOC0xMS0yNDogd3NmdWx0b24KCSAgICBBZGQgLW91dGN1cnJlbnRkaXIgb3B0aW9uLiBUaGlzIHNldHMgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSB0byB0aGUgY3VycmVudCAKCSAgICBkaXJlY3RvcnkgaW5zdGVhZCBvZiB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IGZpbGUuIFRoaXMgb3B0aW9uIGVuYWJsZXMKCSAgICBiZWhhdmlvdXIgc2ltaWxhciB0byBjL2MrKyBjb21waWxlcnMuIE5vdGUgdGhhdCB0aGlzIGNvbnRyb2xzIHRoZSBvdXRwdXQgZGlyZWN0b3J5LAoJICAgIGJ1dCBvbmx5IGluIHRoZSBhYnNlbmNlIG9mIHRoZSAtbyBhbmQvb3IgLW91dGRpciBvcHRpb25zLgoKMjAwOC0xMS0yMzogd3NmdWx0b24KCSAgICBbcnVieV0gQXBwbHkgcGF0Y2ggIzIyNjM4NTAgdG8gZml4IHJ1YnkvZmlsZS5pIC4uLiBydWJ5aW8uaCBmaWxlbmFtZSBjaGFuZ2UgaW4gCgkgICAgcnVieSAxLjkuCgoyMDA4LTExLTIzOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMyMzE5NzkwIGZyb20gSm9oYW4gSGFrZSB0byBmaXggc2hhcmVkX3B0ciB1c2FnZSBpbiBzdGQ6OnRyMSBuYW1lc3BhY2UuCgoyMDA4LTExLTIxOiB3c2Z1bHRvbgoJICAgIFRoZSB1c2Ugb2YgdGhlIGluY2x1ZGUgcGF0aCB0byBmaW5kIHRoZSBpbnB1dCBmaWxlIGlzIG5vdyBkZXByZWNhdGVkLgoJICAgIFRoaXMgbWFrZXMgdGhlIGJlaGF2aW91ciBvZiBTV0lHIHRoZSBzYW1lIGFzIEMvQysrIGNvbXBpbGVycyBpbiBwcmVwYXJhdGlvbgoJICAgIGZvciB1c2Ugd2l0aCBjY2FjaGUuCgoyMDA4LTExLTE2OiB3c2Z1bHRvbgoJICAgIEZpeCAtbm9wcmVwcm9jZXNzIG9wdGlvbiB0bzoKCSAgICAtIGNvcnJlY3RseSByZXBvcnQgZmlsZSBuYW1lcyBpbiB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcy4KCSAgICAtIHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgZmlsZW5hbWUgdGhhdCBjcmVhdGVkIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdoZW4gCgkgICAgICBkZXRlcm1pbmluZyB0aGUgQysrIHdyYXBwZXIgZmlsZSBuYW1lIChpbiB0aGUgYWJzZW5jZSBvZiAtbykuIFByZXZpb3VzbHkgCgkgICAgICB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBjb250YWluaW5nIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdhcyB1c2VkLgoKMjAwOC0xMS0xMTogd3NmdWx0b24KCSAgICBbSmF2YV0gQWRkIHBhdGNoICMyMTUyNjkxIGZyb20gTUFUU1VVUkEgVGFrYW5vcmkgd2hpY2ggZml4ZXMgY29tcGlsZXMgdXNpbmcgdGhlCgkgICAgSW50ZWwgY29tcGlsZXIKCjIwMDgtMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBwYXRjaCAjMjEyODI0OSBmcm9tIEFuYXRvbHkgVGVjaHRvbmlrIHdoaWNoIGNvcnJlY3RzIHRoZSBDL0MrKyBwcm94eQogICAgICAgICAgICBjbGFzcyBiZWluZyByZXBvcnRlZCBmb3IgUHl0aG9uIGRvY3N0cmluZ3Mgd2hlbiAlcmVuYW1lIGlzIHVzZWQuCgoyMDA4LTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIHN0cmlwIGVuY29kZXIgcGF0Y2ggZnJvbSBBbmF0b2x5IFRlY2h0b25payAjMjEzMDAxNi4gVGhpcyBlbmFibGVzIGFuIAogICAgICAgICAgICBlYXN5IHdheSB0byByZW5hbWUgc3ltYm9scyBieSBzdHJpcHBpbmcgYSBjb21tb25seSB1c2VkIHByZWZpeCBpbiBhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uL3N0cnVjdCBuYW1lcy4gSXQgd29ya3MgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBvdGhlciBlbmNvZGVycywgc3VjaCBhcwogICAgICAgICAgICB0aXRsZSwgbG93ZXIsIGNvbW1hbmQgZXRjIG91dGxpbmVkIGluIENIQU5HRVMgZmlsZSBkYXRlZCAxMi8zMC8yMDA1LiBFeGFtcGxlCiAgICAgICAgICAgIGJlbG93IHdpbGwgcmVuYW1lIHd4QW5vdGhlcldpZGdldCB0byBBbm90aGVyV2lkZ2V0IGFuZCB3eERvU29tZXRoaW5nIHRvIAogICAgICAgICAgICBEb1NvbWV0aGluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiJShzdHJpcDpbd3hdKXMiKSAiIjsgCgogICAgICAgICAgICAgIHN0cnVjdCB3eEFub3RoZXJXaWRnZXQgewogICAgICAgICAgICAgICAgICB2b2lkIHd4RG9Tb21ldGhpbmcoKTsKICAgICAgICAgICAgICB9OwoKMjAwOC0wOS0yNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIExvdHMgb2YgdGVzdC1zdWl0ZSB3b3JrLgoJICAgIC0gRml4IG9yZGVyaW5nIG9mIHdyYXBwZXIgb3V0cHV0IGFuZCAleyAlfSBoZWFkZXIgb3V0cHV0LgoJICAgIC0gRml4IGRlY2xhcmF0aW9ucyBvZiBsb2NhbCB2YXJzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBGaXggZGVjbGFyYXRpb24gb2YgZGVmaW5lZCBjb25zdGFudHMgaW4gQyB3cmFwcGVycy4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbiBvZiBFbnVtVmFsdWVzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBhZGQgc29tZSBjb25zdCB0eXBlbWFwcyB0byBhbGxlZ3JvY2wuc3dnCgkgICAgLSBhZGQgcmVuYW1lIGZvciBvcGVyYXRvciBib29sKCkgb3ZlcmxvYWRzLgoJCjIwMDgtMDktMjU6IG9sbHkKCSAgICBbUEhQNV0gRmlsbCBpbiB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgYW5kIHZvaWQgKiAoU0YjMjA5NTE4NikuCgoyMDA4LTA5LTIyOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICAtIFN1cHBvcnQgd3JhcHBpbmcgb2YgdHlwZXMgd2hvc2UgZGVmaW5pdGlvbnMgYXJlIG5vdCBzZWVuIGJ5CgkgICAgU1dJRy4gVGhleSBhcmUgdHJlYXRlZCBhcyBmb3J3YXJkLXJlZmVyZW5jZWQgY2xhc3NlcyBhbmQgaWYgYQoJICAgIGRlZmluaXRpb24gaXMgbm90IHNlZW4gYXJlIHRyZWF0ZWQgYXMgKCogOnZvaWQpLgoJICAgIC0gRG9uJ3Qgd3JhcCB0aGUgY29udGVudHMgb2YgdW5uYW1lZCBuYW1lc3BhY2VzLgoJICAgIC0gTW9yZSBjb2RlIGNsZWFudXAuIFJlbW92ZWQgc29tZSBleHRyYW5lb3VzIHdhcm5pbmdzLgoJICAgIC0gc3RhcnQgd29yayBvbiBoYXZpbmcgdGhlIGFsbGVncm9jbCBtb2QgcGFzcyB0aGUgY3BwIHRlc3Qtc3VpdGUuCgoyMDA4LTA5LTE5OiBvbGx5CgkgICAgW1BIUDVdIEFkZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuCgoyMDA4LTA5LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIEMjIGFycmF5IHR5cGVtYXBzIHByb3ZpZGVkIGJ5IEFudHRpIEthcmFudGEuCiAgICAgICAgICAgIFRoZSBhcnJheXMgcHJvdmlkZSBhIHdheSB0byB1c2UgTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBBcnJheSkKICAgICAgICAgICAgYW5kIHBpbm5pbmcgdGhlIGFycmF5IHVzaW5nICdmaXhlZCcuIFNlZSBhcnJheXNfY3NoYXJwLmkgbGlicmFyeSBmaWxlCiAgICAgICAgICAgIGZvciBkZXRhaWxzLgoKMjAwOC0wOS0xODogd3NmdWx0b24KCSAgICBEb2N1bWVudCB0aGUgb3B0aW9uYWwgbW9kdWxlIGF0dHJpYnV0ZSBpbiB0aGUgJWltcG9ydCBkaXJlY3RpdmUsCiAgICAgICAgICAgIHNlZSBNb2R1bGVzLmh0bWwuIEFkZCBhIHdhcm5pbmcgZm9yIFB5dGhvbiB3cmFwcGVycyB3aGVuIHRoZQogICAgICAgICAgICBtb2R1bGUgbmFtZSBmb3IgYW4gaW1wb3J0ZWQgYmFzZSBjbGFzcyBpcyBtaXNzaW5nLCByZXF1aXJpbmcgdGhlCiAgICAgICAgICAgIG1vZHVsZSBhdHRyaWJ1dGUgdG8gYmUgYWRkZWQgdG8gJWltcG9ydCwgZWcgCgogICAgICAgICAgICAgICVpbXBvcnQobW9kdWxlPSJGb29Nb2R1bGUiKSBmb28uaAoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBDaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZW1hcCBmb3IgY2hhciAqIHRvIHR1cm4gUEhQCgkgICAgTnVsbCBpbnRvIEMgTlVMTCAocHJldmlvdXNseSBpdCB3YXMgY29udmVydGVkIHRvIGFuIGVtcHR5IHN0cmluZykuCgkgICAgVGhlIG5ldyBiZWhhdmlvdXIgaXMgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQKCSAgICB0eXBlbWFwIHdvcmtzIChTRiMyMDI1NzE5KS4KCgkgICAgSWYgeW91IHdhbnQgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgYWRkIHRoZSBmb2xsb3dpbmcgdHlwZW1hcAoJICAgIHRvIHlvdXIgaW50ZXJmYWNlIGZpbGUgKFBIUCdzIGNvbnZlcnRfdG9fc3RyaW5nX2V4KCkgZnVuY3Rpb24gZG9lcwoJICAgIHRoZSBjb252ZXJ0aW5nIGZyb20gUEhQIE51bGwgdG8gYW4gZW1wdHkgc3RyaW5nKToKCgkgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7CgkJY29udmVydF90b19zdHJpbmdfZXgoJGlucHV0KTsKCQkkMSA9IFpfU1RSVkFMX1BQKCRpbnB1dCk7CgkgICAgfQoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBGaXggZXh0cmEgY29kZSBhZGRlZCB0byBwcm94eSBjbGFzcyBjb25zdHJ1Y3RvcnMgaW4gdGhlIGNhc2UKCSAgICB3aGVyZSB0aGUgb25seSBjb25zdHJ1Y3RvciB0YWtlcyBubyBhcmd1bWVudHMuCgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIEZpeCB3cmFwcGluZyBvZiBhIHJlbmFtZWQgZW51bWVyYXRlZCB2YWx1ZSBvZiBhbiBlbnVtIGNsYXNzCgkgICAgbWVtYmVyIChTRiMyMDk1MjczKS4KCjIwMDgtMDktMTc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gRml4IGhvdyBmb3J3YXJkIHJlZmVyZW5jZSB0eXBlZGVmcyBhcmUgaGFuZGxlZCwgc28gYXMgbm90IHRvIGNvbmZsaWN0CgkgICAgd2l0aCBvdGhlciBsZWdpdCB0eXBlZGVmcy4KCSAgICAtIERvbid0IChmb3Igbm93KSBwZXJmb3JtIGFuIGZmaXR5cGUgdHlwZW1hcCBsb29rdXAgd2hlbiB0cnlpbmcgdG8KCSAgICB3aGVuIGNhbGxpbmcgY29tcG9zZV9mb3JlaWduX3R5cGUoKS4gVGhpcyBpcyBhY3R1YWxseSBhIHVzZWZ1bCB0aGluZwoJICAgIHRvIGRvIGluIGNlcnRhaW4gY2FzZXMsIHRoZSB0ZXN0IGNhc2VzIGZvciB3aGljaCBJIGNhbid0IGN1cnJlbnRseQoJICAgIGxvY2F0ZSA6Ly4gSXQncyBicmVha2luZyBzb21lIHdyYXBwaW5nIGJlaGF2aW9yIHRoYXQgaXMgbW9yZSBjb21tb25seQoJICAgIHNlZW4sIGhvd2V2ZXIuIEknbGwgcmVhZGQgaW4gYSBtb3JlIGFwcHJvcHJpYXRlIHdheSB3aGVuIEkgY2FuCgkgICAgcmVjcmVhdGUgdGhlIG5lZWRlZCB0ZXN0IGNhc2UsIG9yIGEgdXNlciBjb21wbGFpbnMgKHdoaWNoIG1lYW5zCgkgICAgdGhleSBwcm9iYWJseSBoYXZlIGEgdGVzdCBjYXNlKS4KCSAgICAtIGRvY3VtZW50IHRoZSAtaXNvbGF0ZSBjb21tYW5kLWxpbmUgYXJnIGluIHRoZSAnc3dpZyAtaGVscCcgb3V0cHV0LgoJICAgIEl0IHdhcyBpbiB0aGUgaHRtbCBkb2NzLCBidXQgbm90IHRoZXJlLgoJICAgIC0gc21hbGwgYW1vdW50IG9mIGNvZGUgY2xlYW51cCwgcmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgoJICAgIC0gc29tZSBtaW5vciBhZXN0aGV0aWMgY2hhbmdlcy4KCjIwMDgtMDktMTI6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBQeXRob24gMy4wIHN1cHBvcnQgYnJhbmNoIG1lcmdlZCBpbnRvIFNXSUcgdHJ1bmsuIFRoYW5rcyB0bwogICAgICAgICAgICBHb29nbGUgU3VtbWVyIG9mIENvZGUgMjAwOCBmb3Igc3VwcG9ydGluZyB0aGlzIHByb2plY3QhIEJ5IGRlZmF1bHQKICAgICAgICAgICAgU1dJRyB3aWxsIGdlbmVyYXRlIGludGVyZmFjZSBmaWxlcyBjb21wYXRpYmxlIHdpdGggYm90aCBQeXRob24gMi54CiAgICAgICAgICAgIGFuZCAzLjAuIEFuZCB0aGVyZSdzIGFsc28gc29tZSBQeXRob24gMyBuZXcgZmVhdHVyZXMgdGhhdCBjYW4gYmUKICAgICAgICAgICAgZW5hYmxlZCBieSBwYXNzaW5nIGEgIi1weTMiIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gU1dJRy4gVGhlc2UKICAgICAgICAgICAgZmVhdHVyZXMgYXJlOgoKICAgICAgICAgICAgICAtIEZ1bmN0aW9uIGFubm90YXRpb24gc3VwcG9ydAogICAgICAgICAgICAgICAgICBBbHNvLCB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgcHJveHkgZnVuY3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQsCiAgICAgICAgICAgICAgICAgIGV2ZW4gd2l0aG91dCB0aGUgIi1weTMiIG9wdGlvbi4gSG93ZXZlciwgdGhlIHBhcmFtZXRlciBsaXN0CiAgICAgICAgICAgICAgICAgIHdpbGwgZmFsbGJhY2sgdG8gKmFyZ3MgaWYgdGhlIGZ1bmN0aW9uIChvciBtZXRob2QpIGlzIG92ZXJsb2FkZWQuCiAgICAgICAgICAgICAgLSBCdWZmZXIgaW50ZXJmYWNlIHN1cHBvcnQKICAgICAgICAgICAgICAtIEFic3RyYWN0IGJhc2UgY2xhc3Mgc3VwcG9ydAoKICAgICAgICAgICAgRm9yIGRldGFpbHMgb2YgUHl0aG9uIDMgc3VwcG9ydCBhbmQgdGhlc2UgZmVhdHVyZXMsIHBsZWFzZSBzZWUgdGhlCiAgICAgICAgICAgICJQeXRob24gMyBTdXBwb3J0IiBzZWN0aW9uIGluIHRoZSAiU1dJRyBhbmQgUHl0aG9uIiBjaGFwdGVyIG9mIHRoZSBTV0lHCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24uCgogICAgICAgICAgICBUaGUgIi1hcHBseSIgY29tbWFuZCBsaW5lIG9wdGlvbiBhbmQgc3VwcG9ydCBvZiBnZW5lcmF0aW5nIGNvZGVzCiAgICAgICAgICAgIHVzaW5nIGFwcGx5KCkgaXMgcmVtb3ZlZC4gU2luY2UgdGhpcyBpcyBvbmx5IHJlcXVpcmVkIGJ5IHZlcnkgb2xkCiAgICAgICAgICAgIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgbWVyZ2UgYWxzbyBwYXRjaGVkIFNXSUcncyBwYXJzZXIgdG8gc29sdmUgYSBidWcuIEJ5IHRoaXMgcGF0Y2gsCiAgICAgICAgICAgIFNXSUcgZmVhdHVyZXMgYWJsZSB0byBiZSBjb3JyZWN0bHkgYXBwbGllZCBvbiBDKysgY29udmVyc2lvbiBvcGVyYXRvciwKICAgICAgICAgICAgc3VjaCBsaWtlIHRoaXM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpICAqOjpvcGVyYXRvciBib29sICV7IC4uLiAlfQoKMjAwOC0wOS0wMjogcmljaGFyZGIKCSAgICBbUHl0aG9uXSBDb21taXQgcGF0Y2ggIzIwODkxNDk6IERpcmVjdG9yIGV4Y2VwdGlvbiBoYW5kbGluZyBtYW5nbGVzCgkgICAgcmV0dXJuZWQgZXhjZXB0aW9uLiAgRXhjZXB0aW9ucyByYWlzZWQgYnkgUHl0aG9uIGNvZGUgaW4gZGlyZWN0b3JzCgkgICAgYXJlIG5vdyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY2FsbGVyIHdpdGhvdXQgY2hhbmdlLiAgQWxzbywgcmVtb3ZlCgkgICAgdGhlICI6ICIgcHJlZml4IHdoaWNoIHVzZWQgdG8gYmUgYWRkZWQgdG8gb3RoZXIgZGlyZWN0b3IgZXhjZXB0aW9ucwoJICAgIChlZywgdGhvc2UgZHVlIHRvIGluY29ycmVjdCByZXR1cm4gdHlwZXMpLgoKMjAwOC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQ29tbWl0IHBhdGNoICMxOTg4Mjk2IEdDSXRlbSBtdWx0aXBsZSBtb2R1bGUgbGlua2luZyBpc3N1ZSB3aGVuIHVzaW5nIAogICAgICAgICAgICBkaXJlY3RvcnMuCgoyMDA4LTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yICd1c2luZycgYW5kICdmaXhlZCcgYmxvY2tzIGluIHRoZSAnY3NpbicgdHlwZW1hcCBpcyBub3cKICAgICAgICAgICAgcG9zc2libGUgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBwcmUgYXR0cmlidXRlIGFuZCB0aGUgbmV3IHRlcm1pbmF0b3IgYXR0cmlidXRlLCBlZwoKICAgICAgICAgICAgICAldHlwZW1hcChjc2luLCAKICAgICAgICAgICAgICAgICAgICAgICBwcmU9IiAgICB1c2luZyAoQ0RhdGUgdGVtcCRjc2lucHV0ID0gbmV3IENEYXRlKCRjc2lucHV0KSkgeyIsCiAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRvcj0iICAgIH0gLy8gdGVybWluYXRlIHRlbXAkY3NpbnB1dCB1c2luZyBibG9jayIsCiAgICAgICAgICAgICAgICAgICAgICApIGNvbnN0IENEYXRlICYKICAgICAgICAgICAgICAgICAgICAgICAiJGNzY2xhc3NuYW1lLmdldENQdHIodGVtcCRjc2lucHV0KSIKCiAgICAgICAgICAgIFNlZSBDU2hhcnAuaHRtbCBmb3IgbW9yZSBpbmZvLgoKMjAwOC0wOS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIENvbW1pdCBwYXRjaCAjMjA3OTM4MSBzdWJtaXR0ZWQgYnkgQm9yaXMgU21pbGdhIC0gY29uc3RhbnQgZXhwcnMgcHV0IGludG8gCiAgICAgICAgICAgIG5vLWV2YWwgY29udGV4dCBpbiBERUZDRU5VTQoKMjAwOC0wOC0wMjogd3V6emViCiAgICAgICAgICAgIFtDaGlja2VuLEFsbGVncm9dIENvbW1pdCBQYXRjaCAyMDE5MzE0CiAgICAgICAgICAgIEZpeGVzIGEgYnVpbGQgZXJyb3IgaW4gY2hpY2tlbiwgYW5kIHNldmVyYWwgYnVpbGQgZXJyb3JzIGFuZCBvdGhlciBlcnJvcnMKICAgICAgICAgICAgaW4gQWxsZWdybyBDTAoKMjAwOC0wNy0xOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1aWxkaW5nIG9mIFRjbCBleGFtcGxlcy90ZXN0LXN1aXRlIG9uIE1hYyBPU1ggcmVwb3J0ZWQgYnkgR2lkZW9uIFNpbXBzb24uCgoyMDA4LTA3LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgIzIwMTkxNTYgQ29uZmlndXJpbmcgd2l0aCAtLXdpdGhvdXQtb2N0YXZlIG9yIC0td2l0aG91dC1hbGxsYW5nCiAgICAgICAgICAgIGRpZCBub3QgZGlzYWJsZSBvY3RhdmUuCgoyMDA4LTA3LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBkaXJlY3RvciB0eXBlbWFwcyBmb3IgcG9pbnRlcnMgc28gdGhhdCBOVUxMIHBvaW50ZXJzIGFyZSBjb3JyZWN0bHkgCiAgICAgICAgICAgIG1hcnNoYWxsZWQgdG8gQyMvSmF2YSBudWxsIGluIGRpcmVjdG9yIG1ldGhvZHMuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gRm9yIHN0ZF92ZWN0b3IuaSBhbmQgc3RkX21hcC5pLCByZW5hbWUgZW1wdHkoKSB0byBpc19lbXB0eSgpCgkgICAgc2luY2UgImVtcHR5IiBpcyBhIFBIUCByZXNlcnZlZCB3b3JkLiAgQmFzZWQgb24gcGF0Y2ggZnJvbSBNYXJrIEtsZWluCgkgICAgaW4gU0YjMTk0MzQxNy4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVwcmVjYXRlZCBjb21tYW5kIGxpbmUgb3B0aW9uICItbWFrZSIgaGFzIGJlZW4gcmVtb3ZlZC4gIAoJICAgIFNlYXJjaGVzIG9uIEdvb2dsZSBjb2Rlc2VhcmNoIHN1Z2dlc3QgdGhhdCBub2JvZHkgaXMgdXNpbmcgaXQgbm93CgkgICAgYW55d2F5LgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIFRoZSBTV0lHIGNkYXRhLmkgbGlicmFyeSBtb2R1bGUgaXMgbm93IHN1cHBvcnRlZC4KCjIwMDgtMDctMDM6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVwcmVjYXRlZCBjb21tYW5kIGxpbmUgb3B0aW9uICItcGhwZnVsbCIgaGFzIGJlZW4KCSAgICByZW1vdmVkLiAgV2UgcmVjb21tZW5kIGJ1aWxkaW5nIHlvdXIgZXh0ZW5zaW9uIGFzIGEgZHluYW1pY2FsbHkKCSAgICBsb2FkYWJsZSBtb2R1bGUuCgoyMDA4LTA3LTAyOiBvbGx5CgkgICAgW1BIUDRdIFN1cHBvcnQgZm9yIFBIUDQgaGFzIGJlZW4gcmVtb3ZlZC4gIFRoZSBQSFAgZGV2ZWxvcGVycyBhcmUKCSAgICBubyBsb25nZXIgbWFraW5nIG5ldyBQSFA0IHJlbGVhc2VzLCBhbmQgd29uJ3QgZXZlbiBiZSBwcm92aWRpbmcKCSAgICBwYXRjaGVzIGZvciBjcml0aWNhbCBzZWN1cml0eSBpc3N1ZXMgYWZ0ZXIgMjAwOC0wOC0wOC4KCjIwMDgtMDctMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXBvcnQgdGhlIEMgZXh0ZW5zaW9uIGRpZmZlcmVudGx5IGZvciBQeXRob24gMi42IGFuZAoJICAgIGxhdGVyIHNvIHRoYXQgYW4gaW1wbGljaXQgcmVsYXRpdmUgaW1wb3J0IGRvZXNuJ3QgcHJvZHVjZSBhCgkgICAgZGVwcmVjYXRpb24gd2FybmluZyBmb3IgMi42IGFuZCBhIGZhaWx1cmUgZm9yIDIuNyBhbmQgbGF0ZXIuCgkgICAgUGF0Y2ggZnJvbSBSaWNoYXJkIEJvdWx0b24gaW4gU0YjMjAwODIyOSwgcGx1cyBmb2xsb3ctdXAgcGF0Y2hlcwoJICAgIGZyb20gUmljaGFyZCBhbmQgSGFveXUgQmFpLgoKVmVyc2lvbiAxLjMuMzYgKDI0IEp1bmUgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzI0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlbW92ZSBkZXByZWNhdGVkIC1jIGNvbW1hbmRsaW5lIG9wdGlvbiAocnVudGltZSBsaWJyYXJ5IGdlbmVyYXRpb24pLgoKMDYvMjQvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBhc3NlcnRpb24gZmFpbHVyZSB3aGVuIGhhbmRsaW5nICV0eXBlbWFwKGluLG51bWlucHV0cz0wKQoJICAgICh0ZXN0Y2FzZSBpZ25vcmVfcGFyYW1ldGVyKS4KCjA2LzI0LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggc2VnZmF1bHQgd2hlbiB3cmFwcGluZyBhIG5vbi1jbGFzcyBmdW5jdGlvbiBtYXJrZWQgd2l0aAoJICAgICVuZXdvYmplY3QgKHRlc3RjYXNlIGNoYXJfc3RyaW5ncykuCgowNi8yMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIGEgd2F5IHRvIHVzZSBBdHRhY2hDdXJyZW50VGhyZWFkQXNEYWVtb24gaW5zdGVhZCBvZiBBdHRhY2hDdXJyZW50VGhyZWFkCiAgICAgICAgICAgIGluIGRpcmVjdG9yIGNvZGUuIERlZmluZSB0aGUgU1dJR19KQVZBX0FUVEFDSF9DVVJSRU5UX1RIUkVBRF9BU19EQUVNT04gbWFjcm8sIHNlZQogICAgICAgICAgICBMaWIvamF2YS9kaXJlY3Rvci5zd2cuCgowNi8yMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGNyYXNoaW5nIGluIHRoZSBTVEwgd3JhcHBlcnMgKHJlamVjdCEgYW5kIGRlbGV0ZV9pZiBtZXRob2RzKQoKMDYvMTkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBDIyBhbmQgSmF2YSBrZXl3b3JkcyB3aWxsIGJlIHJlbmFtZWQgaW5zdGVhZCBvZiBqdXN0IGlzc3VpbmcgYSB3YXJuaW5nCiAgICAgICAgICAgIGFuZCB0aGVuIGdlbmVyYXRpbmcgdW5jb21waWxhYmxlIGNvZGUuIFdhcm5pbmcgMzE0IGdpdmVzIHRoZSBuZXcgbmFtZSB3aGVuIGEgCiAgICAgICAgICAgIGtleXdvcmQgaXMgZm91bmQuCgowNi8xOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gS2V5d29yZCBoYW5kbGluZyBhZGRlZC4gUiBLZXl3b3JkcyB3aWxsIGJlIHJlbmFtZWQgYXMgbmVjZXNzYXJ5LgogICAgICAgICAgICBXYXJuaW5nIDMxNCBnaXZlcyB0aGUgbmV3IG5hbWUgd2hlbiBhIGtleXdvcmQgaXMgZm91bmQuCgowNi8xNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIGJvb2wmIGFuZCBib29sKi4gQWRkZWQgcnVudGVzdCBmb3IgbGlfdHlwZW1hcHMgdGVzdGNhc2UuCiAgICAgICAgICAgIChCdWcgIzE5MzgxNDIpCgowNi8wNy8yMDA4OiBiaHkKICAgICAgICAgICAgQWRkZWQgdGVzdCBjYXNlIGtleXdvcmRfcmVuYW1lLCB0aGVuIG1hZGUgdGhlIGtleXdvcmQgcmVuYW1pbmcgd29ya3MgcHJvcGVybHkKICAgICAgICAgICAgYnkgZml4aW5nIFN3aWdfbmFtZV9tYWtlKCkgZm9yIGEgaW5jb21wbGV0ZSBjb25kaXRpb24gY2hlY2tpbmcuCgowNi8wMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBlbnVtIHdyYXBwZXJzIHdoZW4gdXNpbmcgLW5vcHJveHkuCgowNS8zMC8yMDA4OiBiaHkKICAgICAgICAgICAgQWRkZWQgc3RkOjp3c3RyaW5nIGludG8gTGliL3R5cGVtYXBzL3ByaW10eXBlcy5zd2csIHNpbmNlIGl0IGlzIGFsc28gYSBwcmltaXRpdmUgCiAgICAgICAgICAgIHR5cGUgaW4gU1dJRyAtIGZpeGVkIFNGICMxOTc2OTc4LgoKMDUvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggdmFyaWFibGUgd3JhcHBlcnMgd2hlbiB1c2luZyAtbm9wcm94eS4KCjA1LzI5LzIwMDg6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXhlZCBhIHR5cG8gb2YgJSNpZmRlZiBpbiBMaWIvcHl0aG9uL3B5Y29udGFpbmVyLnN3Zywgd2hpY2ggaXMgcmVsYXRlZCAKICAgICAgICAgICAgdG8gLWV4dHJhbmF0aXZlIFNXSUcgb3B0aW9uIC0gU0YgIzE5NzE5NzcuCgowNS8yMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgcGFydGlhbGNoZWNrIG1ha2VmaWxlIHRhcmdldHMgZm9yIHBhcnRpYWwgdGVzdGluZyBvZiB0aGUgdGVzdC1zdWl0ZS4gVGhlc2UKICAgICAgICAgICAganVzdCBpbnZva2UgU1dJRywgaWUgbm8gY29tcGlsYXRpb24gYW5kIG5vIHJ1bnRpbWUgdGVzdGluZy4gSXQgY2FuIGJlIGZhc3RlcgogICAgICAgICAgICB3aGVuIGRldmVsb3BpbmcgYnkganVzdCBkb2luZyBhIGRpcmVjdG9yeSBkaWZmIG9mIHRoZSBmaWxlcyBTV0lHIGdlbmVyYXRlcwogICAgICAgICAgICBhZ2FpbnN0IHRob3NlIGZyb20gYSBwcmV2aW91cyBydW4uIEV4YW1wbGUgdXNhZ2UgZnJvbSB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeToKCiAgICAgICAgICAgICAgbWFrZSBwYXJ0aWFsY2hlY2stdGVzdC1zdWl0ZQogICAgICAgICAgICAgIG1ha2UgcGFydGlhbGNoZWNrLWphdmEtdGVzdC1zdWl0ZQoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBlbmNvbXBhc3NlcyBtb3JlIGZsZXhpYmlsaXR5IGluIHJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUsIGVnCiAgICAgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIHByZWZpeCB0aGUgY29tbWFuZCBsaW5lIHdoaWNoIHJ1bnMgYW55IHRhcmdldCBsYW5ndWFnZSB0ZXN0CiAgICAgICAgICAgIHdpdGggYSB0b29sLiBTZWUgdGhlIFJVTlRPT0wsIENPTVBJTEVUT09MIGFuZCBTV0lHVE9PTCB0YXJnZXRzIGluIHRoZSBjb21tb24ubWsKICAgICAgICAgICAgZmlsZSBhbmQgbWFrZWZpbGVzIGluIHRoZSB0ZXN0LXN1aXRlIGRpcmVjdG9yeS4gRm9yIGV4YW1wbGUgaXQgaXMgcG9zc2libGUgdG8gCiAgICAgICAgICAgIHJ1biB0aGUgcnVudGltZSB0ZXN0cyB0aHJvdWdoIHZhbGdyaW5kIHVzaW5nOgoKICAgICAgICAgICAgICBtYWtlIGNoZWNrIFJVTlRPT0w9InZhbGdyaW5kIC0tbGVhay1jaGVjaz1mdWxsIgoKICAgICAgICAgICAgb3IgaW52b2tlIFNXSUcgdW5kZXIgdmFsZ3JpbmQgdXNpbmc6CgogICAgICAgICAgICAgIG1ha2UgY2hlY2sgU1dJR1RPT0w9InZhbGdyaW5kIC0tdG9vbD1tZW1jaGVjayIKCjA1LzE5LzIwMDg6IGRyam9lCiAgICAgICAgICAgIFtSXSBGaXhlZCBkZWZpbmUgdGhhdCB3YXMgYnJlYWtpbmcgcHJlLTIuNy4gIENoZWNrZWQgaW4KICAgICAgICAgICAgcGF0Y2ggZnJvbSBTb3JlbiBTb25uZW5idXJnIHRoYXQgY3JlYXRlcyBzdHJpbmdzIGluICAKCSAgICB2ZXJzaW9uIGluZGVwZW5kZW50IHdheQoKMDUvMTUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCB2YXJpYWJsZSBuYW1lIGNsYXNoIGluIGRpcmVjdG9ycyAtIFNGICMxOTYzMzE2IHJlcG9ydGVkIGJ5IFRyaXN0YW4uCgowNS8xNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgYW4gb3B0aW1pc2F0aW9uIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gb2JqZWN0cyBieSB2YWx1ZSwgcmVkdWNpbmcKICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb3BpZXMgb2YgdGhlIG9iamVjdCB0aGF0IGFyZSBtYWRlLiBJbXBsZW1lbnRlZCB1c2luZyBhbgogICAgICAgICAgICBvcHRpb25hbCBhdHRyaWJ1dGUgaW4gdGhlICJvdXQiIHR5cGVtYXAgY2FsbGVkICJvcHRpbWFsIi4gRGV0YWlscyBpbiAKICAgICAgICAgICAgVHlwZW1hcHMuaHRtbC4KCjA1LzExLzIwMDg6IG9sbHkKCSAgICBbUEhQXSBDaGVjayBmb3IgJWZlYXR1cmUoIm5vdGFic3RyYWN0Iikgd2hlbiBnZW5lcmF0aW5nIFBIUDUgY2xhc3MKCSAgICB3cmFwcGVyLgoKMDUvMTEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGICMxOTQzNjA4IC0gJHNlbGYgc3Vic3RpdHV0aW9uIGluICVjb250cmFjdCwgcGF0Y2ggc3VibWl0dGVkIGJ5CiAgICAgICAgICAgIFRvb24gVmVyc3RyYWVsZW4uCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGNoYXIgKiB0eXBlbWFwcyB0byB3b3JrIHdoZW4gYXBwbGllZCB0byBzaWduZWQgY2hhciAqIGFuZAoJICAgIHVuc2lnbmVkIGNoYXIgKiAodW5jb3ZlcmVkIGJ5IHRlc3RjYXNlIGFwcGx5X3N0cmluZ3MpLgoKMDUvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIGNoYXIgKiBtZW1iZXIgdmFyaWFibGVzIHdoZW4gdXNpbmcgYWxscHJvdGVjdGVkIG1vZGUuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBXYXJyZW4gV2FuZy4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggYmFkIFBIUCBjb2RlIGdlbmVyYXRlZCB3aGVuIHdyYXBwaW5nIGFuIGVudW0gaW4gYQoJICAgIG5hbWVzcGFjZSAodW5jb3ZlcmVkIGJ5IHRlc3RjYXNlIGFycmF5c19zY29wZSkuCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gU1dJRyBub3cgcnVucyB0aGUgUEhQIHRlc3RzdWl0ZSB1c2luZyBQSFA1LCBub3QgUEhQNC4gIFBIUDQKCSAgICBpcyBlc3NlbnRpYWxseSBvYnNvbGV0ZSBub3csIHNvIHdlIGNhcmUgbXVjaCBtb3JlIGFib3V0IHNvbGlkIFBIUDUKCSAgICBzdXBwb3J0LgoKMDUvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgU1RMIGZpeGVzIHdoZW4gdXNpbmcgJWltcG9ydCByYXRoZXIgdGhhbiAlaW5jbHVkZSBhbmQgdGhlIFNvbGFyaXMgV29ya3Nob3AKICAgICAgICAgICAgY29tcGlsZXIgYW5kIHRoZSBSb2d1ZXdhdmUgU1RMLgoKMDUvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIG92ZXJsb2FkZWQgcHJvdGVjdGVkIG1ldGhvZHMgd2hlbiB1c2luZyBhbGxwcm90ZWN0ZWQgbW9kZS4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IFdhcnJlbiBXYW5nLgoKMDUvMDMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQ29tbWl0IHBhdGNoICMxOTU2NjA3IHRvIGFkZCAtTVQgc3VwcG9ydCBmcm9tIFJpY2hhcmQgQm91bHRvbi4KICAgICAgICAgICAgVGhpcyBwYXRjaCBtaXJyb3JzIHRoZSBnY2MgLU1UIG9wdGlvbiB3aGljaCBhbGxvd3Mgb25lIHRvIGNoYW5nZSB0aGUgZGVmYXVsdAogICAgICAgICAgICBNYWtlZmlsZSB0YXJnZXQgYmVpbmcgZ2VuZXJhdGVkIHdoZW4gZ2VuZXJhdGluZyBtYWtlZmlsZXMgd2l0aCB0aGUgLU0gZmFtaWx5CiAgICAgICAgICAgIG9mIG9wdGlvbnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAkIHN3aWcgLWphdmEgLU1NIC1NVCBvdmVycmlkZGVubmFtZSAtYysrICBleGFtcGxlLmkKICAgICAgICAgICAgICBvdmVycmlkZGVubmFtZTogXAogICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICBleGFtcGxlLmggCgowNC8zMC8yMDA4OiBtZ29zc2FnZQoJICAgIFtMdWFdIFJlbW92ZWQgZ2VuZXJhdGlvbiBvZiBfd3JhcF9kZWxldGVfWFhYWFggKHdyYXBwZXJlZCBkZXN0cnVjdG9yKQoJICAgIHdoaWNoIHdhcyB1bnVzZWQgYW5kIGNhdXNpbmcgd2FybmluZyB3aXRoIGcrKyAtV2FsbC4KCSAgICBSZW1vdmVkIG90aGVyIHVudXNlZCB3YXJuaW5nIGluIHR5cGVtYXBzLmkgYW5kIG90aGVyIHBsYWNlcy4KCSAgICBBZGRlZCBFeGFtcGxlcy9sdWEvZW1iZWQzLCBhbmQgcnVuIHRlc3RzIGEgZmV3IHRlc3QgY2FzZXMuCgowNC8yNC8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGdlbmVyYXRlZCBjb2RlIGZvciBJQk0ncyBDKysgY29tcGlsZXIgb24gQUlYIChwYXRjaAoJICAgIGZyb20gR29lcmFuIFVkZGVib3JnIGluIFNGIzE5MjgwNDgpLgoKMDQvMjQvMjAwODogb2xseQoJICAgIFJlbmFtZSBCU0laRSBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlL2FycmF5c19zY29wZS5pIHRvIEJCU0laRSB0bwoJICAgIGF2b2lkIGEgY2xhc2ggd2l0aCBCU0laRSBkZWZpbmVkIGJ5IGhlYWRlcnMgb24gQUlYIHdpdGggUGVybAoJICAgIChyZXBvcnRlZCBpbiBTRiMxOTI4MDQ4KS4KCjA0LzIwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgYWJpbGl0eSB0byB3cmFwIGFsbCBwcm90ZWN0ZWQgbWVtYmVycyB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KICAgICAgICAgICAgUHJldmlvdXNseSBvbmx5IHRoZSB2aXJ0dWFsIG1ldGhvZHMgd2VyZSBhdmFpbGFibGUgdG8gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAgTm93IGFsbCBwcm90ZWN0ZWQgbWVtYmVycywgKHN0YXRpYyBhbmQgbm9uLXN0YXRpYyB2YXJpYWJsZXMsIG5vbi12aXJ0dWFsIG1ldGhvZHMKICAgICAgICAgICAgYW5kIHN0YXRpYyBtZXRob2RzKSBhcmUgd3JhcHBlZCB3aGVuIHVzaW5nIHRoZSBhbGxwcm90ZWN0ZWQgbW9kZS4gVGhlIGFsbHByb3RlY3RlZAogICAgICAgICAgICBtb2RlIGlzIHR1cm5lZCBvbiBpbiB0aGUgbW9kdWxlIGRlY2xhcmF0aW9uOgoKICAgICAgICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIsIGFsbHByb3RlY3RlZD0iMSIpIG1vZHVsZW5hbWUKClZlcnNpb24gMS4zLjM1ICg3IEFwcmlsIDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNC8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBZGQgbWlzc2luZyBwb2ludGVyIHJlZmVyZW5jZSB0eXBlbWFwcwoKMDQvMDYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHN0YWNrIG92ZXJmbG93IHdoZW4gdXNpbmcgdHlwZW1hcCB3YXJuaW5nIHN1cHByZXNzaW9uLCBlZyAKICAgICAgICAgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9UWVBFTUFQX0NIQVJMRUFLX01TRykKCjA0LzA1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzaGFyZWRfcHRyIHR5cGVtYXBzIHNvIHRoYXQgJXB5dGhvbm5vbmR5bmFtaWMgY2FuIGJlIHVzZWQuIEFsc28gY29ycmVjdHMKICAgICAgICAgICAgZGlzcGxheSBvZiB0aGUgcHJveHkgY2xhc3MgdHlwZS4gUmVwb3J0ZWQgYnkgUm9iZXJ0IEx1cHRvbi4KCjA0LzA0LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgJW5ld29iamVjdCByZWZlcmVuY2UgdG8gcHl0aG9uIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnNlY3Rpb24gb2YgbWFudWFsCgkgICAgKHBhdGNoIGZyb20gbWRiZWFjaHkgaW4gU0YjMTg5NDYxMCkuCgowMy8yNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc2hhcmVkX3B0ciB0eXBlbWFwcyB3aGVyZSB0aGUgcG9pbnRlciB0eXBlIGlzIGEgdGVtcGxhdGVkIHR5cGUgd2l0aAogICAgICAgICAgICB3aXRoIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiBSZXBvcnRlZCBieSBSb2JlcnQgTHVwdG9uLgoKMDMvMjcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSB0eXBlbWFwIERJU09XTiBmb3IgU1dJR1RZUEUqIGFuZCBTV0lHVFlQRVtdLCBhbmQgc3VwcG9ydCBmb3IgJWRlbG9iamVjdCBmZWF0dXJlLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvb3duZXIgd2hpY2ggZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50LgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICMxODQ0MzAxIGZyb20gTW9udHkgVGF5bG9yIHRvIHN1cHByZXNzIGVudW0gY29uc3RydWN0b3IKICAgICAgICAgICAgdW51c2VkIHdhcm5pbmdzLgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzE5MjQ1MjQgZnJvbSBDYXNleSBSYXltb25kc29uIHdoaWNoIGVuc3VyZXMgdGhlCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIiBtZXNzYWdlIGlzIGRpc3BsYXllZCB3aGVuIGF0dGVtcHRpbmcgdG8gY2FsbCBhCiAgICAgICAgICAgIGNvbnN0cnVjdG9yIG9uIGEgY2xhc3MgdGhhdCBkb2Vzbid0IGhhdmUgYSBjb25zdHJ1Y3RvciB3cmFwcGVyLCBlZyBpZgogICAgICAgICAgICB0aGUgQysrIGNsYXNzIGlzIGFic3RyYWN0LgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzE5MjU3MDIgZnJvbSBDYXNleSBSYXltb25kc29uIHdoaWNoIHJlbW92ZXMgd2FybmluZyA1MTIKICAgICAgICAgICAgZm9yIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLgoKMDMvMjYvMjAwODogb2xseQoJICAgIFtQeXRob25dIEFwcGx5IEdDQyA0LjMgd2FybmluZ3MgcGF0Y2ggZnJvbSBQaGlsaXBwIFRob21hcwoJICAgIChTRiMxOTI1MTIyKS4KCjAzLzIxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFRocmVhZCBzYWZldHkgcGF0Y2ggZm9yIFNUTCBpdGVyYXRvcnMgZnJvbSBBYmhpbmFuZGFuIEphaW4uCgowMy8xNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCAlbHVhY29kZSBmZWF0dXJlIHRvIGFkZCBzb3VyY2UgY29kZSBpbnRvIHdyYXBwZXJzLgogICAgICAgICAgICBVcGRhdGVkIGRvY3VtZW50YXRpb24gdG8gZG9jdW1lbnQgdGhpcy4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2FycmF5cyB0byBzaG93IGl0cyB1c2UgKGFuZCB0eXBlbWFwcykKCjAzLzE3LzIwMDg6IG9sbHkKCSAgICBGaXggbm9ucG9ydGFibGUgc2VkIHVzYWdlIHdoaWNoIGZhaWxlZCBvbiBNYWMgT1MgWCAoYW5kIHByb2JhYmx5CgkgICAgb3RoZXIgcGxhdGZvcm1zKS4gIEZpeGVzIFNGIzE5MDM2MTIuCgowMy8xNy8yMDA4OiBvbGx5CgkgICAgRml4IG1lbW9yeSBsZWFrIGluIFNXSUcncyBwYXJzZXIgKGJhc2VkIG9uIHBhdGNoIGZyb20gUnVzc2VsbAoJICAgIEJyeWFudCBpbiBTRiMxOTE0MDIzKS4KCjAzLzEyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWcgIzE4NzgyODUgLSB1bm5lY2Vzc2FyeSBjYXN0IGZvciBDIHN0cnVjdCBjcmVhdGlvbiB3cmFwcGVycy4KCjAzLzEyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFJlbW92ZSBkZWJ1Z2dpbmcgaW5mbyB3aGVuIHVzaW5nIHNoYXJlZF9wdHIgc3VwcG9ydAoKMDMvMDYvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gVXBkYXRlZCBkb2N1bWVudGF0aW9uIGZvciBMdWEgZXhjZXB0aW9ucy4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2V4Y2VwdGlvbiBhbmQgRXhhbXBsZXMvbHVhL2VtYmVkMi4KICAgICAgICAgICAgU21hbGwgdXBkYXRlcyB0byB0aGUgdHlwZW1hcHMuCgowMy8wNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEFkZCBjaGFyIComIHR5cGVtYXBzLgoKMDMvMDQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IG9jY2FzaW9uYWwgc2VnIGZhdWx0IHdoZW4gYXR0ZW1wdGluZyB0byByZXBvcnQgb3ZlcmxvYWRlZCBtZXRob2RzIGFzIGJlaW5nIGlnbm9yZWQuCgowMi8yOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4ICMxOTA0NTM3IFN3aWcgY2F1c2VzIGEgUGVybCB3YXJuaW5nICJ4IHVzZWQgb25seSBvbmNlIiBpbiBQZXJsIDUuMTAKICAgICAgICAgICAgcmVwb3J0ZWQgYnkgQXJpIEpvbG1hCgowMi8yOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgc2hhcmVkX3B0ciB2YXJpbi92YXJvdXQgdHlwZW1hcHMgZm9yIHdyYXBwaW5nIGdsb2JhbCB2YXJpYWJsZXMuCgowMi8yNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJHdyYXBuYW1lIHRvIHdvcmsgaW4gJWV4Y2VwdGlvbiAoZml4ZXMgc29tZSB3cmFwOm5hbWUgYXNzZXJ0aW9ucykKClZlcnNpb24gMS4zLjM0ICgyNyBGZWJydWFyeSAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAyLzEzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggd3JhcHBpbmcgb2YgZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXIgdmFyaWFibGVzLgoKMDIvMTMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIG5ldyBzcGVjaWFsIHZhcmlhYmxlcyBmb3IgdXNlIHdpdGhpbiAlZXhjZXB0aW9uOgogICAgICAgICAgICAgICR3cmFwbmFtZSAtIGxhbmd1YWdlIHNwZWNpZmljIHdyYXBwZXIgbmFtZQogICAgICAgICAgICAgICRvdmVybmFtZSAtIGlmIGEgbWV0aG9kIGlzIG92ZXJsb2FkZWQgdGhpcyBjb250YWlucyB0aGUgZXh0cmEgbWFuZ2xpbmcgdXNlZCBvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3ZlcmxvYWRlZCBtZXRob2QKICAgICAgICAgICAgICAkZGVjbCAgICAgLSB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZCAKICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHRoZSByZXR1cm4gdHlwZQogICAgICAgICAgICAgICRmdWxsZGVjbCAtIHRoZSBmdWxseSBxdWFsaWZpZWQgQy9DKysgZGVjbGFyYXRpb24gb2YgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkIAogICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyB0aGUgcmV0dXJuIHR5cGUKCjAyLzEyLzIwMDg6IGRyam9lCiAgICAgICAgICAgIFtSXSBOb3cgc2V0dGluZyBTNCBmbGFnIGluIFNXSUcgY3JlYXRlZCBvYmplY3RzLiAgVGhpcwogICAgICAgICAgICBmaXhlcyBSLVNXSUcgZm9yIDIuNiBhbmQgd2FybmluZyBmb3IgMi42IGZhaWx1cmUgaGFzIGJlZW4gcmVtb3ZlZC4KCjAyLzExLzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgcGF0Y2ggYnkgVG9yc3RlbiBMYW5kc2Nob2ZmIHRvIGZpeCB0aGUgdW5hcnkgbWludXMgaXNzdWUKICAgICAgICAgICAgUmFuICdhc3R5bGUgLS1zdHlsZT1rciAtMicgYWNyb3NzIGx1YS5jeHggdG8gbmVhdGVuIGl0IHVwCgowMi8xMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBCdW1wIFNXSUdfUlVOVElNRV9WRVJTSU9OIHRvIDQuIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgcmVjZW50bHkgaW50cm9kdWNlZCBBUEkgCiAgICAgICAgICAgIGNoYW5nZSBpbiB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMsIGllIGNoYW5nZSBpbiBkZWZpbml0aW9uIG9mIHN3aWdfY29udmVydGVyX2Z1bmMuCiAgICAgICAgICAgIEFueW9uZSBjYWxsaW5nIFNXSUdfVHlwZUNhc3QgbXVzdCBwYXNzIGluIGEgdmFsaWQgdmFsdWUgZm9yIHRoZSBuZXcgYWRkaXRpb25hbAogICAgICAgICAgICAodGhpcmQpIHBhcmFtZXRlciBhbmQgdGhlbiBoYW5kbGUgdGhlIG5ld2x5IGNyZWF0ZWQgbWVtb3J5IGlmIHRoZSByZXR1cm5lZCB2YWx1ZQogICAgICAgICAgICBpcyBzZXQgdG8gU1dJR19DQVNUX05FV19NRU1PUlkgZWxzZSBhIG1lbW9yeSBsZWFrIHdpbGwgZW5zdWUuCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBFeHBlcmltZW50YWwgc2hhcmVkX3B0ciB0eXBlbWFwcyBhZGRlZC4gVXNhZ2UgaXMgdGhlIHNhbWUgYXMgdGhlIHJlY2VudGx5CiAgICAgICAgICAgIGFkZGVkIEphdmEgYW5kIEMjIHNoYXJlZF9wdHIgdHlwZW1hcHMuIFR3byBtYWNyb3MgYXJlIGF2YWlsYWJsZSwgYWx0aG91Z2ggdGhlc2UKICAgICAgICAgICAgbWF5IHdlbGwgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb246CgogICAgICAgICAgICBGb3IgYmFzZSBjbGFzc2VzIG9yIGNsYXNzZXMgbm90IGluIGFuIGluaGVyaXRhbmNlIGNoYWluOgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICBGb3IgZGVyaXZlZCBjbGFzc2VzOgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCgogICAgICAgICAgICBUaGUgUFJPWFlDTEFTUyBpcyB0aGUgbmFtZSBvZiB0aGUgcHJveHkgY2xhc3MsIGJ1dCBpcyBvbmx5IHJlcXVpcmVkIGZvciBKYXZhL0MjLgogICAgICAgICAgICBFeGFtcGxlIHVzYWdlOgoKICAgICAgICAgICAgICAlaW5jbHVkZSAiYm9vc3Rfc2hhcmVkX3B0ci5pIgoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoS2xhc3MsIFNwYWNlOjpLbGFzcykKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChLbGFzc0Rlcml2ZWQsIFNwYWNlOjpLbGFzcywgU3BhY2U6OktsYXNzRGVyaXZlZCkKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBLbGFzcyB7IC4uLiB9OwogICAgICAgICAgICAgICAgc3RydWN0IEtsYXNzRGVyaXZlZCA6IEtsYXNzIHsgLi4uIH07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgRnVydGhlciBkZXRhaWxzIHRvIGZvbGxvdyBpbiBmdXR1cmUgZG9jdW1lbnRhdGlvbiwgYnV0IHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMKICAgICAgICAgICAgc2hvdWxkIGJlIG5vdGVkOgoKICAgICAgICAgICAgLSBOb3QgcmVzdHJpY3RlZCB0byBib29zdDo6c2hhcmVkX3B0ciwgZWcgc3RkOjp0cjE6OnNoYXJlZF9wdHIgY2FuIGFsc28gYmUgdXNlZC4KICAgICAgICAgICAgLSBBdmFpbGFibGUgdHlwZW1hcCBncm91cHM6CiAgICAgICAgICAgICAgKGEpIFR5cGVtYXBzIGZvciBzaGFyZWRfcHRyIHBhc3NlZCBieSB2YWx1ZSwgcmVmZXJlbmNlLCBwb2ludGVyIGFuZCBwb2ludGVyIAogICAgICAgICAgICAgICAgICByZWZlcmVuY2UuCiAgICAgICAgICAgIC0gKGIpIFR5cGVtYXBzIGZvciBwYXNzaW5nIGJ5IHJhdyB2YWx1ZSwgcmF3IHBvaW50ZXIsIHJhdyByZWZlcmVuY2UsIHJhdyBwb2ludGVyCiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZS4gCiAgICAgICAgICAgIC0gVGhlIGNvZGUgYmVpbmcgd3JhcHBlZCBkb2VzIG5vdCBldmVuIGhhdmUgdG8gdXNlIHNoYXJlZF9wdHIsIFNXSUcgY2FuIHVzZQogICAgICAgICAgICAgIHNoYXJlZF9wdHIgYXMgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBtZWNoYW5pc20gaW5zdGVhZCBvZiBhIHJhdyBwb2ludGVyIGR1ZSB0byAKICAgICAgICAgICAgICB0aGUgdHlwZW1hcHMgaW4gZ3JvdXAgKGIpIGFib3ZlLgogICAgICAgICAgICAtIE5vIGFycmF5IHN1cHBvcnQgYXMgc2hhcmVkX3B0ciBkb2VzIG5vdCBzdXBwb3J0IGFycmF5cy4KICAgICAgICAgICAgLSBUaGlzIHdvcmtzIHF1aXRlIGRpZmZlcmVudGx5IHRvIHRoZSB1c3VhbCBTV0lHIHNtYXJ0IHBvaW50ZXIgc3VwcG9ydCB3aGVuCiAgICAgICAgICAgICAgb3BlcmF0b3ItPiBpcyBwYXJzZWQgYnkgU1dJRzoKICAgICAgICAgICAgICAtIEFuIGFkZGl0aW9uYWwgc21hcnQgcG9pbnRlciBjbGFzcyBpcyBub3QgZ2VuZXJhdGVkIHJlZHVjaW5nIGNvZGUgYmxvYXQgaW4KICAgICAgICAgICAgICAgIHRoZSB3cmFwcGVycy4KICAgICAgICAgICAgICAtIFVzaW5nIHNtYXJ0IHBvaW50ZXJzIGFuZCByYXcgcG9pbnRlcnMgY2FuIGJlIG1peGVkIHNlYW1sZXNzbHkuCiAgICAgICAgICAgICAgLSBNaXNzaW5nIGNvbnN0cnVjdG9ycyBmb3IgdGhlIHNtYXJ0IHBvaW50ZXJzIGlzIG5vIGxvbmdlciBhIHByb2JsZW0gYW5kIHNvCiAgICAgICAgICAgICAgICBzZXBhcmF0ZSBmYWN0b3J5IHR5cGUgZnVuY3Rpb25zIGRvIG5vdCBoYXZlIHRvIGJlIHdyaXR0ZW4gYW5kIHdyYXBwZWQuCiAgICAgICAgICAgICAgLSBUaGUgaW1wbGljaXQgQysrIHNoYXJlZF9wdHI8IGRlcml2ZWQgY2xhc3MgPiB0byBzaGFyZWRfcHRyPCBiYXNlIGNsYXNzID4KICAgICAgICAgICAgICAgIGNhc3QgYWxzbyB3b3JrcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiBUaGlzIG5lZ2F0ZXMgdGhlIG5lY2Vzc2l0eSB0byB3cml0ZQogICAgICAgICAgICAgICAgYW4gZXhwbGljaXQgaGVscGVyIGNhc3QgZnVuY3Rpb24gcHJvdmlkaW5nIHRoZSB1cGNhc3Qgd2hpY2ggd291bGQgbmVlZAogICAgICAgICAgICAgICAgY2FsbGluZyBwcmlvciB0byBwYXNzaW5nIGEgZGVyaXZlZCBjbGFzcyB0byBhIG1ldGhvZCB0YWtpbmcgYSBzaGFyZWRfcHRyIHRvCiAgICAgICAgICAgICAgICBhIGJhc2UgY2xhc3MuCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgc3VwcG9ydCBmb3Igb3ZlcnJpZGluZyB0aGUgY2xhc3MgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHZpYSBhIG5ldwogICAgICAgICAgICAic21hcnRwdHIiIGZlYXR1cmUuIFRoaXMgaXMgYSB2ZXJ5IGxvdyBsZXZlbCBvZiBjdXN0b21pc2F0aW9uIG1vc3QgdXNlcnMKICAgICAgICAgICAgd291bGQgbmV2ZXIgbmVlZCB0byBrbm93LiBUaGUgZmVhdHVyZSB3aWxsIHR5cGljYWxseSBiZSB1c2VkIGZvciBpbnRydXNpdmUgCiAgICAgICAgICAgIHNtYXJ0IHBvaW50ZXJzIGFsb25nIHdpdGggYWRkaXRpb25hbCB0eXBlbWFwcy4gRXhhbXBsZSB1c2FnZSBvZiB0aGUgZmVhdHVyZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIiwgbm9ibG9jaz0xKSBGb28geyBib29zdDo6c2hhcmVkX3B0cjwgRm9vID4gfQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKCiAgICAgICAgICAgIFRoZSBnZW5lcmF0ZWQgRm9vX3N3aWdyZWdpc3RlciBmdW5jdGlvbiB3aWxsIHRoZW4gcmVnaXN0ZXIgYm9vc3Q6OnNoYXJlZCA8IEZvbyA+CiAgICAgICAgICAgIChTV0lHVFlQRV9wX2Jvb3N0X19zaGFyZWRfcHRyVEZvb190IGluc3RlYWQgb2YgU1dJR1RZUEVfcF9Gb28pIGFzIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAgIHR5cGUgZm9yIGluc3RhbnRpYXRpb25zIG9mIEZvby4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZlYXR1cmVzIG5vdyBzdXBwb3J0cyB0aGUgb3B0aW9uYWwgJ25vYmxvY2snIGF0dHJpYnV0ZSBmb3IgYWxsIHVzYWdlIG9mICVmZWF0dXJlLiAKICAgICAgICAgICAgV2hlbiBzcGVjaWZpZWQsIHRoZSB7IH0gYnJhY2VzIGFyZSByZW1vdmVkIGZyb20gdGhlIGZlYXR1cmUgY29kZS4gVGhpcyBpcyBpZGVudGljYWwKICAgICAgICAgICAgaW4gYmVoYXZpb3VyIHRvIHVzYWdlIG9mICdub2Jsb2NrJyBpbiB0eXBlbWFwcyBhbmQgaXMgdXNlZCB3aGVuIHRoZSBwcmVwcm9jZXNzb3IKICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG8gb3BlcmF0ZSBvbiB0aGUgY29kZSBpbiB0aGUgZmVhdHVyZSBhbmQgdGhlIGVuY2xvc2luZyB7IH0gYnJhY2VzCiAgICAgICAgICAgIGFyZSBub3QgcmVxdWlyZWQuIEV4YW1wbGU6CgogICAgICAgICAgICAgICNkZWZpbmUgRk9PIGZvbwogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIsIG5vYmxvY2s9IjEiKSB7IEZPTzo6YmFyIH0KCiAgICAgICAgICAgIFRoZSBwcmVwcm9jZXNzb3IgdGhlbiByZWR1Y2VzIHRoaXMgYXMgaWYgdGhpcyBoYWQgYmVlbiB1c2VkIGluc3RlYWQ6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIpICJmb286OmJhciIKCjAyLzAxLzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggZm9ybWF0IHN0cmluZyBidWcgKFNGIzE4ODIyMjApLgoKMDEvMzEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkaXRpb25zIHRvIHRoZSAldHlwZXMgZGlyZWN0aXZlLiBOb3cgdGhlIGNvbnZlcnNpb24gLyBjYXN0aW5nIGNvZGUgY2FuIGJlCiAgICAgICAgICAgIG92ZXJyaWRkZW4gdG8gc29tZSBjdXN0b20gY29kZSBpbiB0aGUgJXR5cGVzIGRpcmVjdGl2ZSwgbGlrZSBzbzoKCiAgICAgICAgICAgICAgJXR5cGVzKGZyb210eXBlID0gdG90eXBlKSAlewogICAgICAgICAgICAgICAgLi4uIGNvZGUgdG8gY29udmVydCBmcm9tdHlwZSB0byB0b3R5cGUgYW5kIHJldHVybiAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIHNwZWNpYWwgdmFyaWFibGUgJGZyb20gd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIG9mIHRoZQogICAgICAgICAgICB0eXBlIGJlaW5nIGNvbnZlcnRlZCBmcm9tLiBUaGUgY29kZSBtdXN0IHJldHVybiB0aGUgdG90eXBlIGNhc3QgdG8gdm9pZCAqLiBFeGFtcGxlOgoKICAgICAgICAgICAgICBjbGFzcyBUaW1lOwogICAgICAgICAgICAgIGNsYXNzIERhdGU7CiAgICAgICAgICAgICAgRGF0ZSAmVGltZTo6ZGF0ZUZyb21UaW1lKCk7CgogICAgICAgICAgICAgICV0eXBlcyhUaW1lID0gRGF0ZSkgJXsKICAgICAgICAgICAgICAgIFRpbWUgKnQgPSAoVGltZSAqKSRmcm9tOwogICAgICAgICAgICAgICAgRGF0ZSAmZCA9IHQtPmRhdGVGcm9tVGltZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopICZkOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICByZXN1bHRpbmcgaW4gdGhlIGNvbnZlcnNpb24gLyBjYXN0aW5nIGNvZGUgbG9va2luZyBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgICAgICAgc3RhdGljIHZvaWQgKl9wX1RpbWVUb19wX0RhdGUodm9pZCAqeCkgewogICAgICAgICAgICAgICAgVGltZSAqdCA9IChUaW1lICopeDsKICAgICAgICAgICAgICAgIERhdGUgJmQgPSB0LT5kYXRlRnJvbVRpbWUoKTsKICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKSAmZDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGlzIGFkdmFuY2VkIHVzYWdlLCBwbGVhc2UgdXNlIG9ubHkgaWYgeW91IHVuZGVyc3RhbmQgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0uCgowMS8zMC8yMDA4OiBtZ29zc2FnZQoJICAgIFNtYWxsIHVwZGF0ZSB0byBkb2N1bWVudGF0aW9uIGluIFR5cGVtYXBzLmh0bWwsIHRvIHdhcm4gYWJvdXQgdXNlIG9mIGxvY2FsIAoJICAgIHZhcmlhYmxlcyBpbiB0eXBlbWFwcyBmb3IgbXVsdGlwbGUgdHlwZXMuCgowMS8yNS8yMDA4OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggYnVnIHJlcG9ydGVkIGJ5IEtldmluIE1pbGxzIGluIEFSUkFZU09GQ0xBU1NFUyB0eXBlbWFwcyB3aGVyZSBhbnkKICAgICAgICAgICAgY2hhbmdlcyBtYWRlIHRvIGFuIGFycmF5IGVsZW1lbnQgcGFzc2VkIGZyb20gSmF2YSB0byBDIGFyZSBub3QgcmVmbGVjdGVkIGJhY2sKICAgICAgICAgICAgaW50byBKYXZhLgoKMDEvMjQvMjAwODogbWdvc3NhZ2UKCSAgICBNb3JlIHVwZGF0ZXMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGRldGVjdGluZyBsdWEuCgkgICAgQWxzbyBsb29rcyBpbiAvdXNyL2luY2x1ZGUvbHVhKgoJICAgIEFsc28gY2hhbmdlZCB0eXBlbWFwcy5pIG5vdCB0byBjaGVjayBmb3IgTlVMTCBiZWZvcmUgZnJlZWluZyBhIHBvaW50ZXIKCjAxLzIxLzIwMDg6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRm9yIFNUTCBjb250YWluZXJzLCBTV0lHIG5vIGxvbmdlciBhdHRlbXB0cyB0byBjb252ZXJ0IGZyb20gb25lCiAgICAgICAgICAgIFNUTCBjb250YWluZXIgdG8gYW5vdGhlciwgZWcgZnJvbSBzdGQ6OnZlY3RvcjxpbnQ+IHRvIHN0ZDo6dmVjdG9yPGRvdWJsZT4KICAgICAgICAgICAgb3Igc3RkOjpsaXN0PGludD4gdG8gc3RkOjp2ZWN0b3I8aW50PiBvciBldmVuIHN0ZDo6dmVjdG9yPEZvbz4gdG8KICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QmFyPiBhcyBpdCBwcmV2aW91c2x5IGRpZC4gSW4gZmFjdCBTV0lHIG5vIGxvbmdlciBhdHRlbXB0cyB0bwogICAgICAgICAgICBjb252ZXJ0IGFueSBTV0lHIHdyYXBwZWQgQysrIHByb3h5IGNsYXNzIHRoYXQgaXMgYWxzbyBhIFB5dGhvbiBzZXF1ZW5jZSwKICAgICAgICAgICAgd2hlcmVhcyBwcmV2aW91c2x5IGl0IHdvdWxkLiBBbnkgbm9uLVNXSUcgUHl0aG9uIHNlcXVlbmNlIHdpbGwgc3RpbGwgYmUKICAgICAgICAgICAgYWNjZXB0ZWQgd2hlcmV2ZXIgYW4gU1RMIGNvbnRhaW5lciBpcyBhY2NlcHRlZC4gT3ZlcmxvYWRlZCBtZXRob2RzIHVzaW5nCiAgICAgICAgICAgIGNvbnRhaW5lcnMgc2hvdWxkIGJlIGZhc3Rlci4KCjAxLzE4LzIwMDg6IHdzZnVsdG9uCgkgICAgW0MjXSBBZGQgJ2RpcmVjdG9yaW5hdHRyaWJ1dGVzJyBhbmQgJ2RpcmVjdG9yb3V0YXR0cmlidXRlcycgdHlwZW1hcCBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGZvciB0aGUgaW10eXBlIHR5cGVtYXAuIFRoZXNlIHNob3VsZCBjb250YWluIEMjIGF0dHJpYnV0ZXMgd2hpY2ggd2lsbAogICAgICAgICAgICBiZSBnZW5lcmF0ZWQgaW50byB0aGUgQyMgZGlyZWN0b3IgZGVsZWdhdGUgbWV0aG9kcy4KCjAxLzE4LzIwMDg6IG9sbHkKCSAgICBGaXggaGFuZGxpbmcgb2YgYnl0ZSB2YWx1ZSAyNTUgaW4gaW5wdXQgZmlsZXMgb24gcGxhdGZvcm1zIHdoZXJlCgkgICAgY2hhciBpcyBzaWduZWQgKGl0IHdhcyBnZXR0aW5nIG1hcHBlZCB0byBFT0YpLiAgRml4ZXMgU0YjMTUxODIxOS4KCjAxLzE2LzIwMDg6IHdzZnVsdG9uCgkgICAgRml4IHRlbXBsYXRlIG1lbWJlciB2YXJpYWJsZXMgd3JhcHBlZCBieSBhIHNtYXJ0IHBvaW50ZXIuIEJ1ZyByZXBvcnRlZCAKICAgICAgICAgICAgYnkgUm9iZXJ0IEx1cHRvbi4KCjAxLzE0LzIwMDg6IG1nb3NzYWdlCgkgICAgU3Vic3RhbnRpYWwgY2hhbmdlcyB0byBjb25maWd1cmUgc2NyaXB0IGZvciBkZXRlY3RpbmcgbHVhLgoJICAgICAgQ29kZSBjYW4gbm93IGxpbmsgdG8gbGlibHVhLmEsIGxpYmx1YTUwLmEgb3IgbGlibHVhNTEuYQoJICAgICAgSXQncyBhbHNvIGEgbG90IG5lYXRlciBub3cuCgoxMi8xNi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBCYWNrZWQgb3V0ICMxNzk4NzI4IC0gbnVtYmVycyBjYW4gYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyB0YWtpbmcgY2hhciAqCgoxMi8xNi8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAjMTgzMjYxMyAtIFRlbXBsYXRlcyBhbmQgc29tZSB0eXBlZGVmcyBpbnZvbHZpbmcgcG9pbnRlcnMgb3IgZnVuY3Rpb24gcG9pbnRlcnMKCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAjMTYzMjYyNSAtIENvbXBpbGF0aW9uIGVycm9ycyBvbiBWaXN1YWwgQysrIDYgd2hlbiB1c2luZyBkaXJlY3RvcnMuCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBGaXggIzE3OTg3MjggLSBudW1iZXJzIGNhbiBiZSBwYXNzZWQgdG8gZnVuY3Rpb25zIHRha2luZyBjaGFyICouCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAjMTgxOTg0NyAldGVtcGxhdGUgd2l0aCBqdXN0IG9uZSBkZWZhdWx0IHRlbXBsYXRlIHBhcmFtZXRlciAKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCA9IGludD4gY2xhc3MgRm9vIHsuLi59OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29EZWZhdWx0KSBGb288PjsKCjEyLzEyLzIwMDc6IG1nb3NzYWdlCgkgICAgW0x1YV0gU21hbGwgY29ycmVjdGlvbiBvbiBMdWEuaHRtbAoKMTIvMDkvMjAwNzogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCAjMTgzODI0OCBmcm9tIE1vbnR5IFRheWxvciBmb3IgdnBhdGggYnVpbGRzIG9mIFNXSUcuCgoxMi8wOC8yMDA3OiB3c2Z1bHRvbgoJICAgIFtMdWFdIEZpeGVzIHRvIHJlbW92ZSBnY2MtNC4yIHdhcm5pbmdzCgoxMi8wNi8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAjMTczNDQxNSAtIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBzdWNoIGFzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSB0X2l0ZW0sIHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyB0X2FsbG9jID0gcGZjOjphbGxvY19mYXN0ID4KICAgICAgICAgICAgICAgIGNsYXNzIGxpc3RfdCA6IHB1YmxpYyBsaXN0X2ltcGxfdDx0X2l0ZW0scGZjOjphcnJheV90PHRfaXRlbSx0X2FsbG9jPiA+IHsgLi4uIH07CgoxMi8wNC8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIEZpeCBhIGJ1ZyBpbiB0aGUgY2xhc3MgaGllcmFjaHkgY29kZSwgd2hlcmUgdGhlIG1ldGhvZHMgd2VyZSBub3QgcHJvcGFnYXRlZCwgCgkgICAgaWYgdGhlIG5hbWUgb3JkZXJpbmcgd2FzIGluIGEgY2VydGFpbiBvcmRlci4KCSAgICBBZGRlZCBuZXcgZXhhbXBsZSBwcm9ncmFtcyAoZHVhbCwgZW1iZWQpIGFuZCBydW50aW1lIHRlc3RzIGZvciB0ZXN0LXN1aXRlLgoKMTEvMzAvMjAwNzogd3NmdWx0b24KCSAgICBGaXggdXNpbmcgc3RhdGVtZW50cyB1c2luZyBhIGJhc2UgY2xhc3MgbWV0aG9kIHdoZXJlIHRoZSBtZXRob2RzIHdlcmUgb3ZlcmxvYWRlZC4KICAgICAgICAgICAgRGVwZW5kaW5nIG9uIHRoZSBvcmRlciBvZiB0aGUgdXNpbmcgc3RhdGVtZW50cyBhbmQgbWV0aG9kIGRlY2xhcmF0aW9ucywgdGhlc2UKICAgICAgICAgICAgd2VyZSBwcmV2aW91c2x5IGdlbmVyYXRpbmcgdW5jb21waWxhYmxlIHdyYXBwZXJzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmdW5rKCk7CiAgICAgICAgICAgICAgICB1c2luZyBCYXNlOjpmdW5rOwogICAgICAgICAgICAgIH07CgpWZXJzaW9uIDEuMy4zMyAoTm92ZW1iZXIgMjMsIDIwMDcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzIxLzIwMDc6IG1pa2VsCgkgICAgW2FsbGVncm9jbF0gb21pdCBwcml2YXRlIHNsb3QgdHlwZSBpbmZvIGluIHRoZSBjbGFzc2VzL3R5cGVzCgkgICAgZGVmaW5lZCBvbiB0aGUgbGlzcCBzaWRlLiBGaXggYnVnIGluIG1hcHBpbmcgb2YgQy8rKyB0eXBlcwoJICAgIHRvIGxpc3AgdHlwZXMuIEZpeCB0eXBvIGluIG1vZHVsZXMgZ2VuZXJhdGVkIGRlZnBhY2thZ2UgZm9ybS4KCSAgICBIYXZlIHN0ZDo6c3RyaW5nIConcyBhdXRvbWF0aWNhbGx5IG1hcnNoYWxsZWQgYmV0d2VlbiBmb3JlaWduCgkgICAgYW5kIGxpc3Agc3RyaW5ncy4KCQoxMS8yMC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRmlsbCBpbiBQeXRob24gRGljdGlvbmFyeSBmdW5jdGlvbnMgbGlzdCAocGF0Y2ggZnJvbQoJICAgIEplbG1lciBWZXJub29paiBwb3N0ZWQgdG8gc3dpZy1kZXZlbCkuCgoxMS8yMC8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIGluIHRoZSBDIHNjYW5uZXIgcmVsYXRlZCB0byBiYWNrc2xhc2ggY2hhcmFjdGVycy4KCjExLzE5LzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCBicm9rZW4gY29tcGlsYXRpb24gb2YgQysrIHdyYXBwZXJzIG9uIHNvbWUgY29tcGlsZXJzLgoKMTEvMTYvMjAwNzogb2xseQoJICAgIFtQeXRob25dIERvbid0IHBhc3MgUHlfc3NpemVfdCBmb3IgYSAlZCBwcmludGYtbGlrZSBmb3JtYXQgYXMKCSAgICB0aGF0J3MgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuIHNpemVvZihQeV9zc2l6ZV90KSAhPSBzaXplb2YoaW50KS4KClZlcnNpb24gMS4zLjMyIChOb3ZlbWJlciAxNSwgMjAwNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIFBhY2thZ2UgbmFtZSBhbmQgZGxsIG5hbWUgaXMgbm93IHRoZSBzYW1lIGFzIHRoZSBTV0lHIG1vZHVsZQogICAgICAgICAgICBuYW1lLiBJdCB1c2VkIHRvIGJlIHRoZSBtb2R1bGUgbmFtZSB3aXRoIF93cmFwIGFzIGEgc3VmZml4LiBUaGUgcGFja2FnZQogICAgICAgICAgICBhbmQgZGxsIG5hbWVzIGNhbiBiZSBtb2RpZmllZCB1c2luZyB0aGUgLXBhY2thZ2UgYW5kIC1kbGwgY29tbWFuZGxpbmUKICAgICAgICAgICAgb3B0aW9ucy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMTEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEFkZCBzdXBwb3J0IGZvciBXaW5kb3dzIChWaXN1YWwgQysrIDggdGVzdGVkKQoKMTEvMTAvMjAwNzogb2xseQoJICAgIFtwaHBdIEZpeCBtYWtlZmlsZSBnZW5lcmF0ZWQgYnkgLW1ha2UgKFNGIzE2MzM2NzkpLiAgVXBkYXRlCgkgICAgZG9jdW1lbnRhdGlvbiB0byBtYXJrICItbWFrZSIgYXMgZGVwcmVjYXRlZCAobm9uZSBvZiB0aGUgb3RoZXIKCSAgICBTV0lHIGJhY2tlbmRzIHNlZW0gdG8gb2ZmZXIgc3VjaCBhIGZlYXR1cmUsIGl0IGNhbid0IHJlYWxpc3RpY2FsbHkKCSAgICBnZW5lcmF0ZSBhIGZ1bGx5IHBvcnRhYmxlIG1ha2VmaWxlLCBhbmQgdGhlIGNvbW1hbmRzIHRvIGJ1aWxkIGFuCgkgICAgZXh0ZW5zaW9uIGFyZSBlYXN5IGVub3VnaCB0byB3cml0ZSBmb3IgdGhlIHVzZXIncyBwcmVmZXJyZWQgYnVpbGQKCSAgICB0b29sKS4gIEFsc28gcmVjb21tZW5kIGFnYWluc3QgdGhlIHVzZSBvZiAiLXBocGZ1bGwiIChpdCdzIG9ubHkKCSAgICByZWFsbHkgdXNlZnVsIHdoZW4gc3RhdGljIGxpbmtpbmcsIGFuZCBhIGR5bmFtaWNhbGx5IGxvYWRhYmxlCgkgICAgbW9kdWxlIGlzIHZpcnR1YWxseSBhbHdheXMgdGhlIGJldHRlciBhcHByb2FjaCkuCgoxMS8wOS8yMDA3OiBvbGx5CgkgICAgRml4IC0taGVscCBvdXRwdXQgdG8gbm90ZSB0aGF0IGBleHBvcnQgU1dJR19GRUFUVVJFUycgaXMgcmVxdWlyZWQuCgoxMC8yOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHNlZyBmYXVsdCBvbiBXaW5kb3dzCiAgICAgICAgICAgIFtSXSBFeGFtcGxlcyBSIHNjcmlwdHMgYXJlIG5vdyBwbGF0Zm9ybSBpbmRlcGVuZGVudAoKMTAvMzAvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBmaXhlZCBidWcgaW4gdGVtcGxhdGUgY2xhc3NlcyB3aGljaCBjYXNlcyB0ZW1wbGF0ZV9kZWZhdWx0MgoJICAgIGFuZCB0ZW1wbGF0ZV9zcGVjaWFsaXphdGlvbl9kZWZhcmcgdG8gZmFpbC4KCSAgICBBZGRlZCBzZXZlcmFsIHdhcm5pbmcgZmlsdGVycyBpbnRvIHRoZSBvdmVybG9hZCdzIHRlc3QgY2FzZXMuCgkgICAgQWRkZWQgcnVudGltZSB0ZXN0cyBmb3Igc2V2ZXJhbCBjb2Rlcy4KCSAgICBZb3UgY2FuIG5vdyBtYWtlIGNoZWNrLWx1YS10ZXN0LXN1aXRlIHdpdGggbm8gZXJyb3JzIGFuZCBvbmx5IGEgZmV3IHdhcm5pbmdzLgoKMTAvMzAvMjAwNzogb2xseQoJICAgIFtndWlsZV0gRml4IHRoZSBjb25maWd1cmUgdGVzdCB0byBwdXQgR1VJTEVMSU5LIGluIExJQlMgbm90IExERkxBR1MKCSAgICAoU0YjMTgyMjQzMCkuCgoxMC8zMC8yMDA3OiBvbGx5CgkgICAgW2d1aWxlXSBGaXggdGhlIGd1aWxlIGV4YW1wbGVzIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCgoxMC8yOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBtZW1iZXIgcG9pbnRlcnMgb24gNjQgYml0IHBsYXRmb3Jtcy4KCjEwLzI4LzIwMDc6IG9sbHkKCSAgICBbbHVhXSBGaXggc3dpZ19sdWFfY2xhc3MgaW5zdGFuY2VzIHRvIGJlIHN0YXRpYyB0byBhbGxvdyBtdWx0aXBsZQoJICAgIFNXSUcgd3JhcHBlcnMgdG8gYmUgY29tcGlsZWQgaW50byB0aGUgc2FtZSBleGVjdXRhYmxlIHN0YXRpY2FsbHkuCgkgICAgUGF0Y2ggZnJvbSBBbmRyZWFzIEZyZWRyaWtzc29uIChwb3N0ZWQgdG8gdGhlIHN3aWcgbWFpbGluZyBsaXN0KS4KCjEwLzI4LzIwMDc6IG9sbHkKCSAgICBbbHVhXSBGaXggRXhhbXBsZXMvbHVhIHRvIHBhc3MgU1JDUyBmb3IgQyB0ZXN0cyByYXRoZXIgdGhhbiBDWFhTUkNTLgoJICAgIFRoZSBjb2RlIGFzIGl0IHdhcyBoYXBwZW5lZCB0byB3b3JrIG9uIHg4NiwgYnV0IGJyb2tlIG9uIHg4Nl82NCAoYW5kCgkgICAgcHJvYmFibHkgYW55IG90aGVyIHBsYXRmb3JtcyB3aGljaCByZXF1aXJlIC1mUElDKS4KCjEwLzI4LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTmV3IGFwcHJvYWNoIGZvciBmaXhpbmcgdW5pbml0aWFsaXNlZCB2YXJpYWJsZSB1c2FnZSBvbiBlcnJvciBpbiBkaXJlY3RvcgogICAgICAgICAgICBtZXRob2RzIHVzaW5nIHRoZSBuZXcgdGVtcGxhdGVkIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIFN3aWdWYWx1ZUluaXQoKS4KCjEwLzI4LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBVc2UgbW9yZSBlZmZpY2llbnQgU3ZQVl9ub2xlbih4KSBpbnN0ZWFkIG9mIFN2UFYoeCxQTF9uYSkgaWYgU3ZQVl9ub2xlbiBpcwogICAgICAgICAgICBzdXBwb3J0ZWQuCgoxMC8yNi8yMDA3OiB3dXp6ZWIKCSAgICBbQ2hpY2tlbl0gRml4IGdsb2JhbCB2YXJpYWJsZXMgb2YgY2xhc3MgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgoJICAgIE90aGVyIG1pbm9yIGZpeGVzLCBzbyBhbGwgdGVzdHMgaW4gdGhlIGNoaWNrZW4gdGVzdCBzdWl0ZSBub3cgcGFzcwoKMTAvMjUvMjAwNzogb2xseQoJICAgIEZpeCBVVEwgdHlwZWNoZWNrIG1hY3JvIGZvciBhIGZ1bmN0aW9uIHRha2luZyBjaGFyW10gb3IgY29uc3QKCSAgICBjaGFyW10gKFNGIzE4MjAxMzIpLgoKMTAvMjIvMjAwNzogbWtvZXBwZQoJICAgIFtHdWlsZV0gRmlsdGVyIG91dCAtYW5zaSAtcGVkYW50aWMgZnJvbSBDRkxBR1Mgd2hpbGUgY29tcGlsaW5nIHRlc3QgcHJvZ3JhbXMgZm9yIEd1aWxlCgkgICAgaW4gY29uZmlndXJlLiAgVGhpcyBlbmFibGVzIHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUgZm9yIEd1aWxlIGlmIGl0IGlzIGluc3RhbGxlZCBhbmQKCSAgICB1c2FibGUuCgoxMC8yMi8yMDA3OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dIEZpeCB0ZXN0Y2FzZXMgYXBwbHlfc2lnbmVkX2NoYXIgYW5kIGFwcGx5X3N0cmluZ3MKCSAgICBieSBhZGRpbmcgZXhwbGljaXQgY2FzdHMgdG8gdGhlIGFwcHJvcHJpYXRlICRsdHlwZS4KCjEwLzIyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgdXNhZ2Ugb24gZXJyb3IgaW4gZGlyZWN0b3IgbWV0aG9kcy4KCjEwLzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQnVnICMxNzk0MjQ3IC0gZml4IGdlbmVyYXRlZCBjb2RlIGZvciBkZXJpdmVkIGNsYXNzZXMgd2hlbiBjc2Jhc2Ugb3IgamF2YWJhc2UKICAgICAgICAgICAgdHlwZW1hcHMgYXJlIHVzZWQgd2l0aCB0aGUgcmVwbGFjZT0iMSIgYXR0cmlidXRlLgoKMTAvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRG9jcyB1cGRhdGVkIHRvIHN1Z2dlc3QgdXNpbmcgZGlzdHV0aWxzLiBQYXRjaCAjMTc5NjY4MSBmcm9tIENocmlzdG9waGVyIEJhcmtlci4KCjEwLzE5LzIwMDc6IG9sbHkKCSAgICBbcGVybDVdIENsZWFyIGVycm5vIGJlZm9yZSBjYWxscyB0byBzdHJ0b2woKSwgc3RydG91bCgpLCBzdHJ0b2xsKCkKCSAgICBhbmQgc3RydG91bGwoKSB3aGljaCB3ZSBjaGVjayBlcnJubyBhZnRlciB0byBhdm9pZCBzZWVpbmcgYSBqdW5rCgkgICAgdmFsdWUgb2YgZXJybm8gaWYgdGhlcmUgaXNuJ3QgYW4gZXJyb3IgaW4gdGhlIGNhbGwuCgoxMC8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBEZXByZWNhdGUgJWF0dHJpYnV0ZV9yZWYgYW5kIHJlcGxhY2Ugd2l0aCAlYXR0cmlidXRlcmVmLiBUaGVyZSBpcyBqdXN0IGFuIGFyZ3VtZW50CiAgICAgICAgICAgIG9yZGVyIGNoYW5nZSBpbiBvcmRlciB0byBtYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoICVhdHRyaWJ1dGUsIGZyb206CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVfcmVmKENsYXNzLCBBdHRyaWJ1dGVUeXBlLCBBY2Nlc3Nvck1ldGhvZCwgQXR0cmlidXRlTmFtZSkKICAgICAgICAgICAgdG8KICAgICAgICAgICAgICAlYXR0cmlidXRlcmVmKENsYXNzLCBBdHRyaWJ1dGVUeXBlLCBBdHRyaWJ1dGVOYW1lLCBBY2Nlc3Nvck1ldGhvZCkKCjEwLzE2LzIwMDc6IG9sbHkKCSAgICBbVGNsXSBGaXggc2V2ZXJhbCBvY2N1cnJlbmNlcyBvZiAid2FybmluZzogZGVwcmVjYXRlZCBjb252ZXJzaW9uCgkgICAgZnJvbSBzdHJpbmcgY29uc3RhbnQgdG8gJ2NoYXIqJyIgZnJvbSBHQ0MgNC4yIGluIGdlbmVyYXRlZCBDL0MrKwoJICAgIGNvZGUuCgoxMC8xNi8yMDA3OiBvbGx5CgkgICAgW1BIUF0gRml4IG1hbnkgb2NjdXJyZW5jZXMgb2YgIndhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbiBmcm9tCgkgICAgc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKiciIGZyb20gR0NDIDQuMiBpbiBnZW5lcmF0ZWQgQy9DKysgY29kZQoJICAgIHdoZW4gY29tcGlsaW5nIHdpdGggYSBuZXcgZW5vdWdoIHZlcnNpb24gb2YgUEhQIDUgKHRlc3RlZCB3aXRoCgkgICAgUEhQIDUuMi4zLCBidXQgUEhQIDUuMi4xIGlzIHByb2JhYmx5IHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50KS4KCjEwLzE1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICMxNzk3MTMzIGZyb20gRGF2aWQgUGllcGdyYXNzIGZpeGVzICVhdHRyaWJ1dGUgd2hlbiB0aGUgZ2V0dGVyIGhhcyB0aGUgc2FtZSBuYW1lCiAgICAgICAgICAgIGFzIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgbm8gbG9uZ2VyIGdlbmVyYXRlIG5vbi1mdW5jdGlvbmFsIHNldHRlciBmb3IgcmVhZC1vbmx5IGF0dHJpYnV0ZXMuCgoxMC8xNS8yMDA3OiBvbGx5CgkgICAgW1RjbF0gUHJldmVudCBTV0lHX1RjbF9Db252ZXJ0UHRyIGZyb20gY2FsbGluZyB0aGUgdW5rbm93biBwcm9jLgoJICAgIEFkZCBFeGFtcGxlcy90Y2wvc3RkX3ZlY3Rvci8gd2hpY2ggdGhpcyBjaGFuZ2UgZml4ZXMuICBQYXRjaAoJICAgIGlzIGZyb20gIkNsaWZmIEMiIGluIFNGIzE4MDk4MTkuCgoxMC8xMi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIERldGFjaEN1cnJlbnRUaHJlYWQgYmFjayBpbiBmb3IgZGlyZWN0b3JzLiBTZWUgZW50cnkgZGF0ZWQgMDgvMTEvMjAwNiBhbmQKICAgICAgICAgICAgc2VhcmNoIGZvciBEZXRhY2hDdXJyZW50VGhyZWFkIG9uIHRoZSBtYWlsaW5nIGxpc3RzIGZvciBkZXRhaWxzLiBUaGUgY3Jhc2hlcyBvbiBTb2xhcmlzCiAgICAgICAgICAgIHNlZW0gdG8gYmUgb25seSBwcmVzZW50IGluIGpkay0xLjQuMiBhbmQgbG93ZXIgKGpkay0xLjUuMCBhbmQgamRrLTEuNi4wIGFyZSBva2F5KSwgc28KICAgICAgICAgICAgYW55b25lIHVzaW5nIGRpcmVjdG9ycyBzaG91bGQgdXNlIGEgcmVjZW50IGpkayBvbiBTb2xhcmlzLCBvciBkZWZpbmUgKHNlZSBkaXJlY3Rvci5zd2cpCiAgICAgICAgICAgIFNXSUdfSkFWQV9OT19ERVRBQ0hfQ1VSUkVOVF9USFJFQUQgdG8gdGhlIEMrKyBjb21waWxlciB0byBnZXQgb2xkIGJlaGF2aW91ci4KCjEwLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEVuc3VyZSB0aGUgcHJlbWF0dXJlIGdhcmJhZ2UgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciAocGdjcHApIGlzIGdlbmVyYXRlZAogICAgICAgICAgICB3aGVuIHRoZXJlIGFyZSBDIGNvbW1lbnRzIGluIHRoZSBqdHlwZSBhbmQganN0eXBlIHR5cGVtYXBzLgoKMTAvMTIvMjAwNzogd3V6emViCgkgICAgQWRkZWQgYSB0ZXN0c3VpdGUgZW50cnkgZm9yIEJ1ZyAjMTczNTkzMQoKMTAvMDkvMjAwNzogb2xseQoJICAgIEF1dG9tYXRpY2FsbHkgcmVydW4gYXV0b2dlbi5zaCBpZiBjb25maWd1cmUuaW4gaXMgbW9kaWZpZWQuCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgRW5oYW5jZSBjaGVjay0lLXRlc3Qtc3VpdGUgcnVsZSBhbmQgZnJpZW5kcyB0byBnaXZlIGEgbW9yZSBoZWxwZnVsCgkgICAgZXJyb3IgbWVzc2FnZSBpZiB5b3UgdHJ5IHRoZW0gZm9yIGEgbGFuZ3VhZ2Ugd2hpY2ggZG9lc24ndCBleGlzdAoJICAgIChlLmcuICJtYWtlIGNoZWNrLXBocC10ZXN0LXN1aXRlIiByYXRoZXIgdGhhbiB0aGUgY29ycmVjdAoJICAgICJtYWtlIGNoZWNrLXBocDQtdGVzdC1zdWl0ZSIpLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIEFkZCBtYWtlIHJ1bGUgdG8gcmVnZW5lcmF0ZSBNYWtlZmlsZSBmcm9tIE1ha2VmaWxlLmluIGlmIGl0IGhhcwoJICAgIGNoYW5nZWQuCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgW3BocF0gRml4IGxvbmctc3RhbmRpbmcgbWVtb3J5IGxlYWsgaW4gd3JhcHBlZCBjb25zdHJ1Y3RvcnMgYW5kCgkgICAgd3JhcHBlZCBmdW5jdGlvbnMvbWV0aG9kcyB3aGljaCByZXR1cm4gYW4gb2JqZWN0LgoKMTAvMDgvMjAwNzogb2xseQoJICAgIEZpeCBNYWtlZmlsZS5pbiB0byByZWFkIGNoZWNrLmxpc3QgZmlsZXMgY29ycmVjdGx5IGluIGEgVlBBVEgKCSAgICBidWlsZC4KCjEwLzA3LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRXhwZXJpbWVudGFsIHNoYXJlZF9wdHIgdHlwZW1hcHMgYWRkZWQKCjA5LzI3LzIwMDc6IG1nb3NzYWdlCgkgICAgW2x1YV0gYWRkZWQgbW9yZSB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzIGZvciBpbmNvcnJlY3QgdHlwZWNoZWNrcy4KCSAgICBBZGRlZCBhIHJvdXRpbmUgd2hpY2ggY2hlY2tzIHRoZSBleGFjdCBudW1iZXIgb2YgcGFyYW1ldGVycyBwYXNzZWQgdG8gYSBmdW5jdGlvbgoJICAgIChicmVha3Mgb3BlcmF0b3Jfb3ZlcmxvYWRpbmcgZm9yIHVuYXJ5IG1pbnVzIG9wZXJhdG9yLCBjdXJyZW50bHkgZGlzYWJsZWQpLgoJICAgIFJlb3JnYW5pc2VkIHRoZSBsdWF0eXBlbWFwcy5zd2cgdG8gdGlkeSBpdCB1cC4KCSAgICBBZGRlZCBhIGxvdCBvZiAlaWdub3JlcyBvbiB0aGUgb3BlcmF0b3JzIG5vdCBzdXBwb3J0ZWQgYnkgbHVhLgoJICAgIEFkZGVkIHN1cHBvcnQgZm9yIGNvbnN0YW50IG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyAmIHJ1bnRlc3QgZm9yIG1lbWJlcl9wb2ludGVyLmkKCSAgICBBZGRlZCBmaXJzdCB2ZXJzaW9uIG9mIHdjaGFyLmkKCjA5LzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gdGhyb3dzIHR5cGVtYXBzIGZvciBzdGQ6OndzdHJpbmcgdXNpbmcgQyMgcGF0Y2ggIzE3OTkwNjQgZnJvbSBEYXZpZCBQaWVwZ3Jhc3MKCjA5LzI0LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5ICMxNzcxMzEzIHRvIGZpeCBidWcgIzE2NTAyMjkgLSBmaXhlcyBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZwogICAgICAgICAgICBoYW5kbGluZy4KCjA5LzIwLzIwMDc6IG9sbHkKCSAgICBbSmF2YV0gRWxpbWluYXRlIHNvbWUgdW5uZWNlc3NhcnkgdXNlcyBvZiBhIHRlbXBvcmFyeSBidWZmZXIKCSAgICBhbGxvY2F0ZWQgdXNpbmcgbmV3W10uICBTRiMxNzk2NjA5LgoKMDkvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgJGNzaW5wdXQgc3BlY2lhbCB2YXJpYWJsZSBjYW4gYmUgdXNlZCBpbiB0aGUgY3N2YXJpbiB0eXBlbWFwIHdoZXJlIGl0IGlzIGFsd2F5cwogICAgICAgICAgICBleHBhbmRlZCB0byAndmFsdWUnLgoKMDkvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggYnVnIHJlcG9ydGVkIGJ5IEdsZW5uIEEgV2F0c29uIGFuZCAjMTc5NTI2MCB3aGVyZSB0aGUgY3N0eXBlIHR5cGVtYXAgdXNlZCB0aGUgJ3JlZicKICAgICAgICAgICAga2V5d29yZCBpbiB0aGUgdHlwZW1hcCBib2R5LCBpdCBwcm9kdWNlZCB1bmNvbXBpbGFibGUgQyMgcHJvcGVydGllcyAodmFyaWFibGUgd3JhcHBlcnMpLgogICAgICAgICAgICBUaGUgdHlwZSBmb3IgdGhlIHByb3BlcnR5IG5vdyBjb3JyZWN0bHkgY29tZXMgZnJvbSB0aGUgJ291dCcgYXR0cmlidXRlIGluIHRoZSBjc3R5cGUgdHlwZW1hcC4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggY29uc3Qgc3RkOjp3c3RyaW5nJiB0eXBlbWFwcwoKMDkvMTkvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRW5zdXJlIHRoZSBwcmVtYXR1cmUgZ2FyYmFnZSBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIChwZ2NwcCkgaXMgZ2VuZXJhdGVkCiAgICAgICAgICAgIHdoZXJlIGEgcGFyYW1ldGVyIGlzIHBhc3NlZCBieSBwb2ludGVyIHJlZmVyZW5jZSwgZWcgaW4gdGhlIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLiBUaGUgcGdjcHAKICAgICAgICAgICAgaXMgYWxzbyBnZW5lcmF0ZWQgbm93IHdoZW4gdXNlcidzIGN1c3RvbSB0eXBlbWFwcyB1c2UgYSBwcm94eSBjbGFzcyBpbiB0aGUganN0eXBlIHR5cGVtYXAKICAgICAgICAgICAgYW5kIGEgJ2xvbmcnIGluIHRoZSBqdHlwZSB0eXBlbWFwLgoKMDkvMTgvMjAwNzogb2xseQoJICAgIFtwaHBdIEFkZCB0eXBlbWFwcyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVycyBvZiB0eXBlIHN0ZDo6c3RyaW5nICYKCSAgICB3aGljaCBhcmUgbW9kaWZpZWQgYnkgdGhlIHdyYXBwZWQgZnVuY3Rpb24uCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW3B5dGhvbl0gU3BsaXQgcG90ZW50aWFsbHkgbG9uZyBzdHJpbmcgbGl0ZXJhbHMgdG8gYXZvaWQgaGl0dGluZwoJICAgIE1TVkMncyBsb3cgZml4ZWQgbGltaXQgb24gc3RyaW5nIGxpdGVyYWwgbGVuZ3RoIC0gcGF0Y2ggZnJvbQoJICAgIFNGIzE3MjM3NzAsIGFsc28gcmVwb3J0ZWQgYXMgU0YjMTYzMDg1NS4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbb2NhbWxdIEZpeCByZW5hbWluZyBvZiBvdmVybG9hZGVkIG1ldGhvZHMgaW4gdGhlIG1ldGhvZF90YWJsZSAtCgkgICAgbXkgcGF0Y2ggZnJvbSBTRiM5NDAzOTkuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW3B5dGhvbl0gU2ltcGxlciBjb2RlIGZvciBTV0lHX0FzVmFsX2Jvb2woKSB3aGljaCBmaXhlcyBhICJzdHJpY3QKCSAgICBhbGlhc2luZyIgd2FybmluZyBmcm9tIEdDQyAtIHBhdGNoIGZyb20gU0YjMTcyNDU4MSBieSBBbmRyZXcKCSAgICBCYXVtYW5uLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtwZXJsNV0gVXNlIHN2X3NldHB2bigpIHRvIHNldCBhIHNjYWxhciBmcm9tIGEgcG9pbnRlciBhbmQgbGVuZ3RoCgkgICAgLSBwYXRjaCBmcm9tIFNGIzE3NDQ2MCBieSAibWF0c3ViYXJheSIuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgV2hlbiB3cmFwcGluZyBDKysgY29kZSwgZ2VuZXJhdGUgY29kZSB3aGljaCB1c2VzCgkgICAgc3RkOjpzdHJpbmc6OmFzc2lnbihQVFIsIExFTikgcmF0aGVyIHRoYW4gYXNzaWduaW5nCgkgICAgc3RkOjpzdHJpbmcoUFRSLCBMRU4pLiAgVXNpbmcgYXNzaWduIGdlbmVyYXRlcyBtb3JlIGVmZmljaWVudCBjb2RlCgkgICAgKHRlc3RlZCB3aXRoIEdDQyA0LjEuMikuCgowOS8wNy8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAlaWdub3JlIG9uIGNvbnN0cnVjdG9ycyB3aGljaCBhcmUgbm90IGV4cGxpY2l0bHkgZGVjbGFyZWQgW1NGICMxNzc3NzEyXQoKMDkvMDUvMjAwNzogd3V6emViIChKb2huIExlbnopCgkgICAgLSBDaGFuZ2Ugcl9sdHlwZSBpbiB0eXBlc3lzLmMgdG8gc3RvcmUgYSBoYXNodGFibGUgaW5zdGVhZCBvZiBhIHNpbmdsZSB2YWx1ZS4KCSAgICAgIHNldmVyYWwgdmVyeSBzdWJ0bGUgYnVncyB3ZXJlIGJlaW5nIGNhdXNlZCBieSBtdWx0aXBsZSBsdHlwZXMgYmVpbmcgbWFwcGVkCgkgICAgICB0byBhIHNpbmdsZSBtYW5nbGVkIHR5cGUsIG1vc3RseSB3aGVuIHVzaW5nIHR5cGVkZWZlZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgoJICAgICAgTm93LCByX2x0eXBlIHN0b3JlcyBhIGhhc2h0YWJsZSBvZiBwb3NzaWJsZSBsdHlwZXMsIGFuZCB3aGVuIGdlbmVyYXRpbmcgdGhlCgkgICAgICB0eXBlIHRhYmxlLCBhbGwgdGhlIGx0eXBlcyBhcmUgYWRkZWQgaW50byB0aGUgc3dpZ190eXBlX2luZm8gc3RydWN0dXJlLgoKMDgvMzEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzE3NTQ5NjcgZnJvbSBKYW1lcyBCaWdsZXIuCiAgICAgICAgICAgIC0gRml4IGJ1ZyBpbiB0dXJuaW5nIG9uIHdhcm5pbmdzIHRoYXQgd2VyZSB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQuIEVnICdzd2lnIC13KzMwOScgd2lsbCBub3cKICAgICAgICAgICAgICB0dXJuIG9uIHRoZSBub3JtYWxseSBzdXBwcmVzc2VkIHdhcm5pbmcgMzA5LgoKICAgICAgICAgICAgLSBOZXcgLVdleHRyYSBjb21tYW5kbGluZSBvcHRpb24gd2hpY2ggZW5hYmxlcyB0aGUgZXh0cmEgd2FybmluZyBudW1iZXJzOgogICAgICAgICAgICAgIDIwMiwzMDksNDAzLDUxMiwzMjEsMzIyICh0aGlzIGlzIHRoZSBsaXN0IG9mIHdhcm5pbmdzIHRoYXQgaGF2ZSBhbHdheXMgYmVlbiBzdXBwcmVzc2VkIGJ5CiAgICAgICAgICAgICAgZGVmYXVsdCkuIEJ5IHNwZWNpZnlpbmcgLVdleHRyYSwgYWxsIHdhcm5pbmdzIHdpbGwgYmUgdHVybmVkIG9uLCBidXQgdW5saWtlIC1XYWxsLAogICAgICAgICAgICAgIHdhcm5pbmdzIGNhbiBzdGlsbCBiZSBzZWxlY3RpdmVseSB0dXJuZWQgb24vb2ZmIHVzaW5nICV3YXJuZmlsdGVyLAogICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm4gb3IgZnVydGhlciAtdyBjb21tYW5kbGluZSBvcHRpb25zLCBlZzoKICAgICAgICAgICAgICAgIHN3aWcgLVdleHRyYSAtdzMwOQogICAgICAgICAgICAgIHdpbGwgdHVybiBvbiBhbGwgd2FybmluZ3MgZXhjZXB0IDMwOS4KCjA4LzI4LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIC0gTmV3IGRlYnVnZ2luZyBvcHRpb25zLCAtZGVidWctbW9kdWxlIDxuPiBhbmQgLWRlYnVnLXRvcCA8bj4gdG8gZGlzcGxheSB0aGUgcGFyc2UgdHJlZSBhdAogICAgICAgICAgICAgIHZhcmlvdXMgc3RhZ2VzLCB3aGVyZSA8bj4gaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzdGFnZXMgMS00LkZvciBleGFtcGxlLCB0bwogICAgICAgICAgICAgIGRpc3BsYXkgdG9wIG9mIHBhcnNlIHRyZWUgYXQgc3RhZ2VzIDEgYW5kIDM6CiAgICAgICAgICAgICAgICBzd2lnIC1kZWJ1Zy10b3AgMSwzCgogICAgICAgICAgICAtIERlcHJlY2F0ZSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgd2hpY2ggaGF2ZSBlcXVpdmFsZW50cyBiZWxvdzoKICAgICAgICAgICAgICAtZHVtcF9wYXJzZV9tb2R1bGUgICAgPT4gICAtZGVidWctbW9kdWxlIDEKICAgICAgICAgICAgICAtZHVtcF9tb2R1bGUgICAgICAgICAgPT4gICAtZGVidWctbW9kdWxlIDQKICAgICAgICAgICAgICAtZHVtcF9wYXJzZV90b3AgICAgICAgPT4gICAtZGVidWctdG9wIDEKICAgICAgICAgICAgICAtZHVtcF90b3AgICAgICAgICAgICAgPT4gICAtZGVidWctdG9wIDQKCiAgICAgICAgICAgIC0gUmVuYW1lZCBzb21lIGNvbW1hbmRsaW5lIG9wdGlvbnMgZm9yIG5hbWluZyBjb25zaXN0ZW5jeSBhY3Jvc3MgYWxsIG9wdGlvbnM6CiAgICAgICAgICAgICAgLWRlYnVnX3RlbXBsYXRlICA9PiAgIC1kZWJ1Zy10ZW1wbGF0ZQogICAgICAgICAgICAgIC1kZWJ1Z190eXBlbWFwICAgPT4gICAtZGVidWctdHlwZW1hcAogICAgICAgICAgICAgIC1kdW1wX2NsYXNzZXMgICAgPT4gICAtZGVidWctY2xhc3NlcwogICAgICAgICAgICAgIC1kdW1wX3RhZ3MgICAgICAgPT4gICAtZGVidWctdGFncwogICAgICAgICAgICAgIC1kdW1wX3R5cGVkZWYgICAgPT4gICAtZGVidWctdHlwZWRlZgogICAgICAgICAgICAgIC1kdW1wX21lbW9yeSAgICAgPT4gICAtZGVidWctbWVtb3J5CgowOC8yNS8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBoYW5kbGluZyBvZiBkb3VibGUgb3IgZmxvYXQgcGFyYW1ldGVycyB3aXRoIGFuIGludGVnZXIKCSAgICBkZWZhdWx0IHZhbHVlLgoKMDgvMjUvMjAwNzogb2xseQoJICAgIFtQSFA1XSBHZW5lcmF0ZSBfX2lzc2V0KCkgbWV0aG9kcyBmb3Igc2V0dGVycyBmb3IgUEhQIDUuMSBhbmQgbGF0ZXIuCgowOC8yMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gRml4IGRpcmVjdG9yIGJ1ZyAjMTc3NjY1MSByZXBvcnRlZCBieSBTdGVwaGFuZSBSb3V0ZWxvdXMgd2hpY2ggb2NjdXJyZWQgd2hlbgogICAgICAgICAgICB0aGUgZGlyZWN0b3IgY2xhc3MgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgc3RhcnQgb2Ygc29tZSBvdGhlciBzeW1ib2xzIHVzZWQgd2l0aGluCiAgICAgICAgICAgIHRoZSBkaXJlY3RvciBjbGFzcy4KCjA4LzE3LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIENvcnJlY3QgYmVoYXZpb3VyIGZvciB0ZW1wbGF0ZWQgbWV0aG9kcyB1c2VkIHdpdGggJXJlbmFtZSBvciAlaWdub3JlIGFuZCB0aGUgZW1wdHkKICAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb24gLSAldGVtcGxhdGUoKS4gQSB3YXJuaW5nIGlzIGlzc3VlZCBpZiB0aGUgbWV0aG9kIGhhcyBub3QgYmVlbgogICAgICAgICAgICByZW5hbWVkLgoKMDgvMTYvMjAwNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdIE5hbWUgZ2VuZXJhdGVkIGNsIGZpbGUgYmFzZWQgb24gaW5wdXQgZmlsZSByYXRoZXIgdGhhbiBieQoJICAgIG1vZHVsZSBuYW1lLiBJdCB3YXMgcG9zc2libGUgdG8gZW5kIHVwIHdpdGggYSBteXBhY2thZ2UuY2wgYW5kIGEgdGVzdF93cmFwLmMKCSAgICB3aGVuIHBhcnNpbmcgYSB0ZXN0LmkgaW5wdXQgZmlsZS4gQ29uZnVzaW5nLiBBbHNvLCBpbmNsdWRlIGV4dGVybmFsLWZvcm1hdAoJICAgIHRlbXBsYXRlcyBmb3IgOmZhdCBhbmQgOmZhdC1sZSBhdXRvbWF0aWNhbGx5IHRvIGF2b2lkIHRoZXNlIGJlaW5nIGNvbXBpbGVkCgkgICAgYXQgcnVudGltZS4KCjA4LzE1LzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbY2ZmaV0gQXBwbHkgcGF0Y2ggIzE3NjYwNzYgZnJvbSBMZWlnaCBTbWl0aCBhZGRpbmcgc3VwcG9ydCBmb3IgbmV3bHkgaW50cm9kdWNlZAogICAgICAgICAgICBpbiBjZmZpIDpsb25nLWxvbmcgYW5kIDp1bnNpZ25lZC1sb25nLWxvbmcuCgowOC8xMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIGRvY3VtZW50YXRpb24gcGF0Y2ggIzE3NDM1NzMgZnJvbSBKZWZmcmV5IFNvcmVuc2VuLiBJdCBjb250YWlucyBhIG5lYXQKICAgICAgICAgICAgaWRlYSB3aXRoIHJlc3BlY3QgdG8gYmV0dGVyIG1lbW9yeSBtYW5hZ2VtZW50IGJ5IHRoZSBKVk0gb2YgQysrIGFsbG9jYXRlZCBtZW1vcnkuCgowOC8xMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbHkgcGF0Y2ggIzE3NzE0MTAgZnJvbSBXYWRlIEJyYWluZXJkIHRvIGZpeCB0eXBlZGVmIFhTKFN3aWdQZXJsV3JhcHBlcikgaW4KICAgICAgICAgICAgcGVybHJ1bi5zd2cgZm9yIEFjdGl2ZVN0YXRlIFBlcmwgYnVpbGQgODIyIGFuZCBQZXJsIDUuOC45IGFuZCA1LjEwIGJyYW5jaGVzLgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gY29uc3QgZW51bSByZWZlcmVuY2UgdHlwZW1hcHMgZml4ZWQuCgowOC8wOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIG1pc3Npbmcgc3VwcG9ydCBmb3IgQysrIGNsYXNzIG1lbWJlciBwb2ludGVycy4KCjA4LzA5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQWRkIHN1cHBvcnQgZm9yICRvd25lciBpbiB0aGUgIm91dCIgdHlwZW1hcHMgbGlrZSBpbiB0aGUgc2NyaXB0aW5nCiAgICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuIE5vdGUgdGhhdCAkb3duZXIgaGFzIGFsd2F5cyBiZWVuIHN1cHBvcnRlZCBpbiB0aGUgImphdmFvdXQiIC8gImNzb3V0IgogICAgICAgICAgICB0eXBlbWFwcy4KCjA4LzAxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzbWFydCBwb2ludGVyIGhhbmRsaW5nIGZvciBjbGFzc2VzIHRoYXQgaGF2ZSB0ZW1wbGF0ZWQgbWV0aG9kcyB3aXRoaW4gdGhlIHNtYXJ0CiAgICAgICAgICAgIHBvaW50ZXIgdHlwZS4gUHJvYmxlbSByZXBvcnRlZCBieSBjcmFpZ2RvIGF0IGVlLndhc2hpbmd0b24uZWR1LgoKMDcvMzEvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtjZmZpXSBmaXhlZCBtZW1vcnkgYWNjZXNzIGFmdGVyIGJlaW5nIGZyZWVkIGJ1Zy4gdGhhbmtzIHRvIE1hcnRpbiBQZXJjb3NzaS4KICAgICAgICAgICAgcGFja2FnZSBuYW1lIGNsb3MgY2hhbmdlZCB0byBjbC4gdGhhbmtzIHRvIFJhbGYgTWF0dGVzCgowNy8yNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXJhbGxlbCBtYWtlIHN1cHBvcnQgYWRkZWQgZm9yIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSBmb3IgZGV2ZWxvcGVycyB3aG8gaGF2ZQogICAgICAgICAgICBtb3JlIHRoYW4gb25lIENQVS4gTm93IHBhcmFsbGVsIG1ha2UgY2FuIGJlIHVzZWQgZm9yIGNoZWNraW5nIGluIGFkZGl0aW9uIHRvIGJ1aWxkaW5nCiAgICAgICAgICAgIHRoZSBTV0lHIGV4ZWN1dGFibGUuIFNvbWUgdHlwaWNhbCBjaGVja2luZyBleGFtcGxlczoKCiAgICAgICAgICAgICAgbWFrZSAtajggLWsgY2hlY2sKICAgICAgICAgICAgICBtYWtlIC1qNCBjaGVjay1qYXZhLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICBtYWtlIC1qMiBjaGVjay1qYXZhLWV4YW1wbGVzCgowNy8xOS8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBGaXhlZCBidWcgdGhhdCBzdG9wcGVkIGNvbmZpZ3VyZSB3b3JraW5nIG9uIG1pbmd3IChhcHBsaWVkIGRvczJ1bml4IHRvIGNvbmZpZ3VyZS5pbikKCjA3LzEwLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIEV4dHJhIGNvbXBhdGliaWxpdHkgd2l0aCBMdWEgNS4xICh1cGRhdGVkIFNXSUdfaW5pdCwgZG9jcywgZXhhbXBsZXMsIHRlc3Qgc3VpdGUpCgkgICAgUmVtb3ZlZCBuYW1lIGNsYXNoIGZvciBzdGF0aWMgbGluayBvZiBtdWx0aXBsZSBtb2R1bGVzCgowNy8wNS8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBGaXggYSBidWcgaW4gU1dJR19BTExPQ19BUlJBWSgpCiAgICAgICAgICAgIGltcHJvdmVkIHRoZSBlcnJvciBtZXNzYWdlcyBmb3IgaW5jb3JyZWN0IGFyZ3VtZW50cy4KICAgICAgICAgICAgQ2hhbmdlZCB0aGUgb3V0cHV0IG9mIHN3aWdfdHlwZSgpIHRvIHVzZSB0aGUgaHVtYW4gcmVhZGFibGUgZm9ybSBvZiB0aGUgdHlwZSwKCSAgICByYXRoZXIgdGhhbiB0aGUgcmF3IHN3aWcgdHlwZS4KCjA3LzAzLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGRpcmVjdG9ycyBmb3Igc29tZSBvdmVybG9hZGVkIG1ldGhvZHMgd2hlcmUgdGhlIGltdHlwZSByZXN1bHRlZCBpbiBpZGVudGljYWwKICAgICAgICAgICAgbWV0aG9kcyBiZWluZyBnZW5lcmF0ZWQgaW4gdGhlIEMjIGRpcmVjdG9yIGNsYXNzLCBlZyB2b2lkIGZvbyhpbnQgKikgYW5kIHZvaWQgZm9vKGRvdWJsZSAqKQogICAgICAgICAgICB1c2VkIHRvIGdlbmVyYXRlZCB0d28gb2YgdGhlc2U6CgogICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBTd2lnRGlyZWN0b3Jmb28oSW50UHRyIHApIHsgLi4uIH0KCjA2LzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU29tZSBwYXJhbWV0ZXIgbmFtZSBjaGFuZ2VzIGluIHN0ZF92ZWN0b3IuaSBhbGxvd2luZyBiZXR0ZXIgdGFyZ2V0aW5nCiAgICAgICAgICAgIG9mIHR5cGVtYXBzIGZvciBtZXRob2QgcGFyYW1ldGVycyAoZm9yIG1lbW9yeSBtYW5hZ2VtZW50IG9mIGNvbnRhaW5lcnMgb2YgcG9pbnRlcnMpLgoKMDYvMDcvMjAwNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgZml4IGZvcmVpZ24tdHlwZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBsb29rIGZvciBmZml0eXBlIHR5cGVtYXAKCSAgICBiaW5kaW5ncy4gZml4IGlub3V0X3R5cGVtYXBzLmkgZm9yIHN0cmluZ3MuCgowNi8wNi8yMDA3OiBvbGx5CgkgICAgW1J1YnldCgkgICAgVXNlIHdoaWNoZXZlciBvZiAibG9uZyIgb3IgImxvbmcgbG9uZyIgaXMgdGhlIHNhbWUgc2l6ZSBhcyAidm9pZCoiCgkgICAgdG8gaG9sZCBwb2ludGVycyBhcyBpbnRlZ2VycywgcmF0aGVyIHRoYW4gd2hpY2hldmVyIG1hdGNoZXMgb2ZmX3QuCgkgICAgRml4ZXMgY29tcGlsYXRpb24gb24gT1MgWCBhbmQgR0NDIHdhcm5pbmdzIG9uIHBsYXRmb3JtcyB3aGVyZQoJICAgIHNpemVvZih2b2lkKikgPCBzaXplb2Yob2ZmX3QpIChTRiBwYXRjaCAjMTczMTk3OSkuCgowNi8wNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdCgkgICAgRml4IGhhbmRsaW5nIG9mIGEgcGFydGljdWxhciBjYXNlIGludm9sdmluZyBvdmVybG9hZGVkIGZ1bmN0aW9ucwoJICAgIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzLgoKMDYvMDUvMjAwNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGNhc2Ugd2hlcmUgd2UnZCBwYXNzIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVycwoJICAgIChpLmUuIE5TMTo6TlMyOjpGT08pIHRvIHN3aWctaW5zZXJ0LWlkLiBBbGwgbmFtZXNwYWNlcwoJICAgIHNob3VsZCBiZSBzdHJpcHBlZC4KCgkgICAgRml4IGJ1ZyBpbiBUeXBlZGVmSGFuZGxlciBpbnRyb2R1Y2VkIGJ5IGxhc3QgZml4LgoKMDYvMDUvMjAwNzogb2xseQoJICAgIEZpeCByZXBvcnRpbmcgb2YgZmlsZW5hbWVzIGluIGVycm9ycyBhZnRlciAlaW5jbHVkZSAocGF0Y2ggZnJvbQoJICAgIExlaWdoIFNtaXRoIGluICMxNzMxMDQwOyBhbHNvIHJlcG9ydGVkIGFzICMxNjk5OTQwKS4KCjA1LzMxLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEZpeCAibWlzc2luZyBpbml0aWFsaXNlciIgd2FybmluZyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgQy9DKysKCSAgICB3cmFwcGVyIGNvZGUgd2l0aCBQeXRob24gMi41IHdpdGggd2FybmluZ3MgZW5hYmxlZCAocGF0Y2ggZnJvbQoJICAgIGJ1ZyMxNzI3NjY4IGZyb20gTHVrZSBNb29yZSkuCgowNS8yOS8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBTcGxpdCBkb2NzdHJpbmdzIGludG8gc2VwYXJhdGUgc3RyaW5nIGxpdGVyYWxzIGF0IGVhY2ggbmV3bGluZSB3aGVuCgkgICAgZ2VuZXJhdGluZyBDL0MrKyB3cmFwcGVyIGNvZGUgKHRoZSBDL0MrKyBjb21waWxlciB3aWxsIGp1c3QgY29tYmluZQoJICAgIHRoZW0gYmFjayBpbnRvIGEgc2luZ2xlIHN0cmluZyBsaXRlcmFsKS4gIFRoaXMgYXZvaWRzIE1TVkMKCSAgICBjb21wbGFpbmluZyB0aGF0IHRoZSBzdHJpbmdzIGFyZSB0b28gbG9uZyAocHJvYmxlbSByZXBvcnRlZCBieQoJICAgIEJvIFBlbmcgb24gdGhlIG1haWxpbmcgbGlzdCkuCgowNS8yOC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBFc2NhcGUgYmFja3NsYXNoZXMgaW4gZG9jc3RyaW5ncy4KCjA1LzI2LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEZpeCBhdXRvZG9jIGdlbmVyYXRpb24gb2YgZW51bXMgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggaG93IHRoZQoJICAgIGVudW1zIGFyZSB3cmFwcGVkIC0gcGF0Y2ggIzE2OTcyMjYgZnJvbSBKb3NoIENoZXJyeS4KCjA1LzI2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0KCSAgICBGaXggd3JhcHBpbmcgb2YgbWV0aG9kcyBhbmQgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBhIHBvaW50ZXIgdG8gYQoJICAgIGNsYXNzIChidWcjMTcwMDc4OCkgYW5kIHRob3NlIHdoaWNoIGhhdmUgb3ZlcmxvYWRlZCBmb3JtcyByZXR1cm5pbmcKCSAgICBib3RoIGNsYXNzZXMgYW5kIG5vbi1jbGFzc2VzIChidWcjMTcxMjcxNywgdGhhbmtzIHRvIFNpbW9uCgkgICAgQmVydGhpYXVtZSBmb3IgdGhlIHBhdGNoKS4KCjA1LzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVkICVyZW5hbWUgaW5jb25zaXN0ZW5jeSBpbiBjb252ZXJzaW9uIG9wZXJhdG9ycyBhcyByZXBvcnRlZCBieSBaaG9uZyBSZW4uIFRoZSBtYXRjaGluZwogICAgICAgICAgICBpcyBub3cgZG9uZSBvbiB0aGUgb3BlcmF0b3IgbmFtZSBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgaXMgZG9uZSBmb3IgcGFyYW1ldGVycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUob3BBQkMpIFNwYWNlOjpBQkM6Om9wZXJhdG9yIEFCQygpIGNvbnN0OwogICAgICAgICAgICAgICVyZW5hbWUobWV0aG9kQUJDKSBTcGFjZTo6QUJDOjptZXRob2QoQUJDIGEpIGNvbnN0OwogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBjbGFzcyBBQkMgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoQUJDIGEpIGNvbnN0IHt9CiAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgQUJDKCkgY29uc3QgeyBBQkMgYTsgcmV0dXJuIGE7IH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZSB0aGF0IHF1YWxpZnlpbmcgdGhlIGNvbnZlcnNpb24gb3BlcmF0b3IgcHJldmlvdXNseSBtYXkgb3IgbWF5IG5vdCBoYXZlIG1hdGNoZWQuCiAgICAgICAgICAgIE5vdyBpdCBkZWZpbml0ZWx5IHdvbid0LCBzbyB0aGlzIHdpbGwgbm90IG1hdGNoOgoKICAgICAgICAgICAgICAlcmVuYW1lKG9wQUJDKSBTcGFjZTo6QUJDOjpvcGVyYXRvciBTcGFjZTo6QUJDKCkgY29uc3Q7CgogICAgICAgICAgICBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGlzIGRvZXMgbm90IG1hdGNoOgoKICAgICAgICAgICAgICAlcmVuYW1lKG1ldGhvZEFCQykgU3BhY2U6OkFCQzo6bWV0aG9kKFNwYWNlOjpBQkMgYSkgY29uc3Q7CgogICAgICAgICAgICBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiBpbXByb3ZlZCB3aXRoIHJlc3BlY3QgdG8gJXJlbmFtZSwgbmFtZXNwYWNlcyBhbmQgdGVtcGxhdGVzLgogICAgICAgICAgICBDb252ZXJzaW9uIG9wZXJhdG9ycyBkb2N1bWVudGF0aW9uIHRvby4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDUvMTYvMjAwNzogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBiYWQgZ2VuZXJhdGlvbiBvZiBsb2NhbCB2YXIgbHR5cGUncyBpbiBmdW5jdGlvbldyYXBwZXIoKS4KCSAgICBUcnkgdG8gd29yayBiZXR0ZXIgd2l0aCB0aGUgYmFja3dhcmQgb3JkZXIgaW4gd2hpY2ggc3dpZwoJICAgIHVucm9sbHMgbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zLgoJICAgIGNsZWFuZWQgdXAgYSBsaXR0bGUgdW5uZWNlc3NhcnkgY29kZS9kZWJ1ZyBwcmludGYncy4KCSAgICBSZW1vdmUgd2FybmluZyB3aGVuIHJlcGxhY2luZyAkbGRlc3RydWN0b3IgZm9yIGZmOmZvcmVpZ24tcG9pbnRlcgoKMDUvMTIvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgc3dpZyAtcHl0aG9uIC10aHJlYWRzIG5vdyBnZW5lcmF0ZXMgQy9DKysgY29kZSB3aGljaCB1c2VzIFB5dGhvbidzCgkgICAgb3duIHRocmVhZGluZyBhYnN0cmFjdGlvbiAoZnJvbSBweXRocmVhZC5oKSByYXRoZXIgdGhhbiBPUyBzcGVjaWZpYwoJICAgIGNvZGUuICBUaGUgb2xkIGNvZGUgZmFpbGVkIHRvIGNvbXBpbGUgb24gTVMgV2luZG93cy4gIChTZWUgU0YgcGF0Y2gKCSAgICB0cmFja2VyICMxNzEwMzQxKS4KCjA1LzA0LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgU1RMIHJlbmFtZXMgdG8gYmUgZ2xvYmFsIHJlbmFtZXMuICBUaGlzIGZpeGVzCgkgICAgU1RMIGZ1bmN0aW9ucyBub3QgYmVpbmcgcmVuYW1lZCB3aGVuIGF1dG9yZW5hbWUgaXMgb24uCiAgICAgICAgICAgIFRoaXMgaXMgYSBub3QgYSB0b3RhbGx5IHBlcmZlY3Qgd29yay1hcm91bmQsIGJ1dCBiZXR0ZXIuCgkgICAgU29tZW9uZSByZWFsbHkgbmVlZHMgdG8gZml4IHRoZSB0ZW1wbGF0ZSByZW5hbWluZyBjb2RlLgoJICAgIChTZWUgYnVnICMxNTQ1NjM0KQoKMDUvMDQvMjAwNyAgZ2dhCgkgICAgW0FsbF0KICAgICAgICAgICAgQ2hhbmdlZCAlcmVuYW1lKCIlKHVuZGVyY2FzZSlzIikgYSBsaXR0bGUgc28gdGhhdCBzaW5nbGUKCSAgICBudW1iZXJzIGF0IHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBhcmUgbm90IHVuZGVyY2FzZWQuICBUaGF0IGlzOgoJCWdldFNvbWV0aGluZyAtPiBnZXRfc29tZXRoaW5nCgkJZ2V0MkQJICAgICAtPiBnZXRfMmQKCQlnZXQyMzQJICAgICAtPiBnZXRfMjM0CgkgICAgQlVUOgoJCWFzRmxvYXQyICAgICAtPiBhc19mbG9hdDIKCSAgICAoQnVnICMxNjk5NzE0KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgTWFkZSBfX3N3aWd0eXBlX18gPT4gQF9fc3dpZ3R5cGVfXyBzbyBpdCBjYW4gYmUgYWNjZXNzZWQKCSAgICBmcm9tIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGFuZCBmb2xsb3dzIFJ1YnkncyBvZmZpY2lhbAogICAgICAgICAgICBkb2N1bWVudGF0aW9uLCBqdXN0IGluIGNhc2UpLgoJICAgIE1hZGUgdHJhY2tpbmcgPT4gQF9fdHJhY2tpbmdzX18gZm9yIHNhbWUgcmVhc29uLgoJICAgIEN1cnJlbnRseSBzdG9yaW5nIGl2YXJzIHdpdGhvdXQgdGhlIEAgc2VlbXMgdmFsaWQsIGJ1dAoJICAgIHRoZSBQaWNrQXhlIHNheXMgdGhpcyBpcyBub3QgY29ycmVjdCwgc28ganVzdCBpbiBjYXNlLi4uCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBBcHBsaWVkIHBhdGNoIGZvciAtbWluaGVyaXQgYnVnIGFuZCBleGNlcHRpb24gY2xhc3Nlcy4KCSAgICBUaGlzIGlzc3VlIHNob3VsZCBiZSByZXZpc2l0ZWQgbW9yZSBjbG9zZWx5LCBhcyBNdWx0aXBsZQoJICAgIEluaGVyaXRhbmNlIGluIFJ1YnkgaXMgc3RpbGwgcHJvYmxlbWF0aWMuCgkgICAgKHBhdGNoL2J1ZyAjMTYwNDg3OCkKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE92ZXJsb2FkZWQgZnVuY3Rpb25zIGluIHJ1Ynkgd2lsbCBub3cgcmVwb3J0IHRvIHRoZSB1c2VyCiAgICAgICAgICAgIHRoZSBwb3NzaWJsZSBwcm90b3R5cGVzIHdoZW4gdGhlIHVzZXIgbWlzdHlwZXMgdGhlIG51bWJlciBvcgogICAgICAgICAgICB0eXBlIG9mIGEgcGFyYW1ldGVyLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRm9yZ290IHRvIGRvY3VtZW50IHRoZSBidWcgZml4aW5nIG9mIGFuIG9sZCBidWcgcmVnYXJkaW5nCgkgICAgZXhjZXB0aW9ucy4KCSAgICAoYnVnICMxNDU4MjQ3KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgUnVieSBkb2N1bWVudGF0aW9uIHRvIHVzZSB0aGUgcHJvcGVyIGNzcyBzdHlsZXMgZm9yCgkgICAgZWFjaCBzZWN0aW9uLiBBZGRlZCBhdXRvZG9jIHNlY3Rpb24gdG8gUnVieSdzIGRvY3MgdG8KCSAgICBkb2N1bWVudCB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IFJ1YnkgaW4gZG9jdW1lbnRpbmcgaXRzIG1vZHVsZXMuCgkgICAgTWFkZSByZG9jIGRvY3VtZW50YXRpb24gc3BpdCBvdXQgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MgKwoJICAgIG1ldGhvZCBuYW1lLiAgQWxiZWl0IHRoaXMgd2lsbCBtYWtlIHRoZSBjdXJyZW50IHJkb2Mgbm90IHJlY29nbml6ZQogICAgICAgICAgICB0aGUgbWV0aG9kLCB0aGlzIGlzIHN0aWxsIG5lZWRlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBkaWZmZXJlbnQKICAgICAgICAgICAgY2xhc3NlcyB3aXRoIHNpbWlsYXIgbWV0aG9kcyAocmRvYyB3YXMgY3JlYXRlZCB0byBkb2N1bWVudCB0aGUKCSAgICBydWJ5IHNvdXJjZSB3aGljaCBvbmx5IGNvbnRhaW5zIG9uZSBjbGFzcyBwZXIgYyBmaWxlLCB1bmxpa2Ugc3dpZykKICAgICAgICAgICAgSSBoYXZlIHBhdGNoZWQgcmRvYyB0byBtYWtlIGl0IG1vcmUgZnJpZW5kbHkgdG8gc3dpZy4gIFRoaXMKICAgICAgICAgICAgcGF0Y2ggbmVlZHMgdG8gYmUgbWVyZ2VkIGluIHRoZSBydWJ5IHN0ZCBsaWJyYXJ5IG5vdy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgZmxhZyAtZmVhdHVyZSB0byBiZSAtaW5pdF9uYW1lIHRvIGJldHRlciByZWZsZWN0IGl0cwoJICAgIHB1cnBvc2UgYW5kIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIC1mZWF0dXJlcy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEltcHJvdmVkIGF1dG9kb2MgZ2VuZXJhdGlvbi4KCSAgICBBZGRlZCBhdXRvZG9jIC5zd2cgZmlsZXMgdG8gUnVieSBsaWJyYXJ5IGZvciBlYXNpbHkgYWRkaW5nCgkgICAgZG9jdW1lbnRhdGlvbiB0byBjb21tb24gUnVieSBtZXRob2RzIGFuZCBTVEwgbWV0aG9kcy4KCSAgICBGaXhlZCBhdXRvZG9jIGRvY3VtZW50aW5nIG9mIGdldHRlcnMgYW5kIHNldHRlcnMgYW5kIG1vZHVsZS4KCSAgICBNYWRlIHRlc3Qgc3VpdGUgYWx3YXlzIGdlbmVyYXRlIGF1dG9kb2NzLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUmVtb3ZlZCBzb21lIHdhcm5pbmdzIGZyb20gU1RMIGFuZCB0ZXN0IHN1aXRlLgoKMDUvMDIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ZWQgaXNzdWVzIHdpdGggQysrIGNsYXNzZXMgYW5kIGhpZXJhY2hpZXMgYWNyb3NzIG11bHRpcGxlCgkgICAgc291cmNlIGZpbGVzLiBGaXhlZCBpbXBvcnRzIHRlc3QgY2FzZSAmIGFkZGVkIHJ1biB0ZXN0LgoJICAgIEFkZGVkIEV4YW1wbGVzL2ltcG9ydHMuCgkgICAgQWRkZWQgdHlwZW5hbWUgZm9yIHJhdyBsdWFfU3RhdGUqCgkgICAgQWRkZWQgZG9jdW1lbnRhdGlvbiBvbiBuYXRpdmUgZnVuY3Rpb25zLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRG9jc3RyaW5ncyBhcmUgbm93IHN1cHBvcnRlZC4KCSAgICAlZmVhdHVyZSgiYXV0b2RvYyIpIGFuZCAlZmVhdHVyZSgiZG9jc3RyaW5nIikgYXJlIG5vdwoJICAgIHByb3Blcmx5IHN1cHBvcnRlZCBpbiBSdWJ5LiAgVGhlc2UgZmVhdHVyZXMgd2lsbCBnZW5lcmF0ZQoJICAgIGEgX3dyYXAuY3h4IGZpbGUgd2l0aCByZG9jIGNvbW1lbnRzIGluIHRoZW0uCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBTVEwgZmlsZXMgaGF2ZSBiZWVuIHVwZ3JhZGVkIHRvIGZvbGxvdyB0aGUgbmV3IHN3aWcvcHl0aG9uCgkgICAgTGliL3N0ZCBjb252ZW50aW9ucy4KCSAgICBUaGlzIG1lYW5zIHN0ZDo6dmVjdG9yLCBzdGQ6OnNldCwgc3RkOjptYXAsIHNldDo6bXVsdGltYXAsCgkgICAgc3RkOjptdWx0aXNldCwgc3RkOjpkZXF1ZSBhbmQgc3RkOjpzdHJpbmcgYXJlIG5vdyBwcm9wZXJseQoJICAgIHN1cHBvcnRlZCwgaW5jbHVkaW5nIHRoZWlyIGl0ZXJhdG9ycywgc3VwcG9ydCBmb3IgY29udGFpbmluZwoJICAgIHJ1Ynkgb2JqZWN0cyAoc3dpZzo6R0NfVkFMVUUpIGFuZCBzZXZlcmFsIG90aGVyIHJ1YnkKCSAgICBlbmhhbmNlbWVudHMuCgkgICAgc3RkOjpjb21wbGV4LCBzdGQ6Omlvcywgc3RkOjppb3N0cmVhbSwgc3RkOjppb3N0cmVhbWJ1ZiBhbmQKCSAgICBzdGQ6OnNzdHJlYW0gYXJlIG5vdyBhbHNvIHN1cHBvcnRlZC4KCSAgICBzdGQ6OndzdHJpbmcsIHN0ZDo6d2lvcywgc3RkOjp3aW9zdHJlYW0sIHN0ZDo6d2lvc3RyZWFtYnVmCgkgICAgYW5kIHN0ZDo6d3NzdHJlYW0gYXJlIHN1cHBvcnRlZCB2ZXJiYXRpbSB3aXRoIG5vIHVuaWNvZGUKCSAgICBjb252ZXJzaW9uLgoKCSAgICBzdGRfdmVjdG9yLmkgbm93IG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgUnVieSBBcnJheXMgbXVjaCBtb3JlCgkgICAgY2xvc2VseSwgc3VwcG9ydGluZyBzbGljaW5nLCBzaGlmdGluZywgdW5zaGlmdGluZywKICAgICAgICAgICAgbXVsdGlwbGUgaW5kZXhpbmcgYW5kIHByb3BlciByZXR1cm4gdmFsdWVzIG9uIGFzc2lnbm1lbnQuCgoJICAgIENPTVBBVEFCSUxJVFkgTk9URTogdGhpcyBjaGFuZ2VzIHRoZSBvbGRlciBhcGkgYSBsaXR0bGUgYml0IGluCgkgICAgdGhhdCBpbXByb3BlciBpbmRleGluZyB3b3VsZCBwcmV2aW91c2x5IChpbmNvcnJlY3RseSkgcmFpc2UKCSAgICBleGNlcHRpb25zLiAgTm93LCBuaWwgaXMgcmV0dXJuZWQgaW5zdGVhZCwgZm9sbG93aW5nIHJ1YnkncwoJICAgIHN0YW5kYXJkIEFycmF5IGJlaGF2aW9yLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCB0aGUgdmFsdWUgb2YgU1dJR19UWVBFQ0hFQ0tfQk9PTCB0byBiZSAxMDAwMCAoaWUuIGhpZ2hlcgoJICAgIHRoYW4gdGhhdCBvZiBhbGwgaW50ZWdlcnMpLgoJICAgIFRoaXMgaXMgYmVjYXVzZSBSdWJ5IGFsbG93cyB0eXBlY2FzdGluZwoJICAgIGludGVnZXJzIGRvd24gdG8gYm9vbGVhbnMgd2hpY2ggY2FuIG1ha2Ugb3ZlcmxvYWRlZCBmdW5jdGlvbnMgb24KCSAgICBib29scyBhbmQgaW50ZWdlcnMgdG8gZmFpbC4KCSAgICAoYnVnIyAxNDg4MTQyKQoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgYSBzdWJ0bGUgYnVnIGluIG11bHRpcGxlIGFyZ291dHMgdGhhdCBjb3VsZCBnZXQgdHJpZ2dlcmVkIGlmCgkgICAgdGhlIHVzZXIgcmV0dXJuZWQgdHdvIG9yIG1vcmUgYXJndW1lbnRzIGFuZCB0aGUgZmlyc3Qgb25lIHdhcyBhbgoJICAgIGFycmF5LgoKMDUvMDEvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgSW1wcm92ZWQgdGhlIGRvY3VtZW50YXRpb24gdG8gZG9jdW1lbnQgdGhlIG5ldyBmZWF0dXJlcwogICAgICAgICAgICBhZGRlZCwgYWRkIGRpcmVjdG9yaW4vb3V0L2FyZ291dCB0eXBlbWFwcywgZXRjLgoKMDUvMDEvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQWRkZWQgJWluaXRzdGFjayBhbmQgJWlnbm9yZXN0YWNrIGRpcmVjdGl2ZXMgZm9yIGRpcmVjdG9yCgkgICAgZnVuY3Rpb25zLiAgVGhlc2UgYWxsb3cgeW91IHRvIGNvbnRyb2wgd2hldGhlciBhIGRpcmVjdG9yCgkgICAgZnVuY3Rpb24gc2hvdWxkIHJlLWluaXQgdGhlIFJ1Ynkgc3RhY2suCgkgICAgVGhpcyBpcyBzb21ldGltZXMgbmVlZGVkIGZvciBhbiBlbWJlZGRlZCBSdWJ5IHdoZXJlIHRoZQoJICAgIGRpcmVjdG9yIG1ldGhvZCBpcyB1c2VkIGFzIGEgQysrIGNhbGxiYWNrIGFuZCBub3QgY2FsbGVkCiAgICAgICAgICAgIGJ5IHRoZSB1c2VyIGZyb20gcnVieSBjb2RlLgoJICAgIEV4cGxhbmF0aW9uOgoJICAgIFJ1YnkncyBHQyBuZWVkcyB0byBiZSBhd2FyZSBvZiB0aGUgcnVubmluZyBPUyBzdGFjayBpbiBvcmRlciB0bwoJICAgIG1hcmsgYW55IFZBTFVFIChSdWJ5IG9iamVjdHMpIGl0IGZpbmRzIHRoZXJlIHRvIGF2b2lkIGNvbGxlY3Rpb24KCSAgICBvZiB0aGVtLiAgVGhpcyBhbGxvd3MgdGhlIHJ1YnkgQVBJIHRvIGJlIHZlcnkgc2ltcGxlIGFuZCBhbGxvd3MKCSAgICB5b3UgdG8gd3JpdGUgY29kZSBsaWtlICJWQUxVRSBhID0gc3RoIiBhbnl3aGVyZSB3aXRob3V0IG5lZWRpbmcKCSAgICB0byBkbyB0aGluZ3MgbGlrZSByZWZjb3VudGluZyBsaWtlIHB5dGhvbi4KCSAgICBCeSBkZWZhdWx0LCB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrIGlzIHNldCB3aGVuIHJ1YnlfaW5pdCgpIGlzCgkgICAgY2FsbGVkLiAgIElmIHJ1YnkgaXMgaW5pdGVkIHdpdGhpbiBtYWluKCksIGFzIGl0IHVzdWFsbHkgaXMgdGhlCgkgICAgY2FzZSB3aXRoIHRoZSBtYWluIHJ1YnkgZXhlY3V0YWJsZSwgcnVieSB3aWxsIGJlIGFibGUgdG8gY2FsY3VsYXRlCgkgICAgaXRzIHN0YWNrIHByb3Blcmx5LiAgSG93ZXZlciwgd2hlbiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYXMgd2hlbgoJICAgIHJ1YnkgaXMgZW1iZWRkZWQgYXMgYSBwbHVnaW4gdG8gYW4gYXBwbGljYXRpb24gd2hlcmUgbWFpbiBpcyBub3QKCSAgICBhdmFpbGFibGUsIHJ1YnlfaW5pdCgpIHdpbGwgYmUgY2FsbGVkIGluIHRoZSB3cm9uZyBwbGFjZSwgYW5kCgkgICAgcnVieSB3aWxsIGJlIGluY29ycmVjdGx5IHRyYWNraW5nIHRoZSBzdGFjayBmcm9tIHRoZSBmdW5jdGlvbgoJICAgIHRoYXQgY2FsbGVkIHJ1YnlfaW5pdCgpIGZvcndhcmRzIG9ubHksIHdoaWNoIGNhbiBsZWFkIHRvCgkgICAgYWxsIHNvcnRzIG9mIHdlaXJkIGNyYXNoZXMgb3IgdG8gcnVieSB0aGlua2luZyBpdCBoYXMgcnVuIG91dCBvZgoJICAgIHN0YWNrIHNwYWNlIGluY29ycmVjdGx5LgoJICAgIFRvIGF2b2lkIHRoaXMsIGRpcmVjdG9yIChjYWxsYmFjaykgZnVuY3Rpb25zIGNhbiBub3cgYmUgdGFnZ2VkCgkgICAgdG8gdHJ5IHRvIHJlc2V0IHRoZSBydWJ5IHN0YWNrLCB3aGljaCB3aWxsIHNvbHZlIHRoZSBpc3N1ZXMuCgkgICAgTk9URTogcnVieTEuOC42IHN0aWxsIGNvbnRhaW5zIGEgYnVnIGluIGl0IGluIHRoYXQgaXRzIGZ1bmN0aW9uCgkgICAgdG8gcmVzZXQgdGhlIHN0YWNrIHdpbGwgbm90IGFsd2F5cyBkbyBzby4gIFRoaXMgYnVnIGlzIHRyaWdnZXJlZAoJICAgIHZlcnkgcmFyZWx5LCB3aGVuIHJ1YnkgaXMgY2FsbGVkIGZyb20gdHdvIHZlcnkgZGlzdGluY3QgcGxhY2VzCgkgICAgaW4gbWVtb3J5LCBsaWtlIGEgYnJhbmNoIG9mIG1haW4oKSBhbmQgYW5vdGhlciBkc28uICBUaGlzIGJ1ZwoJICAgIGhhcyBub3cgYmVlbiByZXBvcnRlZCB0byBydWJ5LWNvcmUgYW5kIGlzIHBlbmRpbmcgZnVydGhlcgoJICAgIGludmVzdGlnYXRpb24uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8zMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE3MDc1ODIgLSBSZXN0b3JlIGJ1aWxkaW5nIGZyb20gcmVhZC1vbmx5IHNvdXJjZSBkaXJlY3Rvcmllcy4KCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJ1Ynkgd2lsbCBub3cgcmVwb3J0IHRoZSBwYXJhbWV0ZXIgaW5kZXggcHJvcGVybHkgb24gdHlwZQoJICAgIGVycm9ycyBhcyB3ZWxsIGFzIHRoZSBjbGFzcyBhbmQgdmFsdWUgb2YgdGhlIGluY29ycmVjdAoJICAgIGFyZ3VtZW50IHBhc3NlZC4KCSAgICAoZmVhdHVyZSByZXF1ZXN0ICMxNjk5NjcwKQoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUnVieSBubyBsb25nZXIgY3JlYXRlcyB0aGUgZnJlZV9DbGFzcyBmdW5jdGlvbiBpZiB0aGUgY2xhc3MKCSAgICBjb250YWlucyBpdHMgb3duIHVzZXIgZGVmaW5lZCBmcmVlIGZ1bmN0aW9uICglZnJlZWZ1bmMpLgoJICAgIChidWcgIzE3MDI4ODIpCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBNYWRlIGRpcmVjdG9ycyByYWlzZSBhIHJ1YnkgZXhjZXB0aW9uIGZvciBpbmNvcnJlY3QgYXJnb3V0CgkgICAgcmV0dXJuZWQgdmFsdWVzIGlmIFJVQllfRU1CRURERUQgaXMgc2V0LCBpbnN0ZWFkIG9mIHRocm93aW5nCgkgICAgYW4gYWN0dWFsIFN3aWdEaXJlY3RvciBleGNlcHRpb24uCgkgICAgVGhpcyB3aWxsIHByZXZlbnQgY3Jhc2hlcyB3aGVuIHJ1YnkgaXMgZW1iZWRkZWQgYW5kIHVuYXdhcmUKCSAgICBvZiB0aGUgU3dpZ0RpcmVjdG9yIGV4Y2VwdGlvbi4KCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJlbW92ZWQgdGhlIG5lZWQgZm9yIC1EU1dJR0VYVEVSTi4KCSAgICBDaGFuZ2VkIHN3aWdfcnVieV90cmFja2luZ3MgdG8gYmUgYSBzdGF0aWMgdmFyaWFibGUsIGJ1dCBhbHNvCgkgICAgYmUga2VwdCB3aXRoaW4gYSBoaWRkZW4gaW5zdGFuY2UgdmFyaWFibGUgaW4gdGhlIFNXSUcgbW9kdWxlLgoJICAgIFRoaXMgYWxsb3dzIHByb3Blcmx5IGRlYWxpbmcgd2l0aCB0cmFja2luZ3MgYWNyb3NzIG11bHRpcGxlCgkgICAgRFNPcywgd2hpY2ggd2FzIHByZXZpb3VzbHkgYnJva2VuLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIGltcHJvdmVtZW50IHRvIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldIEZpeGVkIEdDIG1lbW9yeSBpc3N1ZXMgd2l0aCB0cmFja2luZ3MgdGhhdCBjb3VsZCBsZWFkCgkgICAgdG8gc2VnZmF1bHRzIHdoZW4gZGVhbGluZywgbWFpbmx5LCB3aXRoIHN0YXRpYyB2YXJpYWJsZXMuCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBTdHJpbmcgY29udmVyc2lvbiB1c2luZyBvbGQgcnVieTEuNiBtYWNyb3MuICBOb3cKCSAgICBTdHJpbmdWYWx1ZVB0cigpIGlzIHVzZWQgaWYgYXZhaWxhYmxlLiAgVGhpcyByZW1vdmVzIHdhcm5pbmdzCgkgICAgd2hlbiBjb252ZXJ0aW5nIHN0cmluZ3Mgd2l0aCBcMCBpbiB0aGVtLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgdGhlIGFyZ291dCBjb3VudCBpbiBkaXJlY3RvcnMgZm9yIFJ1YnkuICBQcmV2aW91c2x5LAoJICAgIGlnbm9yZWQgb3IgIm51bWlucHV0cz0wIiB0eXBlbWFwcyB3b3VsZCBpbmNvcnJlY3RseSBub3QgZ2V0CgkgICAgY291bnRlZCB0b3dhcmRzIHRoZSBhcmdvdXQgY291bnQuCgkgICAgKGJ1Zy9wYXRjaCAjMTU0NTU4NSkKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFVwZ3JhZGVkIFJ1YnkgY29udmVydGVyIHRvIHJlY29nbml6ZSAibnVtaW5wdXRzPTAiLiAgUHJldmlvdXNseSwKCSAgICBvbmx5IHRoZSBvbGQgImlnbm9yZSIgZmxhZyB3YXMgY2hlY2tlZCAod2hpY2ggd291bGQgY3VycmVudGx5CgkgICAgc3RpbGwgd29yayBwcm9wZXJseSwgYnV0IGlzIGRlcHJlY2F0ZWQpLgoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnkgLSBidXQgc2hvdWxkIGJlIG1hZGUgZ2VuZXJpY10KCgkgICAgJWZlYXR1cmUoIm51bW91dHB1dHMiLCIwIikgYWRkZWQuCgoJICAgIFRoaXMgZmVhdHVyZSBhbGxvd3MgeW91IHRvIGlnbm9yZSB0aGUgb3V0cHV0IG9mIGEgZnVuY3Rpb24gc28KCSAgICB0aGF0IGl0IGlzIG5vdCBhZGRlZCB0byBhIGxpc3Qgb2Ygb3V0cHV0IHZhbHVlcwoJICAgICggaWUuIGFyZ291dHMgKS4KCSAgICBUaGlzIHNob3VsZCBhbHNvIGJlY29tZSBhIGZlYXR1cmUgb2YgJXR5cGVtYXAoZGlyZWN0b3JvdXQpCgkgICAgYXMgIm51bW91dHB1dHMiPTAsIGp1c3QgbGlrZSAibnVtaW5wdXRzIj0wIGV4aXN0cy4KCgkgICAgJWZlYXR1cmUoImRpcmVjdG9ycyI9MSkKCgkgICAgJWluY2x1ZGUgPHR5cGVtYXBzLmk+CgoJICAgICVmZWF0dXJlKCJudW1vdXRwdXRzIiwiMCIpIHsgQ2xhc3M6Om1lbWJlcl9mdW5jdGlvbjEgfTsKCSAgICAldHlwZW1hcChvdXQpIE1TdGF0dXMgeyAvLyBzb21lIGNvZGUsIGxpa2UgY2hlY2sgbXN0YXR1cwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByYWlzZSBleGNlcHRpb24gaWYgd3JvbmcgfTsKCgkgICAgJWlubGluZSAlewoJICAgICAgdHlwZWRlZiBpbnQgTVN0YXR1czsKCSAgICAgIGNsYXNzIENsYXNzIHsKCgkgICAgICAvLyBvbmUgYXJndW1lbnQgcmV0dXJuZWQsIGJ1dCBkaXJlY3RvciBvdXQgY29kZSBhZGRlZAoJICAgICAgLy8gTVN0YXR1cyBpcyBkaXNjYXJkZWQgYXMgYSByZXR1cm4gKG91dCkgcGFyYW1ldGVyLgoJICAgICAgdmlydHVhbCBNU3RhdHVzIG1lbWJlcl9mdW5jdGlvbjEoIGludCYgT1VUUFVUICk7CgoJICAgICAgLy8gdHdvIGFyZ3VtZW50cyByZXR1cm5lZCwgZGlyZWN0b3Igb3V0IGNvZGUgYWRkZWQKCSAgICAgIC8vIE1TdGF0dXMgaXMgbm90IGRpc2NhcmRlZAoJICAgICAgdmlydHVhbCBNU3RhdHVzIG1lbWJlcl9mdW5jdGlvbjIoIGludCYgT1VUUFVUICk7CgkgICAgICB9OwogICAgICAgICAgICAlfQoKCjA0LzIxLzIwMDc6IG9sbHkKCSAgICBGaXggcGFyc2luZyBvZiBmbG9hdCBjb25zdGFudHMgd2l0aCBhbiBleHBvbmVudCAoZS5nLiAxZS0wMmYpCgkgICAgKGJ1ZyAjMTY5OTY0NikuCgowNC8yMC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGxhY2sgb2YgZ2VuZXJhdGlvbiBvZiBkb2NzdHJpbmdzIHdoZW4gLU8gaXMgdXNlZC4KCSAgICBBbHNvLCBmaXggZ2VuZXJhdGlvbiBvZiBkb2NzdHJpbmdzIGNvbnRhaW5pbmcgYSBkb3VibGUgcXVvdGUKCSAgICBjaGFyYWN0ZXIuICBQYXRjaCBmcm9tIFJpY2hhcmQgQm91bHRvbiBpbiBidWcjMTcwMDE0Ni4KCjA0LzE3LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU3VwcG9ydCBmb3IgYWRkaW5nIGluIEphdmEvQyMgY29kZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbnRlcm1lZGlhcnkgY2FsbCwKICAgICAgICAgICAgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdGhlIG1hcnNoYWxsaW5nIG9mIHRoZSBwcm94eSB0eXBlIHRvIHRoZSBpbnRlcm1lZGlhcnkgdHlwZS4KICAgICAgICAgICAgVGhlIGphdmFpbi9jc2luIHR5cGVtYXAgbm93IHN1cHBvcnRzIHRoZSAncHJlJyBhbmQgJ3Bvc3QnIGF0dHJpYnV0ZXMgdG8gYWNoaWV2ZSB0aGlzLgogICAgICAgICAgICBUaGUgamF2YWluIHR5cGVtYXAgYWxzbyBzdXBwb3J0cyBhbiBvcHRpb25hbCAncGdjcHBuYW1lJyBhdHRyaWJ1dGUgZm9yIHByZW1hdHVyZSBnYXJiYWdlCiAgICAgICAgICAgIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgbmFtaW5nIGFuZCB0aGUgY3NpbiB0eXBlbWFwIHN1cHBvcnRzIGFuIG9wdGlvbmFsICdjc2hpbicKICAgICAgICAgICAgYXR0cmlidXRlIGZvciB0aGUgcGFyYW1ldGVyIHR5cGUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yIGhlbHBlciBnZW5lcmF0ZWQgd2hlbiB0aGUgdHlwZSBpcyB1c2VkCiAgICAgICAgICAgIGluIGEgY29uc3RydWN0b3IuIERldGFpbHMgaW4gdGhlIEphdmEuaHRtbCBhbmQgQ1NoYXJwLmh0bWwgZG9jdW1lbnRhdGlvbi4KCjA0LzE2LzIwMDc6IG9sbHkKCSAgICBEb24ndCB0cmVhdCBgcmVzdHJpY3QnIGFzIGEgcmVzZXJ2ZWQgaWRlbnRpZmllciBpbiBDKysgbW9kZQoJICAgIChidWcjMTY4NTUzNCkuCgowNC8xNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBob3cgemVuZF90aHJvd19leGNlcHRpb24oKSBpcyBjYWxsZWQgKGJ1ZyAjMTcwMDc4NSkuCgowNC8xMC8yMDA3OiBvbGx5CgkgICAgRGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IgdG8gdGVtcGxhdGUgZm9yIGFDQyAocmVwb3J0ZWQgb24KCSAgICBzd2lnLXVzZXIgdGhhdCB0aGlzIGlzIG5lZWRlZCkuCgowNC8wNC8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIElmIFpUUyBpcyBlbmFibGVkLCByZWxlYXNlIDxtb2R1bGU+X2dsb2JhbHNfaWQgaW4gTVNIVVRET1dOCgkgICAgdG8gYXZvaWQgUEhQIGludGVycHJldGVyIGNyYXNoIG9uIHNodXRkb3duLiAgVGhpcyBzb2x1dGlvbiB3YXMKCSAgICBzdWdnZXN0ZWQgaGVyZTogaHR0cDovL2J1Z3MucGhwLm5ldC9idWcucGhwP2lkPTQwOTg1CgowNC8wMy8yMDA3OiBvbGx5CgkgICAgW1BIUDRdIEFkZCBtaXNzaW5nIFpUUyBhbm5vdGF0aW9ucyB0byBnZW5lcmF0ZWQgQysrIHdyYXBwZXIgY29kZQoJICAgIHRvIGZpeCBjb21waWxhdGlvbiBmYWlsdXJlcyB3aGVuIHVzaW5nIFpUUyBlbmFibGVkIFNXSUcgKExpbnV4CgkgICAgZGlzdHJpYnV0aW9ucyB0ZW5kIHRvIGRpc2FibGUgWlRTLCBidXQgbm90YWJseSB0aGUgV2luZG93cyBidWlsZAoJICAgIHVzZXMgaXQgYnkgZGVmYXVsdCkuCgowNC8wMS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFBhdGNoICMxNjg0MjYxOiBmaXhlcyBoYW5kbGluZyBvZiB1bnNpZ25lZCBpbnQgbGl0ZXJhbHMsIHRoYW5rcyBMZWlnaCBTbWl0aC4KICAgICAgICAgICAgQWxzbywgaW1wcm92ZWQgZG9jdW1lbnRhdGlvbi4KCjAzLzMwLzIwMDc6IG9sbHkKCSAgICBBdm9pZCBnZW5lcmF0aW5nICc8OicgdG9rZW4gd2hlbiB1c2luZyBTd2lnVmFsdWVXcmFwcGVyPD4gb24gYSB0eXBlCgkgICAgd2hpY2ggc3RhcnRzIHdpdGggJzo6JyAocGF0Y2ggIzE2OTA5NDgpLgoKMDMvMjUvMjAwNzogd3V6emViIChKb2huIExlbnopCgkgICAgW3Blcmw1XSBBZGQgU1dJR19mYWlsIHRvIHRoZSBTV0lHX2V4Y2VwdGlvbiBtYWNyby4gIEZpeGVzIGEgZmV3IHByb2JsZW1zIHJlcG9ydGVkCgkgICAgb24gdGhlIG1haWxpbmcgbGlzdC4KCjAzLzIzLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFN0cmluZyBjb3B5aW5nIHBhdGNoIGZyb20gSm9zaCBDaGVycnkgcmVkdWNpbmcgbWVtb3J5IGNvbnN1bXB0aW9uIGJ5IGFib3V0IDI1JS4KCjAzLzIxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCAjMTYzMTk4NyBmcm9tIFVscmlrIFBldGVyc29uIC0gYm9vbCBJTk9VVCB0eXBlbWFwcwogICAgICAgICAgICBmYWlsIG9uIGJpZyBlbmRpYW4gbWFjaGluZXMuCgowMy8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0IGdpdmVuIGRvZGd5IEMrKyBjb2RlOiBuYW1lc3BhY2UgYWJjOjpkZWYgeyB9CgowMy8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgc28gdGhhdCBBUlJBWVNPRkNMQVNTRVMgYW5kIEFSUkFZU09GRU5VTVMgaW4gYXJyYXlzX2phdmEuaSBjYW4gYmUgYXBwbGllZAogICAgICAgICAgICB0byBwb2ludGVyIHR5cGVzLgoKMDMvMDMvMjAwNzogb2xseQoJICAgIFtQSFA1XSBXaGVuIHdlIGtub3cgdGhlIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZSBmb3IgYSBjb25zdGFudCwgdXNlCgkgICAgdGhhdCB0byBpbml0aWFsaXNlIHRoZSBjb25zdCBtZW1iZXIgaW4gdGhlIFBIUCB3cmFwcGVyIGNsYXNzLgoKMDMvMDIvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggUEhQIHdyYXBwZXIgY29kZSBnZW5lcmF0ZWQgZm9yIGNlcnRhaW4gY2FzZXMgb2YKCSAgICBvdmVybG9hZGVkIGZvcm1zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMuCgowMi8yNi8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFBhdGNoICMxNjU2Mzk1OiBmaXhlZCBoZXggYW5kIG9jdGFsIHZhbHVlcyBidWcsIHRoYW5rcyB0byBBcnRodXIgU215bGVzLgoKMDIvMjIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ZWQgYnVnIGluIHR5cGVtYXBzIHdoaWNoIGNhdXNlZCBkZXJpdmVkX2J5dmFsdWUgYW5kIHJuYW1lIHRlc3QgY2FzZXMgdG8gZmFpbC4KCSAgICBVcGRhdGVkIGRlcml2ZWRfYnl2YWx1ZS5pIHRvIGV4cGxhaW4gaG93IHRvIGZpbmQgYW5kIGZpeCB0aGUgcHJvYmxlbQoKMDEvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTM4NTIyIGFuZCAjMTMzODUyNywgZm9yd2FyZCB0ZW1wbGF0ZWQgY2xhc3MgZGVjbGFyYXRpb25zIHdpdGhvdXQgYQogICAgICAgICAgICBuYW1lIGZvciB0aGUgdGVtcGxhdGVkIGNsYXNzIHBhcmFtZXRlcnMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgY2xhc3M+IGNsYXNzIFg7CgowMS8yMy8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBQYXRjaCAjMTY0MDg2MjogPG1hbGxvYy5oPiByZXBsYWNlZCBieSA8c3RkbGliLmg+CgkgICAgUGF0Y2ggIzE1OTgwNjMgVHlwbyBpbiB0eXBlbWFwcy5pCgowMS8yMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIGx1YSBzcGVjaWZpYyBjYXJyYXlzLmkgd2hpY2ggYWRkcyB0aGUgb3BlcmF0b3JbXSBzdXBwb3J0LgoJICAgIG1vZGlmaWVkIHRoZSBtYWluIGNvZGUgdG8gbWFrZSBpdCBub3QgZW1pdCBhbGwgdGhlIGNsYXNzIG1lbWJlciBmdW5jdGlvbnMgJiBhY2Nlc3NvcnMKCSAgICBOb3RlOiBDIHN0cnVjdHMgYXJlIGNyZWF0ZWQgdXNpbmcgbmV3X1hYWCgpIHdoaWxlIEMrKyBjbGFzc2VzIHVzZSBYWFgoKSAoc2hvdWxkIGJlIHN0YW5kYXJkaXNlZCkKCSAgICBVcGRhdGVkIHRlc3QgY2FzZTogbGlfY2FycmF5cwoJICAgIFVwZGF0ZWQgdGhlIGRvY3VtZW50YXRpb24uCgowMS8xMi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBBZGQgc3VwcG9ydCBmb3IgbmV3ZnJlZSB0eXBlbWFwcyAoc29tZXRpbWVzIHVzZWQgYnkgJW5ld29iamVjdCkKCjAxLzEyLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLW1hY3JvZXJyb3JzLiAgIFdoZW4gc3VwcGxpZWQsIHRoaXMgd2lsbCBmb3JjZQogICAgICAgICAgICB0aGUgQyBzY2FubmVyL3BhcnNlciB0byByZXBvcnQgcHJvcGVyIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBjb2RlIGNvbnRhaW5lZAogICAgICAgICAgICBpbnNpZGUgU1dJRyBtYWNyb3MgKGRlZmluZWQgd2l0aCAlZGVmaW5lKS4gIEJ5IGRlZmF1bHQsIFNXSUcgbWVyZWx5IHJlcG9ydHMKICAgICAgICAgICAgZXJyb3JzIG9uIHRoZSBsaW5lIGF0IHdoaWNoIGEgbWFjcm8gaXMgdXNlZC4gIFdpdGggdGhpcyBvcHRpb24sIHlvdQogICAgICAgICAgICBjYW4gZXhwYW5kIHRoZSBlcnJvciBiYWNrIHRvIGl0cyBzb3VyY2UtLS1zb21ldGhpbmcgd2hpY2ggbWF5IHNpbXBsaWZ5CiAgICAgICAgICAgIGRlYnVnZ2luZy4KCjAxLzEyLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgW0ludGVybmFsc10gTWFqb3Igb3ZlcmhhdWwgb2YgQy9DKysgc2Nhbm5pbmcgaW1wbGVtZW50YXRpb24uICBGb3IgcXVpdGUKICAgICAgICAgICAgc29tZSB0aW1lLCBTV0lHIGNvbnRhaW5lZCB0d28gY29tcGxldGVseSBpbmRlcGVuZGVudCBDL0MrKyB0b2tlbml6ZXJzLS0KICAgICAgICAgICAgdGhlIGxlZ2FjeSBzY2FubmVyIGluIENQYXJzZS9jc2Nhbm5lci5jIGFuZCBhIGdlbmVyYWwgcHVycG9zZSBzY2FubmVyCiAgICAgICAgICAgIGluIFN3aWcvc2Nhbm5lci5jLiBTV0lHIHN0aWxsIGhhcyB0d28gc2Nhbm5pbmcgbW9kdWxlcywgYnV0IHRoZSBDIHBhcnNlcgogICAgICAgICAgICBzY2FubmVyIChDUGFyc2UvY3NjYW5uZXIuYykgbm93IHJlbGllcyB1cG9uIHRoZSBnZW5lcmFsIHB1cnBvc2UKICAgICAgICAgICAgc2Nhbm5lciBmb3VuZCBpbiBTd2lnL3NjYW5uZXIuYy4gIEFzIGEgcmVzdWx0LCBpdCBpcyBtdWNoIHNtYWxsZXIgYW5kCiAgICAgICAgICAgIGxlc3MgY29tcGxpY2F0ZWQuICBUaGlzIGNoYW5nZSBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG1haW50YWluIGFsbAogICAgICAgICAgICBvZiB0aGUgbG93LWxldmVsIEMgdG9rZW5pemluZyBpbiBvbmUgY2VudHJhbCBsb2NhdGlvbiBpbnN0ZWFkIG9mIHR3bwogICAgICAgICAgICBwbGFjZXMgYXMgYmVmb3JlLgoKICAgICAgICAgICAgKioqUE9URU5USUFMIEZMQUtJTkVTUyoqKgogICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgY2F1c2UgcHJvYmxlbXMgd2l0aCBhY2N1cmF0ZSBsaW5lIG51bWJlciByZXBvcnRpbmcKICAgICAgICAgICAgYXMgd2VsbCBhcyBlcnJvciByZXBvcnRpbmcgbW9yZSBnZW5lcmFsbHkuIEkgaGF2ZSB0cmllZCB0byByZXNvbHZlIHRoaXMKICAgICAgICAgICAgYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgY29ybmVyIGNhc2VzLgoKMDEvMTIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgdHlwZW1hcCB0aHJvd3MgZm9yIHN0ZDo6c3RyaW5nKiwgdHlwZW1hcCBmb3IgU1dJR1RZUEUgRFlOQU1JQywKCSAgICBjaGFuZ2VkIHRoZSBleGlzdGluZyB0aHJvd3MgdHlwZW1hcCB0byB0aHJvdyBhIHN0cmluZyBpbnN0ZWFkIG9mIG1ha2luZyBhIGNvcHkgb2YKCSAgICB0aGUgb2JqZWN0ICh1cGRhdGluZyBhIGZldyB0ZXN0IGNhc2VzIHRvIGRlYWwgd2l0aCB0aGUgY2hhbmdlKS4KCSAgICBmaXhlZCB0ZXN0IGNhc2U6IGR5bmFtaWNfY2FzdHMsIGV4Y2VwdGlvbl9wYXJ0aWFsX2luZm8sIGxpX3N0ZF9zdHJpbmcsIHNpemVfdAoKMDEvMDMvMjAwNzogYmVhemxleQogICAgICAgICAgICBbSW50ZXJuYWxzXS4gIFVzZSBvZiBzd2lna2V5cy5jLy5oIHZhcmlhYmxlcyBpcyByZXZva2VkLiAgUGxlYXNlIHVzZQogICAgICAgICAgICBzaW1wbGUgc3RyaW5ncyBmb3IgYXR0cmlidXRlIG5hbWVzLgoKMTIvMzAvMjAwNjogYmVhemxleQogICAgICAgICAgICBJbnRlcm5hbCBBUEkgZnVuY3Rpb25zIEhhc2hHZXRBdHRyKCkgYW5kIEhhc2hDaGVja0F0dHIoKSBoYXZlIGJlZW4gcmV2b2tlZC4KICAgICAgICAgICAgUGxlYXNlIHVzZSBHZXRhdHRyKCkgdG8gcmV0cmlldmUgYXR0cmlidXRlcy4gIFRoZSBmdW5jdGlvbiBDaGVja2F0dHIoKSBjYW4KICAgICAgICAgICAgYmUgdXNlZCB0byBjaGVjayBhdHRyaWJ1dGVzLiAgTm90ZTogIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmV2b2tlZAogICAgICAgICAgICBiZWNhdXNlIHRoZXkgb25seSBhZGRlZCBhIG1hcmdpbmFsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGF0IHRoZSBleHBlbnNlCiAgICAgICAgICAgIGNvZGUgY2xhcml0eS4KCjEyLzI2LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIG1vcmUgU1RMIChtb3JlIGV4Y2VwdGlvbnMsIG1hcCwgc2l6ZV90KSwKCSAgICBmaXhlZCB0ZXN0IGNhc2U6IGNvbnZlcnNpb25fbnNfdGVtcGxhdGUuCgoxMi8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBVcGRhdGUgdG8gdGhyb3cgZXJyb3JzIHdoZW4gc2V0dGluZyBpbW11dGFibGVzLAoJICAgIGFuZCBhbGxvd2luZyB1c2VyIGFkZGl0aW9uIG9mIG1vZHVsZSB2YXJpYWJsZXMuCgoxMi8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZWRlZidkIHZhcmlhYmxlIHdyYXBwZXJzIHRoYXQgdXNlICVuYXR1cmFsdmFyLCBlZywgc3RkOjpzdHJpbmcuCgoxMi8xNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBzdGQ6OndzdHJpbmcgYW5kIHdjaGFyX3QgdHlwZW1hcHMKCjEyLzE0LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBGaXggYnVnICMxNjEzNjczIChiYWQgUEhQNSBjb2RlIGdlbmVyYXRlZCBmb3IgZ2V0dGVycyBhbmQKCSAgICBzZXR0ZXJzKS4KCjEyLzAyLzIwMDY6IHdzZnVsdG9uLCBKb2huIExlbnosIERhdmUgQmVhemxleQogICAgICAgICAgICBNb3ZlIGZyb20gY3ZzIHRvIFN1YnZlcnNpb24gZm9yIHNvdXJjZSBjb250cm9sCgoxMS8zMC8yMDA2OiBiZWF6bGV5CiAgICAgICAgICAgIENsZWFuZWQgdXAgc3dpZ3dhcm5pbmdzLnN3ZyBmaWxlIG5vdCB0byB1c2UgbmVzdGVkIG1hY3JvCiAgICAgICAgICAgIGRlZmluaXRpb25zLgoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZm9yICVleHRlbmQgdG8gd29yayBmb3Igc3RhdGljIG1lbWJlciB2YXJpYWJsZXMuCgpWZXJzaW9uIDEuMy4zMSAoTm92ZW1iZXIgMjAsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzEyLzIwMDY6IEx1aWdpIEJhbGxhYmlvCiAgICAgICAgICAgIFtQeXRob25dIEFsdGVybmF0ZSBmaXggZm9yIFB5dGhvbiBleGNlcHRpb25zIGJ1ZyAjMTU3ODM0NiAodGhlIHByZXZpb3VzIG9uZSBicm9rZSBQeXRob24KICAgICAgICAgICAgcHJvcGVydGllcyBpbiBtb2Rlcm4gY2xhc3NlcykKCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIC1mYWtldmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24gbm93IGdlbmVyYXRlcyB0aGUgZmFrZSB2ZXJzaW9uIGludG8gdGhlIGdlbmVyYXRlZCB3cmFwcGVycwogICAgICAgICAgICBhcyB3ZWxsIGFzIGRpc3BsYXlpbmcgaXQgd2hlbiB0aGUgLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uIGlzIHVzZWQuCgoxNC8xMS8yMDA2OiBtZ29zc2FnZQoJICAgIFtsdWFdIHVwZGF0ZSB0byB0eXBlbWFwIGZvciBvYmplY3QgYnkgdmFsdWUsIHRvIG1ha2UgaXQgYzg5IGNvbXBsaWFudAoKVmVyc2lvbiAxLjMuMzAgKE5vdmVtYmVyIDEzLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbamF2YV0gUmVtb3ZlIERldGFjaEN1cnJlbnRUaHJlYWQgcGF0Y2ggZnJvbSAgMDgvMTEvMjAwNiAtIGl0IGNhdXNlcyBzZWdmYXVsdHMKICAgICAgICAgICAgb24gc29tZSBzeXN0ZW1zLgoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW3B5dGhvbl0gRml4ICMxNTc4MzQ2IC0gUHl0aG9uIGV4Y2VwdGlvbnMgd2l0aCAtbW9kZXJuCgoxMS8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1OTMyOTEgLSBTbWFydCBwb2ludGVycyBhbmQgaW5oZXJpdGluZyBmcm9tIHRlbXBsYXRlcyAKCjExLzA5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkaXJlY3RvciBvcGVyYXRvciBwb2ludGVyL3JlZmVyZW5jZSBjYXN0cyAtICMxNTkyMTczLgoKMTEvMDcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgQWRkICRzZWxmIHNwZWNpYWwgdmFyaWFibGUgZm9yICVleHRlbmQgbWV0aG9kcy4gUGxlYXNlIHVzZSB0aGlzIGluc3RlYWQgb2YganVzdCAnc2VsZicKICAgICAgICAgICAgYXMgdGhlIEMrKyAndGhpcycgcG9pbnRlci4KCjExLzA3LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0gCgkgICAgYWxsZWdyb2NsLnN3Zzogc3dpZy1kZWZ2YXIgdXBkYXRlZCB0byBhbGxvdyBzcGVjaWZ5aW5nIG9mCgkgICAgCQkgICBub24tZGVmYXVsdCBmb3JlaWduIHR5cGUgKHZpYSA6ZnR5cGUga2V5d29yZCBhcmcpLgoJICAgIGFsbGVncm9jbC5jeHg6IFNwZWNpZnkgcHJvcGVyIGFjY2VzcyB0eXBlIGZvciBlbnVtIHZhbHVlcy4KCjExLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhL0MjXSBGaXggY29uc3Qgc3RkOjpzdHJpbmcmIHJldHVybiB0eXBlcyBmb3IgZGlyZWN0b3JzIGFzIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIE1hcmsgRG9uc2Vsem1hbm4KCjEwLzI5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZW1vdmUgRGVsZXRlTG9jYWxSZWYgZnJvbSBlbmQgb2YgZGlyZWN0b3IgbWV0aG9kcyBmb3Igbm93IGFzIGl0IGlzIGNhdXNpbmcgYQogICAgICAgICAgICBzZWcgZmF1bHQgd2hlbiBydW4gb24gU29sYXJpcyA4LgoKMTAvMjkvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0d1aWxlXSBQYXRjaCBmcm9tIENocmlzIFNob2VtYWtlciB0byBjbGVhbiB1cCBzb21lIHdhcm5pbmdzIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4KCjEwLzI5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBJbXBvcnRhbnQgZml4IHRvIHByZXZlbnQgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHRoZSBKYXZhIHByb3h5IGNsYXNzCiAgICAgICAgICAgIHdoaWxlIGl0IGlzIGJlaW5nIHVzZWQgaW4gYSBuYXRpdmUgbWV0aG9kLiBUaGUgZmluYWxpemVyIGNvdWxkIGRlc3Ryb3kgdGhlIHVuZGVybHlpbmcKICAgICAgICAgICAgQysrIG9iamVjdCB3aGlsZSBpdCB3YXMgYmVpbmcgdXNlZC4gVGhlIHByb2JsZW0gb2NjdXJzIHdoZW4gdGhlIHByb3h5IGNsYXNzIGlzIG5vCiAgICAgICAgICAgIGxvbmdlciBzdHJvbmdseSByZWFjaGFibGUgYWZ0ZXIgYSBuYXRpdmUgY2FsbC4gIFRoZSBwcm9ibGVtIHNlZW1zIHRvIG9jY3VyIGluCiAgICAgICAgICAgIG1lbW9yeSBzdHJlc3Mgc2l0dWF0aW9ucyBvbiBzb21lIEpWTXMuIEl0IGRvZXMgbm90IHNlZW0gdG8gb2NjdXIgb24gdGhlCiAgICAgICAgICAgIFN1biBjbGllbnQgSlZNIHVwIHRvIGpkayAxLjUuIEhvd2V2ZXIgdGhlIDEuNiBjbGllbnQgamRrIGhhcyBhIG1vcmUgYWdncmVzc2l2ZSBnYXJiYWdlCiAgICAgICAgICAgIGNvbGxlY3RvciBhbmQgc28gdGhlIHByb2JsZW0gZG9lcyBvY2N1ci4gSXQgZG9lcyBvY2N1ciBvbiB0aGUgU3VuIHNlcnZlcgogICAgICAgICAgICBKVk1zIChjZXJ0YWlubHkgMS40IG9ud2FyZHMpLiBUaGUgZml4IGVudGFpbHMgcGFzc2luZyB0aGUgcHJveHkgY2xhc3MgaW50byB0aGUgbmF0aXZlCiAgICAgICAgICAgIG1ldGhvZCBpbiBhZGRpdGlvbiB0byB0aGUgQysrIHBvaW50ZXIgaW4gdGhlIGxvbmcgcGFyYW1ldGVyLCBhcyBKYXZhIGNsYXNzZXMgYXJlIG5vdAogICAgICAgICAgICBjb2xsZWN0ZWQgd2hlbiB0aGV5IGFyZSBwYXNzZWQgaW50byBKTkkgbWV0aG9kcy4gVGhlIGV4dHJhIHBhcmFtZXRlciBjYW4gYmUgc3VwcHJlc3NlZAogICAgICAgICAgICBieSBzZXR0aW5nIHRoZSBub3BnY3BwIGF0dHJpYnV0ZSBpbiB0aGUganR5cGUgdHlwZW1hcCB0byAiMSIgb3IgdXNpbmcgdGhlIG5ldyAtbm9wZ2NwcAogICAgICAgICAgICBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICBTZWUgSmF2YS5odG1sI2phdmFfcGdjcHAgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiB0aGlzIHRvcGljLgoKMTAvMjQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggc21hcnQgcG9pbnRlciB3cmFwcGVycy4gVGhlIHZpcnR1YWwvb3ZlcnJpZGUvbmV3IGtleXdvcmQgaXMgbm90IGdlbmVyYXRlZAogICAgICAgICAgICBmb3IgZWFjaCBtZXRob2QgYXMgdGhlIHNtYXJ0IHBvaW50ZXIgY2xhc3MgZG9lcyBub3QgbWlycm9yIHRoZSB1bmRlcmx5aW5nIHBvaW50ZXIKICAgICAgICAgICAgY2xhc3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBTRiAjMTQ5NjUzNQoKMTAvMjQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gYWRkZWQgc3VwcG9ydCBmb3IgbmF0aXZlIG1ldGhvZHMgJiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCiAgICAgICAgICAgIGZpeGVkIHRlc3QgY2FzZXMgYXJyYXlzX2RpbWVuc2lvbmxlc3MgJiBjcHBfYmFzaWMuIEFkZGVkIG5ldyBleGFtcGxlIChmdW5jdG9yKS4KICAgICAgICAgICAgdGlkaWVkIHVwIGEgbGl0dGxlIG9mIHRoZSBjb2RlIChhcm91bmQgY2xhc3NIYW5kbGVyKS4KCjEwLzE3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gZGlyZWN0b3JvdXQgdHlwZW1hcCBjaGFuZ2VzIHRvIGZhbGwgaW4gbGluZSB3aXRoIHRoZSBvdGhlciBkaXJlY3RvcgogICAgICAgICAgICBsYW5ndWFnZXMuICRyZXN1bHQgaXMgbm93IHVzZWQgd2hlcmUgJDEgdXNlZCB0byBiZSB1c2VkLiBQbGVhc2UgY2hhbmdlIHlvdXIgdHlwZW1hcHMKICAgICAgICAgICAgaWYgeW91IGhhdmUgYSBjdXN0b20gZGlyZWN0b3JvdXQgdHlwZW1hcC4KCjEwLzE4LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFNvbWUgZml4ZXMgZm9yIGFwcGx5aW5nIHRoZSBjaGFyIGFycmF5IHR5cGVtYXBzIHRvIHVuc2lnbmVkIGNoYXIgYXJyYXlzLgoKMTAvMTcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBBZGQgaW4gY29uc3Qgc2l6ZV90JiBhbmQgY29uc3Qgc3RkOjpzaXplX3QmIHR5cGVtYXBzLgoKMTAvMTUvMjAwNjogZWZ1enp5b25lIAogICAgICAgICAgICBbQ0ZGSV0gU3VwcHJlc3MgZ2VuZXJhdGluZyBkZWZjdHlwZSBmb3IgZW51bXMsIHRoYW5rcyB0byBBcnRodXIgU215bGVzLiBQYXRjaCAxNTYwOTgzLiAKCjEwLzE0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gTWlub3IgZml4IHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggdGhlIChhcyB5ZXQgdW5yZWxlYXNlZCkgY2hpY2tlbiAyLjUKCiAgICAgICAgICAgIFtHdWlsZSxDaGlja2VuXSBGaXggU0YgQnVnIDE1NzM4OTIuICBBZGRlZCBhbiBleHRfdGVzdCB0byB0aGUgdGVzdCBzdWl0ZSB0byB0ZXN0CiAgICAgICAgICAgIHRoaXMgYnVnLCBidXQgdGhpcyB0ZXN0IGNhbiBub3QgcmVhbGx5IGJlIG1hZGUgZ2VuZXJpYyBiZWNhdXNlIHRoZSBleHRlcm5hbCBjb2RlIG11c3QKICAgICAgICAgICAgcGx1ZyBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgaW50ZXJwcmV0ZXIgZGlyZWN0bHkuCiAgICAgICAgICAgIFNlZSBFeGFtcGxlcy90ZXN0LXN1aXRlL2NoaWNrZW4vZXh0X3Rlc3QuaSBhbmQgZXh0X3Rlc3RfZXh0ZXJuYWwuY3h4CgogICAgICAgICAgICBBZGRlZCBhICUuZXh0ZXJuYWx0ZXN0IHRvIGNvbW1vbi5taywgYW5kIGFueSBpbnRlcmVzdGVkIGxhbmd1YWdlIG1vZHVsZXMgY2FuCiAgICAgICAgICAgIGNvcHkgYW5kIHNsaWdodGx5IG1vZGlmeSBlaXRoZXIgdGhlIGNoaWNrZW4gb3IgdGhlIGd1aWxlIGV4dF90ZXN0LmkKCjEwLzE0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIGFkZGVkIE9VVFBVVCYgZm9yIGFsbCBudW1iZXIgdHlwZXMsIGFkZGVkIGEgbG9uZyBsb25nIHR5cGUKICAgICAgICAgICAgZml4ZWQgc2V2ZXJhbCB0ZXN0IGNhc2VzLgogICAgICAgICAgICB1cGRhdGU6IGNoYW5nZWQgdHlwZW1hcHMgdG8gdXNlIFNXSUdfQ29udmVydFB0ciByYXRoZXIgdGhhbiBTV0lHX011c3RHZXRQb2ludGVyCiAgICAgICAgICAgIHN0YXJ0ZWQgc3BsaXRpbmcgbHVhLnN3ZyBpbnRvIHNtYWxsZXIgcGFydHMgdG8gbWFrZSBpdCBuZWF0ZXIKCjEwLzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gTWFyZ2luYWxseSBiZXR0ZXIgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugb25seSBpbiB0aGF0IHlvdSBjYW4KICAgICAgICAgICAgY29udHJvbCB3aGF0IHRoZSBiYXNlIGNsYXNzIGlzLiBUaGlzIGlzIGRvbmUgdXNpbmcgdGhlIG5ldyAncmVwbGFjZScgYXR0cmlidXRlIGluIHRoZSAKICAgICAgICAgICAgamF2YWJhc2UvY3NiYXNlIHR5cGVtYXAsIGVnIGluIHRoZSBmb2xsb3dpbmcsICdNZScgd2lsbCBiZSB0aGUgYmFzZSBjbGFzcywKICAgICAgICAgICAgbm8gbWF0dGVyIHdoYXQgRm9vIGlzIHJlYWxseSBkZXJpdmVkIGZyb20gaW4gdGhlIEMrKyBsYXllci4KCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJhc2UsIHJlcGxhY2U9IjEiKSBGb28gIk1lIjsKICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UsIHJlcGxhY2U9IjEiKSBGb28gIk1lIjsKCiAgICAgICAgICAgIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIGphdmFiYXNlL2NzYmFzZSB0eXBlbWFwcyB0byBvdmVycmlkZSB0aGUgQysrIGJhc2UuCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVtb3ZlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBvbiB0aGUgcHJveHkgY2xhc3MnIGRlbGV0ZSgpIG1ldGhvZCAKICAgICAgICAgICAgKGl0IGlzIG5vdyBhIHN5bmNocm9uaXplZCBtZXRob2QsIGJ1dCBpcyBub3cgY3VzdG9taXNhYmxlIGJ5IGNoYW5naW5nIHRoZSAKICAgICAgICAgICAgbWV0aG9kbW9kaWZpZXJzIGF0dHJpYnV0ZSBpbiB0aGUgamF2YWRlc3RydWN0IG9yIGphdmFkZXN0cnVjdF9kZXJpdmVkIHR5cGVtYXApCgogICAgICAgICAgICBbQyNdIFJlbW92ZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gb24gdGhlIHByb3h5IGNsYXNzJyBEaXNwb3NlKCkgbWV0aG9kLCAKICAgICAgICAgICAgc2ltaWxhciB0byBKYXZhJ3MgZGVsZXRlKCkgYWJvdmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIFJlbW92ZSByZWR1bmRhbnQgZGlyZWN0b3IgY29kZSBpbiAlZXh0ZW5kIG1ldGhvZHMgKCVleHRlbmQKICAgICAgICAgICAgbWV0aG9kcyBjYW5ub3QgYmUgZGlyZWN0b3IgbWV0aG9kcykKCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIEZpeCAjMTUwNTU5NCAtIGRpcmVjdG9yIG9iamVjdHMgbm90IHJldHVybmVkIGFzIGRpcmVjdG9yIG9iamVjdHMKICAgICAgICAgICAgaW4gJWV4dGVuZCBtZXRob2RzLgoKMTAvMTEvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCAjMTIzODc5OCAtIERpcmVjdG9ycyB1c2luZyB1bnNpZ25lZCBsb25nIGxvbmcgb3IgYW55IG90aGVyIHR5cGUKICAgICAgICAgICAgbWFyc2hhbGxlZCBhY3Jvc3MgdGhlIEpOSSBib3VuZGFyeSB1c2luZyBhIEphdmEgY2xhc3MgKHdoZXJlIHRoZSBqbmkgdHlwZW1hcCAKICAgICAgICAgICAgY29udGFpbnMgam9iamVjdCkuCgoxMC8wNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzExNjIxOTQgLSAjaW5jbHVkZS8laW5jbHVkZSB3aXRoaW4gYSBzdHJ1Y3R1cmUKCjEwLzA2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTQ1MDY2MSwgc3RyaW5nIHRydW5jYXRpb24gaW4gU3RyaW5nX3NlZWsgdHJ1bmNhdGluZyBKYXZhL0MjIGVudW1zLgoKMTAvMDYvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ICMxNTY5NTg3LiBUaGUgbmFtZSBpcyBub3cgY29ycmVjdC4KCjEwLzA0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yIGZpeGVzIGZvciB2aXJ0dWFsIGNvbnZlcnNpb24gb3BlcmF0b3JzCgoxMC8wNC8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4ICMxNTY5NTg3IGZvciBQSFAuICBEb24ndCB1c2Ugc2l6ZW9mKCkgZXhjZXB0IHdpdGggc3RyaW5nCgkgICAgbGl0ZXJhbHMuICBDaGFuZ2Ugc29tZSAiLy8iIGNvbW1lbnRzIHRvICIvKiAqLyIgZm9yIHBvcnRhYmlsaXR5LgoKMTAvMDQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gUGFydGlhbCBGaXggIzE1Njk1ODcuIFRoZSB0eXBlIGlzIG5vdyBjb3JyZWN0LCBidXQgdGhlIG5hbWUgaXMgc3RpbGwgbm90IGNvcnJlY3QuCgoxMC8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICMxNTI3ODg1IC0gT3ZlcmxvYWRlZCBkaXJlY3RvciB2aXJ0dWFsIG1ldGhvZHMgc29tZXRpbWVzIHByb2R1Y2VkCiAgICAgICAgICAgIHVuY29tcGlsYWJsZSBjb2RlIHdoZW4gdXNlZCB3aXRoIHRoZSBkaXJlY3RvcjpleGNlcHQgZmVhdHVyZS4KCjEwLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yczogRGlyZWN0b3JzIGFyZSBvdXRwdXQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGRlY2xhcmVkIGluIAogICAgICAgICAgICB0aGUgQysrIGNsYXNzIHJhdGhlciB0aGFuIGluIHNvbWUgcHNldWRvLXJhbmRvbSBvcmRlci4KCjEwLzAzLzIwMDY6IG1tYXR1cwogICAgICAgICAgICBGaXggIzE0ODYyODEgYW5kICMxNDcxMDM5LgoKMTAvMDMvMjAwNjogb2xseQoJICAgIFtQZXJsXSBGaXggZm9yIGhhbmRsaW5nIHN0cmluZ3Mgd2l0aCB6ZXJvIGJ5dGVzIGZyb20gU3RlcGhlbiBIdXRzYWwuCgowOS8zMC8yMDA2OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIEJpdGZpZWxkIHN1cHBvcnQgYW5kIHZhcmFyZyBzdXBwb3J0IGR1ZSB0byBBcnRodXIgU215bGVzLgogICAgICAgICAgICBDIGV4cHJlc3Npb24gdG8gTGlzcCBjb252ZXJzaW9uLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcyBmb3IgdGhlIGluaXRpYWwKICAgICAgICAgICAgaWRlYSwgaXQgbm93IHN1cHBvcnRzIGNvbnZlcnNpb24gZm9yIGEgd2hvbGUgcmFuZ2Ugb2YgQyBleHByZXNzaW9ucy4gCgowOS8yOC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1MDgzMjcgLSBPdmVybG9hZGVkIG1ldGhvZHMgYXJlIGhpZGRlbiB3aGVuIHVzaW5nIC1mdmlydHVhbCBvcHRpbWlzYXRpb24uCiAgICAgICAgICAgIE92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgbm8gbG9uZ2VyIGNhbmRpZGF0ZXMgZm9yIGVsaW1pbmF0aW9uIC0gdGhpcyBtaW1pY3MKICAgICAgICAgICAgQysrIGJlaGF2aW91ciB3aGVyZSBhbGwgb3ZlcmxvYWRlZCBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBhbmQgaW1wbGVtZW50ZWQKICAgICAgICAgICAgaW4gYSBkZXJpdmVkIGNsYXNzIGluIG9yZGVyIGZvciB0aGVtIHRvIGJlIGF2YWlsYWJsZS4KCjA5LzI1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob24sIE9jYW1sXSBGaXggIzE1MDU1OTEgVGhyb3dpbmcgZXhjZXB0aW9ucyBpbiBleHRlbmRlZCBkaXJlY3RvcnMKCjA5LzI1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA1NjEwMCAtIHZpcnR1YWwgb3BlcmF0b3JzLiAKCjA5LzI0LzIwMDY6IG9sbHkKCSAgICBEb24ndCBhY2NpZGVudGFsbHkgY3JlYXRlIGEgIjw6IiB0b2tlbiAod2hpY2ggaXMgdGhlIHNhbWUgYXMgIlsiIGluIEMrKykuCgkgICAgRml4ZXMgYnVnICMgMTUyMTc4OC4KCjA5LzIzLzIwMDY6IG9sbHkKCSAgICBbUnVieV0gU3VwcG9ydCBidWlsZGluZyB3aXRoIHJlY2VudCB2ZXJzaW9ucyBvZiB0aGUgUnVieSAxLjkKCSAgICBkZXZlbG9wbWVudCBicmFuY2guICBGaXhlcyBidWcgIzE1NjAwOTIuCgowOS8yMy8yMDA2OiBvbGx5CgkgICAgVGVtcGxhdGVzIGNhbiBub3cgYmUgaW5zdGFudGlhdGVkIHVzaW5nIG5lZ2F0aXZlIG51bWJlcnMgYW5kCgkgICAgY29uc3RhbnQgZXhwcmVzc2lvbnMsIGUuZy46CgoJICAgIHRlbXBsYXRlPGludCBxPiBjbGFzcyB4IHt9OwoJICAgICV0ZW1wbGF0ZSh4X21pbnVzMSkgeDwtMT47CgkgICAgJXRlbXBsYXRlKHhfMXBsdXMyKSB4PDErMj47CgoJICAgIEFsc28sIGNvbnN0YW50IGV4cHJlc3Npb25zIGNhbiBub3cgaW5jbHVkZSBjb21wYXJpc29ucyAoPiwgPCwgPj0sCgkgICAgPD0sICE9LCA9PSksIG1vZHVsdXMgKCUpLCBhbmQgdGVybmFyeSBjb25kaXRpb25hbHMgKGEgPyBiIDogYykuCgoJICAgIEZpeGVzIGJ1Z3MgIzY0NjI3NSwgIzkyNTU1NSwgIzk1NjI4MiwgIzk5NDMwMS4KCjA5LzIyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlaWdub3JlIG9uIGRpcmVjdG9yIG1ldGhvZHMgLSBCdWdzICMxNTQ2MjU0LCAjMTU0MzUzMwoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpZ25vcmUgb24gZGlyZWN0b3IgY29uc3RydWN0b3JzCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0cyBhbmQgYXNzZXJ0cyB3aGVuIGRpcmVjdG9yIG1ldGhvZHMgYXJlIGlnbm9yZWQgKCMxNTQzNTMzKQoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IG91dCBvZiBzb3VyY2UgYnVpbGRzIC0gYnVnICMxNTQ0NzE4CgowOS8yMC8yMDA2OiBvbGx5CgkgICAgVHJlYXQgYSBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbiBhcyBhIGZvcndhcmQgZGVjbGFyYXRpb24gcmF0aGVyCgkgICAgdGhhbiBpZ25vcmluZyBpdCBjb21wbGV0ZWx5LCBzbyB0aGF0IHdlIGdlbmVyYXRlIGNvcnJlY3QgY29kZSBmb3IKCSAgICBwYXNzaW5nIG9wYXF1ZSBwb2ludGVycyB0byB0aGUgbmVzdGVkIGNsYXNzIChmaXhlcyBTRiBidWcgIzkwOTM4NykuCgowOS8yMC8yMDA2OiBvbGx5CiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIFtwaHBdIE92ZXJsb2FkIHJlc29sdXRpb24gbm93IHdvcmtzLiAgSG93ZXZlciB0byBhbGxvdyB0aGlzLCBTV0lHCgkgICAgZ2VuZXJhdGVkIHdyYXBwZXJzIG5vIGxvbmdlciBjb2VyY2UgUEhQIHR5cGVzICh3aGljaCByZXZlcnRzIGEgY2hhbmdlCgkgICAgbWFkZSBpbiAxLjMuMjYpLiAgU28gZm9yIGV4YW1wbGUsIGlmIGEgbWV0aG9kIHRha2VzIGEgc3RyaW5nLCB5b3UKCSAgICBjYW4gbm8gbG9uZ2VyIHBhc3MgYSBudW1iZXIgd2l0aG91dCBleHBsaWNpdGx5IGNvbnZlcnRpbmcgaXQgdG8gYQoJICAgIHN0cmluZyBpbiBQSFAgdXNpbmc6IChzdHJpbmcpeAoKMDkvMTgvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0FMTF0gZml4IG9uIHN3aWdpbml0LnN3ZywgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gY3Jhc2ggb24gc2V2ZXJhbCB0ZXN0IGNhc2VzCgkgICAgZm91bmQgYW5kIGZpeGVkIHByb2JsZW0gaW4gaW1wb3J0cyB1bmRlciBweXRob24gKG1pbmd3KQoKMDkvMTYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggZnJvbSBNaWNoYWwgTWFyZWsgZm9yIFB5dGhvbiAyLjUgdG8gZml4IDY0IGJpdCBhcnJheSBpbmRleGVzIG9uCiAgICAgICAgICAgIDY0IGJpdCBtYWNoaW5lcy4KCjA5LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBleHBsaWNpdGNhbGwgZmVhdHVyZSBoYXMgYmVlbiBzY3JhcHBlZC4gVGhpcyBmZWF0dXJlIHdhcyBpbnRyb2R1Y2VkIHByaW1hcmlseQogICAgICAgICAgICB0byBzb2x2ZSByZWN1cnNpdmUgZGlyZWN0b3IgbWV0aG9kIGNhbGxzLiBEaXJlY3RvciB1cGNhbGwgaW1wcm92ZW1lbnRzIG1hZGUgaW5zdGVhZDoKCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jYW1sXSBUaGUgc3dpZ191cCBmbGFnIGlzIG5vIGxvbmdlciB1c2VkLiBUaGUgcmVxdWlyZWQgbXV0ZXhlcwogICAgICAgICAgICB3cmFwcGluZyB0aGlzIGZsYWcgYXJlIGFsc28gbm8gbG9uZ2VyIG5lZWRlZC4gVGhlIHJlY3Vyc2l2ZSBjYWxscyBnb2luZyBmcm9tIEMrKwogICAgICAgICAgICB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGFuZCBiYWNrIGFnYWluIGV0YyBhcmUgbm93IGF2b2lkZWQgYnkgYSBzdWJ0bGVseSBkaWZmZXJlbnQKICAgICAgICAgICAgYXBwcm9hY2guIEluc3RlYWQgb2YgdXNpbmcgdGhlIHN3aWdfdXAgZmxhZyBpbiBlYWNoIGRpcmVjdG9yIG1ldGhvZCB0byBpbmRpY2F0ZQogICAgICAgICAgICB3aGV0aGVyIHRoZSBleHBsaWNpdCBDKysgY2FsbCB0byB0aGUgYXBwcm9wcmlhdGUgYmFzZSBjbGFzcyBtZXRob2Qgb3IgYSBub3JtYWwKICAgICAgICAgICAgcG9seW1vcnBoaWMgQysrIGNhbGwgc2hvdWxkIGJlIG1hZGUsIHRoZSBuZXcgYXBwcm9hY2ggbWFrZXMgb25lIG9mIHRoZXNlIGNhbGxzCiAgICAgICAgICAgIGRpcmVjdGx5IGZyb20gdGhlIHdyYXBwZXIgbWV0aG9kLgoKICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgcmVjdXJzaXZlIGNhbGwgcHJvYmxlbSB3aGVuIGNhbGxpbmcgYSBDKysgYmFzZSBjbGFzcyBtZXRob2QgZnJvbQogICAgICAgICAgICBKYXZhL0MjIGlzIG5vdyBmaXhlZC4gVGhlIGltcGxlbWVudGF0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzCiAgICAgICAgICAgIGFzIHRoZSBkZXRlY3Rpb24gYXMgdG8gd2hldGhlciB0aGUgZXhwbGljaXQgY2FsbCBvciBhIG5vcm1hbCBwb2x5bW9ycGhpYyBjYWxsIGlzIG1hZGUKICAgICAgICAgICAgaW4gdGhlIEphdmEvQyMgbGF5ZXIgcmF0aGVyIHRoYW4gaW4gdGhlIEMrKyBsYXllci4KCjA5LzExLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtBTExdIHVwZGF0ZWQgc3dpZ2luaXQuc3dnIHRvIGFsbG93IG11bHRpcGxlIGludGVycHJldGVycyB0byB1c2UgbXVsdGlwbGUKCSAgICBzd2lnIG1vZHVsZXMgYXQgb25jZS4gVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgaW4gTHVhIChtaW5ndyAmIGxpbnV4KSwKCSAgICBwZXJsNSAmIHB5dGhvbiAobGludXgpIG9ubHkuCgowOS8xMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBhZGRlZCBzdXBwb3J0IGZvciBwYXNzaW5nIGZ1bmN0aW9uIHBvaW50ZXJzIGFzIHdlbGwgYXMgbmF0aXZlIGx1YSBvYmplY3QKICAgICAgICAgICAgaW50byB3cmFwcGVyZWQgZnVuY3Rpb24uCiAgICAgICAgICAgIEFkZGVkIGV4YW1wbGUgZnVuY3B0cjMgdG8gZGVtb25zdHJhdGUgdGhpcyBmZWF0dXJlCgowOS8wNS8yMDA2OiBvbGx5CgkgICAgW3BocF0gUmVuYW1lIEVycm9yQ29kZSBhbmQgRXJyb3JNc2cgI2RlZmluZS1zIHRvIFNXSUdfRXJyb3JDb2RlCgkgICAgYW5kIFNXSUdfRXJyb3JNc2cgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIGNvZGUgdGhlIHVzZXIgbWlnaHQgYmUKCSAgICB3cmFwcGluZyAocGF0Y2ggZnJvbSBEYXJyZW4gV2FybmVyIGluIFNGIGJ1ZyAjMTQ2NjA4NikuICBBbnkKCSAgICB1c2VyIHR5cGVtYXBzIHdoaWNoIHVzZSBFcnJvckNvZGUgYW5kL29yIEVycm9yTXNnIGRpcmVjdGx5IHdpbGwKCSAgICBuZWVkIGFkanVzdGluZyAtIHlvdSBjYW4gZWFzaWx5IGZpeCB0aGVtIHRvIHdvcmsgd2l0aCBib3RoIG9sZAoJICAgIGFuZCBuZXcgU1dJRyBieSBjaGFuZ2luZyB0byB1c2UgU1dJR19FcnJvck1zZyBhbmQgYWRkaW5nOgoKCQkjaWZuZGVmIFNXSUdfRXJyb3JNc2cKCQkjZGVmaW5lIFNXSUdfRXJyb3JNc2coKSBFcnJvck1zZygpCgkJI2VuZGlmCgowOC8yOS8yMDA2OiBvbGx5CgkgICAgW3BocF0gTW92ZSBjb25zdGFudCBpbml0aWFsaXNhdGlvbiBmcm9tIFJJTklUIHRvIE1JTklUIHRvIGZpeCBhCgkgICAgd2FybmluZyB3aGVuIHVzaW5nIEFwYWNoZSBhbmQgbW9kX3BocC4gIFdlIG9ubHkgbmVlZCB0byBjcmVhdGUKCSAgICBQSFAgY29uc3RhbnRzIG9uY2Ugd2hlbiB3ZSdyZSBmaXJzdCBpbml0aWFsaXNlZCwgbm90IGZvciBldmVyeSBIVFRQCgkgICAgcmVxdWVzdC4KCjA4LzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgQnVnZml4ICMxNTQyNDY2IGFkZGVkIGNvZGUgdG8gYWxsb3cgbWFwcGluZyBMdWEgbmlsJ3MgPC0+IEMvQysrIE5VTEwncwoJICAgIHVwZGF0ZWQgdmFyaW91cyB0eXBlbWFwcyB0byB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBjaGFuZ2VzCgkgICAgYWRkZWQgdm9pZHRlc3RfcnVubWUubHVhIHRvIHNob3cgdGhlIGZlYXR1cmVzIHdvcmtpbmcKCjA4LzE5LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtHdWlsZV0gQWRkIGZlYXR1cmU6Y29uc3Rhc3ZhciB0byBleHBvcnQgY29uc3RhbnRzIGFzIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGZ1bmN0aW9ucwogICAgICAgICAgICB0aGF0IHJldHVybiB0aGUgY29uc3RhbnQgdmFsdWUuCgowOC8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRGV0YWNoQ3VycmVudFRocmVhZCBjYWxscyBoYXZlIGJlZW4gYWRkZWQgc28gdGhhdCBuYXRpdmVseSBjcmVhdGVkIHRocmVhZHMKICAgICAgICAgICAgbm8gbG9uZ2VyIHByZXZlbnQgdGhlIEpWTSBmcm9tIGV4aXRpbmcuIEJ1ZyByZXBvcnRlZCBieSBUaG9tYXMgRHVkemlhayBhbmQKICAgICAgICAgICAgUGF1bCBOb2xsLgoKMDgvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZGlyZWN0b3IgcHJvdGVjdGVkIG1ldGhvZHMgc28gdGhleSB3b3JrCgowNy8yNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgbW9yZSBhZGRpdGlvbnMgdG8gc3RkOjpzdHJpbmcsIHNvbWUgdHdlYWtzIGFuZCBzbWFsbCBidWcgZml4ZXMKCSAgICAtbm9jd3JhcCBtb2RlLgoKMDcvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICBCdWdmaXggIzE1MjYwMjIgcGRhdGVkIHN0ZDo6c3RyaW5nIHRvIHN1cHBvcnQgc3RyaW5ncyB3aXRoICdcMCcgaW5zaWRlIHRoZW0KCSAgICB1cGRhdGVkIHR5cGVtYXBzLmkgdG8gYWRkIHN1cHBvcnQgZm9yIHBvaW50ZXIgdG8gcG9pbnRlcnMKCjA3LzE5LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICAtIEFkZCBzdGRfc3RyaW5nLmkgc3VwcG9ydC4KCSAgICAtIEFkZCBuZXdvYmplY3QgcGF0Y2ggc3VibWl0dGVkIGJ5IG1rb2VwcGUgKHRoYW5rcyEpCgkgICAgLSBGaXggdHlwZSBuYW1lIG1pc21hdGNoIGlzc3VlIGZvciBuZXN0ZWQgdHlwZSBkZWZpbml0aW9ucy4KCSAgICAgIHNwZWNpZmljYWxseSB0eXBlZGVmcyBpbiB0ZW1wbGF0ZWQgY2xhc3MgZGVmbnMuCgowNy8xOC8yMDA2OiBtZ29zc2FnZQoJICAgIEJ1Z2ZpeCAjMTUyMjg1OAoJICAgIHVwZGF0ZWQgbHVhLmN4eCB0byBzdXBwb3J0IC1leHRlcm5hbC1ydW50aW1lIGNvbW1hbmQKCjA3LzE0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIEluY3JlbWVudCB0aGUgU1dJR19SVU5USU1FX1ZFUlNJT04gdG8gMywgYmVjYXVzZSBvZiB0aGUKCSAgICBhZGRpdGlvbiBvZiB0aGUgb3duZGF0YSBtZW1iZXIgaW4gc3dpZ190eXBlX2luZm8uCgkgICAgUmVwb3J0ZWQgYnk6IFByYWJodSBSYW1hY2hhbmRyYW4KCjA3LzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFNlYXJjaCBwYXRoIGZpeGVzOgogICAgICAgICAgICAtIEZpeCBzZWFyY2ggcGF0aCBmb3IgbGlicmFyeSBmaWxlcyB0byBiZWhhdmUgYXMgZG9jdW1lbnRlZCBpbiBMaWJyYXJ5Lmh0bWwuCiAgICAgICAgICAgIC0gRml4IG1pbmd3L21zeXMgYnVpbGRzIHdoaWNoIGRpZCBub3QgZmluZCB0aGUgU1dJRyBsaWJyYXJ5IHdoZW4gaW5zdGFsbGVkLgogICAgICAgICAgICAtIFdpbmRvd3MgYnVpbGRzIGFsc28gb3V0cHV0IHRoZSBtaW5ndy9tc3lzIGluc3RhbGwgbG9jYXRpb24gd2hlbiBydW5uaW5nCiAgICAgICAgICAgICAgc3dpZyAtc3dpZ2xpYi4KICAgICAgICAgICAgLSBUaGUgbm9uLWV4aXN0ZW50IGFuZCB1bmRvY3VtZW50ZWQgY29uZmlnIGRpcmVjdG9yeSBpbiB0aGUgc2VhcmNoIHBhdGggaGFzCiAgICAgICAgICAgICAgYmVlbiByZW1vdmVkLgoKMDcvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICRzeW1uYW1lIHNwZWNpYWwgdmFyaWFibGUgZXhwYW5zaW9uLgoKMDcvMDQvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgQWRkICVmZWF0dXJlKCJjb25zdGFzdmFyIiksIHdoaWNoIGluc3RlYWQgb2YgZXhwb3J0aW5nIGEgY29uc3RhbnQgYXMgYQoJICAgIHNjaGVtZSBmdW5jdGlvbiwgZXhwb3J0cyB0aGUgY29uc3RhbnQgYXMgYSBzY2hlbWUgdmFyaWFibGUuICBVcGRhdGUgdGhlCgkgICAgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsLgoKMDcvMDQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1NlZSBlbnRyeSBvZiAwOS8xMy8yMDA2IC0gZXhwbGljaXRjYWxsIGZlYXR1cmUgYW5kIGRvY3VtZW50YXRpb24gdG8gaXQgcmVtb3ZlZF0KICAgICAgICAgICAgTmV3IGV4cGxpY2l0Y2FsbCBmZWF0dXJlIHdoaWNoIGdlbmVyYXRlcyBhZGRpdGlvbmFsIHdyYXBwZXJzIGZvciB2aXJ0dWFsIG1ldGhvZHMKICAgICAgICAgICAgdGhhdCBjYWxsIHRoZSBtZXRob2QgZXhwbGljaXRseSwgbm90IHJlbHlpbmcgb24gcG9seW1vcnBoaXNtIHRvIG1ha2UgdGhlIG1ldGhvZAogICAgICAgICAgICBjYWxsLiBUaGUgZmVhdHVyZSBpcyBhIGZlYXR1cmUgZmxhZyBhbmQgaXMgZW5hYmxlZCBsaWtlIGFueSBvdGhlciBmZWF0dXJlIGZsYWcuCiAgICAgICAgICAgIEl0IGFsc28gcmVjb2duaXNlcyBhbiBhdHRyaWJ1dGUsICJzdWZmaXgiIGZvciBtYW5nbGluZyB0aGUgZmVhdHVyZSBuYW1lLCBzZWUKICAgICAgICAgICAgU1dJR1BsdXMuaHRtbCNTV0lHUGx1c19leHBsaWNpdGNhbGwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBUaGUgZXhwbGljaXRjYWxsIGZlYXR1cmUgaXMgYWxzbyBhIHdvcmthcm91bmQgZm9yIHNvbHZpbmcgdGhlIHJlY3Vyc2l2ZSBjYWxscwogICAgICAgICAgICBwcm9ibGVtIHdoZW4gYSBkaXJlY3RvciBtZXRob2QgbWFrZXMgYSBjYWxsIHRvIGEgYmFzZSBjbGFzcyBtZXRob2QuIFNlZQogICAgICAgICAgICBKYXZhLmh0bWwjamF2YV9kaXJlY3RvcnNfZXhwbGljaXRjYWxsIGZvciB1cGRhdGVkIGRvY3VtZW50YXRpb24uCgowNi8yOC8yMDA2OiBqb2UgKEpvc2VwaCBXYW5nKQoJICAgIFtyXSBJbml0aWFsIHN1cHBvcnQgZm9yIFIKCjA2LzIwLzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQogICAgICAgICAgICBNaW5vciBmaXhlcyB0byBnZXQgYXBwbHlfc3RyaW5ncy5pIHRlc3RzdWl0ZSB0byBwYXNzCgkgICAgUmVtb3ZlIGludGVnZXJzX3J1bm1lLnNjbSBmcm9tIHRoZSB0ZXN0c3VpdGUsIGJlY2F1c2UgU1dJRyBhbmQgQ2hpY2tlbiBkb2VzCiAgICAgICAgICAgIGhhbmRsZSBvdmVyZmxvd3MuCgowNi8xOS8yMDA1OiBvbGx5CgkgICAgW3BocF0gQWRkIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgUEhQNSBjbGFzcyB3cmFwcGVycyBmb3IgQysrCgkgICAgY2xhc3NlcyAodXNlICJzd2lnIC1waHA1IikuCgowNi8xNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gQWRkZWQgc29tZSBtaXNzaW5nIGtleXdvcmRzIHRvIHRoZSBQSFA0IGtleXdvcmQgbGlzdCwgYW5kCgkgICAgZml4ZWQgX19MSU5FX18gYW5kIF9fRklMRV9fIHdoaWNoIHdlcmUgaW4gdGhlIHdyb25nIGNhdGVnb3J5LgoJICAgIEFsc28gYWRkZWQgYWxsIHRoZSBrZXl3b3JkcyBuZXcgaW4gUEhQNSwgYW5kIGFkZGVkIGNvbW1lbnRzCgkgICAgbm90aW5nIHRoZSBQSFA0IGtleXdvcmRzIHdoaWNoIGFyZW4ndCBrZXl3b3JkcyBpbiBQSFA1LgoKMDYvMTcvMjAwNjogb2xseQoJICAgIFtwaHBdIERvbid0IHNlZ2ZhdWx0IGlmIFBIUCBOdWxsIGlzIHBhc3NlZCBhcyB0aGlzIHBvaW50ZXIgKGUuZy4KCSAgICBDbGFzc19tZXRob2QoTnVsbCkpIC0gZ2l2ZSBhIFBIUCBFcnJvciBpbnN0ZWFkLgoKMDYvMTUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIHN0ZDo6bGlzdCBjb250YWluZXIgY2xhc3MuCgkgICAgRml4IGEgZmV3IGJ1Z3MgaW4gaGVscGVyIGZ1bmN0aW9ucy4KCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZXBsYWNlIEpOSUVYUE9SVCB3aXRoIFNXSUdFWFBPUlQsIHRoZXJlYnkgZW5hYmxpbmcgdGhlIHBvc3NpYmlsaXR5CiAgICAgICAgICAgIG9mIHVzaW5nIGdjYyAtZnZpc2liaWxpdHk9aGlkZGVuIGZvciBwb3RlbnRpYWxseSBzbWFsbGVyIGZhc3RlciBsb2FkaW5nIHdyYXBwZXJzLgoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBNYWtlZmlsZXMgZm9yIGF1dG9jb25mLTIuNjAgYmV0YQoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgVmxhZGltaXIgTWVuc2hha292IHBhdGNoIGZvciBjb21waWxpbmcgd3JhcHBlcnMgd2l0aCBweXRob24tMi41IGFscGhhLgoKMDUvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZmZlciBvdmVyZmxvdyBlcnJvciB3aGVuIHVzaW5nIGxhcmdlICVmZWF0dXJlKGRvY3N0cmluZykgcmVwb3J0ZWQKICAgICAgICAgICAgYnkgSm9zZXBoIFdpbnN0b24uCgowNS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gT3BlcmF0b3Igb3ZlcmxvYWQgZml4IGZyb20gRGFuaWVsIE1vb3JlLgoKMDUvMjUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBidWcgaW4gZ2VuZXJhdGlvbiBvZiBDTE9TIHR5cGUgZGVjbGFyYXRpb25zIGZvciB1bmlvbnMKCSAgICBhbmQgZXF1aXZhbGVudCB0eXBlcy4KCjA1LzI0LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBEb24ndCByZXF1aXJlIGEgZnVsbCBjbGFzcyBkZWZpbml0aW9uIHRvIGdlbmVyYXRlIGEgQ0xPUyB3cmFwcGVyLgoKMDUvMjAvMjAwNjogb2xseQoJICAgIFtwaHBdIEdDQyBWaXNpYmlsaXR5IHN1cHBvcnQgbm93IHdvcmtzIHdpdGggUEhQLgoKMDUvMTkvMjAwNjogb2xseQoJICAgIFtwaHBdIFJlbW92ZWQgc3VwcG9ydCBmb3IgLWRsbmFtZSAodXNlIC1tb2R1bGUgaW5zdGVhZCkuICBGaXhlZAoJICAgIG5hbWluZyBvZiBQSFAgZXh0ZW5zaW9uIG1vZHVsZSB0byBiZSBjb25zaXN0ZW50IHdpdGggUEhQCgkgICAgY29udmVudGlvbnMgKG5vICJwaHBfIiBwcmVmaXggb24gVW5peDsgb24gUEhQID49IDQuMy4wLCBoYW5kbGUgVW5peAoJICAgIHBsYXRmb3JtcyB3aGljaCB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gIi5zbyIgYXMgdGhlIGV4dGVuc2lvbi4pCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIERpcmVjdG9yIHN1cHBvcnQgYWRkZWQKCjA1LzA3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBEb24ndCBzZWdmYXVsdCBpZiBQSFAgTnVsbCBpcyBwYXNzZWQgd2hlcmUgYSBDKysgcmVmZXJlbmNlCgkgICAgaXMgd2FudGVkLgoKMDUvMDUvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCB3cmFwcGVycyBnZW5lcmF0ZWQgZm9yIGdsb2JhbCAnY2hhcicgdmFyaWFibGVzIHRvIG5vdAoJICAgIGluY2x1ZGUgYSB0ZXJtaW5hdGluZyB6ZXJvIGJ5dGUgaW4gdGhlIFBIUCBzdHJpbmcuCgowNS8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZnkgdHlwZW1hcHMgc28gdGhhdCBjaGFyICogY2FuIGJlIGFwcGxpZWQgdG8gdW5zaWduZWQgY2hhciAqIG9yIHNpZ25lZCBjaGFyICoKICAgICAgICAgICAgdHlwZXMgYW5kIHZpc2EgdmVyc2EuCgowNS8wMy8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV1UaGFua3MgdG8gTHVrZSBKIENyb29rIGZvciB0aGlzIGlkZWEuCiAgICAgICAgICAgICAtIGEgc3RydWN0L2VudW0vdW5pb24gaXMgcmVwbGFjZWQgd2l0aCA6cG9pbnRlciBvbmx5IGlmCiAgICAgICAgICAgICAgIHRoYXQgc2xvdCBpcyBhY3R1YWxseSBhIHBvaW50ZXIgdG8gdGhhdCB0eXBlLiBTbyw6IAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhX3N0cnVjdCB7IGludCB4OyB9IGFuZAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiX3N0cnVjdCB7IGFfc3RydWN0IHN0cnVjdF8xOyB9OyAKICAgICAgICAgICAgICAgd2lsbCBiZSBjb252ZXJ0ZWQgYXM6CiAgICAgICAgICAgICAgICAgICAoY2ZmaTpkZWZjc3RydWN0IGJfc3RydWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3RfMSBhX3N0cnVjdCkpCiAgICAgICAgICAgICAtIE90aGVyIG1pbm9yIGZpeGVzIGluIGxpc3BpZnlpbmcgbmFtZXMuCgowNS8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcG9zc2libGUgcmVkZWZpbml0aW9uIG9mIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSBmb3IgVkMrKy4KCjA0LzE0LzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXQogICAgICAgICAgICBUaGFua3MgdG8gVGhvbWFzIFdlaWRuZXIgZm9yIHRoZSBwYXRjaC4KICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgZXhwb3J0IGlzIHNldCAoZXhwb3J0ICdmb28pIGlzIAogICAgICAgICAgICAgIGdlbmVyYXRlZCBmb3IgZXZlcnkgc3ltYm9sCiAgICAgICAgICAgIC0gd2hlbiBmZWF0dXJlIGlubGluZSBpcyBzZXQgKGRlY2xhaW0gKGlubGluZSBmb28pKSBpcyAKICAgICAgICAgICAgICBnZW5lcmF0ZWQgYmVmb3JlIGV2ZXJ5IGZ1bmN0aW9uIGRlZmluaXRpb24KICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgaW50ZXJuX2Z1bmN0aW9uIGlzIHNldCAKICAgICAgICAgICAgICAjLih2YWx1ZS1vZi1pbnRlcm4tZnVuY3Rpb24gIm5hbWUiICJub2RlVHlwZSIgcGFja2FnZSkKICAgICAgICAgICAgICBpcyBlbWl0dGVkIGluc3RlYWQgb2YgdGhlIHBsYWluIHN5bWJvbC4gQSBzYW1wbGUgc3dpZy1saXNwaWZ5IAogICAgICAgICAgICAgIGlzIHByb3ZpZGVkLgogICAgICAgICAgICAtIGV2ZXJ5IHN5bWJvbCBpcyBwcmVmaXhlZCBieSBpdCdzIHBhY2thZ2UuCgowNC8xMy8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV0KCSAgICBGaXhlZCB0aGUgZ2VuZXJhdGlvbiBvZiB3cmFwcGVycyBmb3IgZ2xvYmFsIHZhcmlhYmxlcy4gCiAgICAgICAgICAgIEFkZGVkIHRoZSBvcHRpb24gW25vXXN3aWctbGlzcCB3aGljaCB0dXJucyBvbi9vZmYgZ2VuZXJhdGlvbiAKICAgICAgICAgICAgb2YgY29kZSBmb3Igc3dpZyBoZWxwZXIgbGlzcCBtYWNybywgZnVuY3Rpb25zLCBldGMuCgpWZXJzaW9uIDEuMy4yOSAoTWFyY2ggMjEsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA0LzA1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggb3V0cHV0IHR5cGVtYXAgb2YgY2hhciBzbyBpdCBwcm9kdWNlcyBhIGNoYXJhY3RlciBpbnN0ZWFkCgkgICAgb2YgYW4gaW50ZWdlci4gQWxzbyBhZGRzIGlucHV0L291dHB1dCB0eXBlbWFwcyBmb3IgJ2NoYXIgKicuCgoJICAgIGFkZCBjb21tYW5kLWxpbmUgYXJndW1lbnQgLWlzb2xhdGUgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlCgkgICAgZmlsZSB0aGF0IHdvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIFNXSUcgZ2VuZXJhdGVkIGZpbGVzIHRoYXQKCSAgICBtYXkgYmUgdXNlZCBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbi4KCjAzLzIwLzIwMDU6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBNb3JlIHR3ZWFrcyB0byBJTlBVVC9PVVRQVVQgdHlwZW1hcHMgZm9yIGJvb2wuCgoJICAgIEZpeCBjb25zdGFudFdyYXBwZXIgZm9yIGNoYXIgYW5kIHN0cmluZyBsaXRlcmFscy4KCgkgICAgZmluZC1kZWZpbml0aW9uIGtleWJpbmRpbmdzIHNob3VsZCB3b3JrIGluIEVMSS9TTElNRS4KCSAgICBPdXRwdXQgKGluLXBhY2thZ2UgPG1vZHVsZS1uYW1lPikgdG8gbGlzcCB3cmFwcGVyCgkgICAgaW5zdGVhZCBvZiAoaW4tcGFja2FnZSAjLipzd2lnLW1vZHVsZS1uYW1lKikuCgoJICAgIHNsaWdodCByZXdvcmsgb2YgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcy4KCgkgICAgZG9jIHVwZGF0ZXMuCgowMy8xNy8yMDA1OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgbWFuZ2xlIG5hbWVzIG9mIGNvbnN0YW50cyBnZW5lcmF0ZWQgdmlhIGNvbnN0YW50V3JhcHBlci4KCSAgICAKCSAgICBXaGVuIHVzaW5nIE9VVFBVVCB0eXBlbWFwcyBhbmQgdGhlIGZ1bmN0aW9uIGhhcyBhIG5vbi12b2lkCgkgICAgcmV0dXJuIHZhbHVlLCBpdCBzaG91bGQgYmUgZmlyc3QgaW4gdGhlIHZhbHVlcy1saXN0LCBmb2xsb3dlZAoJICAgIGJ5IHRoZSBPVVRQVVQgbWFwcGVkIHZhbHVlcy4KCgkgICAgRml4IGJ1ZyB3aXRoIGJvb2xlYW4gcGFyYW1ldGVycywgd2hpY2ggbmVlZGVkIHRvIGJlCgkgICAgcGFzc2VkIGluIGFzIGludCB2YWx1ZXMsIHJhdGhlciB0aGFuIFQgb3IgTklMLgoKMDMvMTUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEdlbmVyYXRlIHdyYXBwZXJzIGZvciBjb25zdGFudHMgd2hlbiBpbiBDKysgb3IgLWN3cmFwIG1vZGUuCgkgICAgTWFrZSAtY3dyYXAgdGhlIGRlZmF1bHQsIHNpbmNlIGl0IGlzIG1vc3QgY29ycmVjdC4gVXNlcnMKCSAgICBjYW4gdXNlIHRoZSAtbm9jd3JhcCBvcHRpb24gdG8gYXZvaWQgdGhlIGNyZWF0aW9uIG9mIGEgLmN4eAoJICAgIGZpbGUgd2hlbiBpbnRlcmZhY2luZyB0byBDIGNvZGUuCgoJICAgIFdoZW4gaW4gLW5vY3dyYXAgbW9kZSwgaW1wcm92ZSB0aGUgaGFuZGxpbmcgb2YgY29udmVydGluZwogCSAgICBpbmZpeCBsaXRlcmFscyB0byBwcmVmaXggbm90YXRpb24gZm9yIGxpc3AuIFRoaXMgaXMgdmVyeQoJICAgIGJhc2ljIGFuZCBub3QgbGlrZWx5IHRvIGJlIGltcHJvdmVkIHVwb24gc2luY2UgdGhpcyBvbmx5CgkgICAgYXBwbGllcyB0byB0aGUgLW5vY3dyYXAgY2FzZS4gTGl0ZXJhbHMgd2UgY2FuJ3QgZmlndXJlIG91dAoJICAgIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZyBhbmQgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZAoJICAgIGNvZGUuCgoJICAgIHZhbGlkSWRlbnRpZmllciBub3cgbW9yZSBjbG9zZWx5IGFwcHJveGltYXRlcyB3aGF0IG1heSBiZQoJICAgIGEgbGVnYWwgY29tbW9uIGxpc3Agc3ltYm9sLgoKCSAgICBGaXggdHlwZW1hcCBlcnJvciBpbiBhbGxlZ3JvY2wuc3dnCgkgICAgCjAzLzEyLzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBmaXggdXAgSU5QVVQvT1VUUFVUIHR5cGVtYXBzIGZvciBib29sLgoJICAgIEdlbmVyYXRlIGMrKyBzdHlsZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3Igc3RydWN0L3VuaW9uIG1lbWJlcnMKCSAgICB3aGVuIC1jd3JhcCBvcHRpb24gc3BlY2lmaWVkLgoKMDMvMTAvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBidWcgaW4gQyB3cmFwcGVyIGdlbmVyYXRpb24gaW50cm9kdWNlZCBieSBsYXN0IGFsbGVncm9jbAoJICAgIGNvbW1pdC4KCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBDb21taXQgIzE0NDczMzcgLSBEZWxldGUgTG9jYWxSZWZzIGF0IHRoZSBlbmQgb2YgZGlyZWN0b3IgbWV0aG9kcyB0byBmaXggcG90ZW50aWFsIGxlYWsKCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTQ0NDk0OSAtIGNvbmZpZ3VyZSBkb2VzIG5vdCBob25vciAtLXByb2dyYW0tcHJlZml4LgogICAgICAgICAgICBSZW1vdmVkIG5vbi1zdGFuZGFyZCBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1yZWxlYXNlLXN1ZmZpeC4gRml4IHRoZSBhdXRvY29uZiBzdGFuZGFyZAogICAgICAgICAgICBvcHRpb25zIC0tcHJvZ3JhbS1wcmVmaXggYW5kIC0tcHJvZ3JhbS1zdWZmaXggd2hpY2ggd2VyZSBiZWluZyBzaG93biBpbiB0aGUgaGVscCwKICAgICAgICAgICAgYnV0IHdlcmUgYmVpbmcgaWdub3JlZC4gVXNlIC0tcHJvZ3JhbS1zdWZmaXggaW5zdGVhZCBvZiAtLXdpdGgtcmVsZWFzZS1zdWZmaXggbm93LgoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIEZpeCAjMTQ0NjMxOSB3aXRoIHBhdGNoIGZyb20gYW5kcmVhc3RoIC0gbW9yZSB0aGFuIG9uZSB3c3RyaW5nIHBhcmFtZXRlciBpbiBkaXJlY3RvciBtZXRob2RzCgowMy8wNy8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlXSAKCSAgICBGaXggZm9yIG1vZHVsZSBuYW1lcyBjb250YWluaW5nIGEgIi0iIGluIG5vbi0ic2hhZG93IiBtb2RlLgoJICAgIFBhdGNoIGZyb20gQWFyb24gVmFuRGV2ZW5kZXIgKCMxNDQxNDc0KS4KCjAzLzA0LzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIC1PIHRvIHRoZSBtYWluIHByb2dyYW0sIHdoaWNoIG5vdyBlbmFibGVzIC1mYXN0ZGlzcGF0Y2gKCSAgICAKCSAgICBbUHl0aG9uXQoKCSAgICAtIEFkZCB0aGUgLWZhc3Rpbml0IG9wdGlvbiB0byBlbmFibGUgZmFzdGVyIF9faW5pdF9fCiAgICAgICAgICAgICAgbWV0aG9kcy4gU2V0dGluZyAndGhpcycgYXMgJ3NlbGYudGhpcy5hcHBlbmQodGhpcyknIGluIHRoZSBweXRob24KCSAgICAgIGNvZGUgY29uZnVzZXMgUHlMdWNlbmUuIE5vdyB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB0aGUKCSAgICAgIHRoZSBDKysgc2lkZSwgYXMgcmVwb3J0ZWQgYnkgQW5kaSBhbmQgUm9iaW4uCgoJICAgIC0gQWRkIHRoZSAtZmFzdHF1ZXJ5IG9wdGlvbiB0byBlbmFibGUgZmFzdGVyIFNXSUdfVHlwZVF1ZXJ5IHZpYSBhCiAgICAgICAgICAgICAgcHl0aG9uIGRpY3QgY2FjaGUsIGFzIHByb3Bvc2VkIGJ5IEFuZGkgVmFqZGEKCgkgICAgLSBBdm9pZCB0byBjYWxsIFB5T2JqZWN0X0dldEF0dHIgaW5zaWRlIFNXSUdfUHl0aG9uX0dldFN3aWdUaGlzLAoJICAgICAgc2luY2UgdGhpcyBjb25mdXNlcyBQeUx1Y2VuZSwgYXMgcmVwb3J0ZWQgYnkgQW5kaSBWYWpkYS4KCSAgICAKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIFJlbW92ZWQgZXh0cmEgKHZvaWQgKikgY2FzdCB3aGVuIGNhc3RpbmcgcG9pbnRlcnMgdG8gYW5kIGZyb20gamxvbmcgYXMgdGhpcwogICAgICAgICAgICB3YXMgc3VwcHJlc3NpbmcgZ2NjJ3MgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIKICAgICAgICAgICAgd2FybmluZy4gVGhpcyB3YXJuaW5nIGNvdWxkIGJlIGlnbm9yZWQgaW4gdmVyc2lvbnMgb2YgZ2NjIHByaW9yIHRvIDQuMCwgYnV0IG5vdyB0aGUKICAgICAgICAgICAgd2FybmluZyBpcyB1c2VmdWwgYXMgZ2NjIC1PMiBhbmQgaGlnaGVyIG9wdGltaXNhdGlvbiBsZXZlbHMgaW5jbHVkZXMgLWZzdHJpY3QtYWxpYXNpbmcgd2hpY2gKICAgICAgICAgICAgZ2VuZXJhdGVzIGNvZGUgdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGVzZSBjYXN0cy4gVGhlIGFzc2lnbm1lbnQgaXMgc2ltcGx5IG5ldmVyIG1hZGUuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgLWZuby1zdHJpY3QtYWxpYXNpbmcgdG8gYm90aCBzdXBwcmVzcyB0aGUgd2FybmluZyBhbmQgZml4IHRoZSBiYWQgYXNzZW1ibHkKICAgICAgICAgICAgY29kZSBnZW5lcmF0ZWQuIE5vdGUgdGhhdCB0aGUgd2FybmluZyBpcyBvbmx5IGdlbmVyYXRlZCBieSB0aGUgQyBjb21waWxlciwgYnV0IG5vdAogICAgICAgICAgICB0aGUgQysrIGNvbXBpbGVyLCB5ZXQgdGhlIEMrKyBjb21waWxlciB3aWxsIGFsc28gZ2VuZXJhdGUgYnJva2VuIGNvZGUuIEFsdGVybmF0aXZlbHkgdXNlIAogICAgICAgICAgICAtV25vLXN0cmljdC1hbGlhc2luZyB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBmb3IgZ2NjLTMueC4gVGhlIHR5cGVtYXBzIGFmZmVjdGVkCiAgICAgICAgICAgIGFyZSB0aGUgImluIiBhbmQgIm91dCIgdHlwZW1hcHMgaW4gamF2YS5zd2cgYW5kIGFycmF5c19qYXZhLnN3Zy4gVXNlcnMgb3VnaHQgdG8gZml4CiAgICAgICAgICAgIHRoZWlyIG93biB0eXBlbWFwcyB0byBkbyB0aGUgc2FtZS4gTm90ZSB0aGF0IHJlbW92YWwgb2YgdGhlIHZvaWQgKiBjYXN0IHNpbXBseSBwcmV2ZW50cwogICAgICAgICAgICBzdXBwcmVzc2lvbiBvZiB0aGUgd2FybmluZyBmb3IgdGhlIEMgY29tcGlsZXIgYW5kIG5vdGhpbmcgZWxzZS4gVHlwaWNhbCBjaGFuZ2U6CgogICAgICAgICAgICBGcm9tOgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqICV7ICQxID0gKigkJjFfbHR5cGUpKHZvaWQgKikmJGlucHV0OyAlfQogICAgICAgICAgICBUbzoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAleyAkMSA9ICooJCYxX2x0eXBlKSYkaW5wdXQ7ICV9CgogICAgICAgICAgICBGcm9tOgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgU1dJR1RZUEUgKiAleyAqKCQmMV9sdHlwZSkodm9pZCAqKSYkcmVzdWx0ID0gJDE7ICV9IAogICAgICAgICAgICBUbzoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIFNXSUdUWVBFICogJXsgKigkJjFfbHR5cGUpJiRyZXN1bHQgPSAkMTsgJX0gCgowMy8wMi8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dCgkgICAgQWRkIHR5cGVtYXBzIGZvciAibG9uZyBsb25nIjsgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMsIGhvd2V2ZXIsIGRlcGVuZHMKCSAgICBvbiB0aGUgdmVyc2lvbiBhbmQgY29uZmlndXJhdGlvbiBvZiBHdWlsZS4KCjAzLzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGlubmVyIGV4Y2VwdGlvbnMuIElmIGFueSBvZiB0aGUgZGVsZWdhdGVzIGFyZSBjYWxsZWQgd2hpY2ggY29uc3RydWN0CiAgICAgICAgICAgIGEgcGVuZGluZyBleGNlcHRpb24gYW5kIHRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nIGV4Y2VwdGlvbiwgaXQgd2lsbCBjcmVhdGUgdGhlIG5ldwogICAgICAgICAgICBleGNlcHRpb24gd2l0aCB0aGUgcGVuZGluZyBleGNlcHRpb24gYXMgYW4gaW5uZXIgZXhjZXB0aW9uLgoKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0KICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgUGhwNSBleGNlcHRpb25zIGlmIGNvbXBpbGluZyBhZ2FpbnN0IFBocDUgKHBhdGNoIGZyb20gT2xseSBCZXR0cykuCgowMy8wMS8yMDA2OiBtbWF0dXMKCSAgICBVc2UgdGhlIEdDQyB2aXNpYmlsaXR5IGF0dHJpYnV0ZSBpbiBTV0lHRVhQT1JULgoKCSAgICBOb3cgeW91IGNhbiBjb21waWxlICh3aXRoIGdjYyAzLjQgb3IgbGF0ZXIpIHVzaW5nCgkgICAgQ0ZMQUdTPSItZnZpc2liaWxpdHk9aGlkZGVuIi4KCSAgICAKCSAgICBDaGVjayB0aGUgZGlmZmVyZW5jZSBmb3IgdGhlICdzdGRfY29udGFpbmVycy5pJyBweXRob24gCgkgICAgdGVzdCBjYXNlOgogCiAgICAgICAgICAgIFNpemVzOgoKCSAgICAgIDMzMDU0MzIgX3N0ZF9jb250YWluZXJzLnNvCgkgICAgICAyMzgzOTkyIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4KCgkgICAgRXhwb3J0ZWQgc3ltYm9scyAobm0gLUQgPGZpbGU+LnNvIHwgd2MgLWwpOgoKICAgICAgICAgICAgICA2MTQ2IF9zdGRfY29udGFpbmVycy5zbyAKICAgICAgICAgICAgICAxNzQgIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4gCgoJICAgIEV4ZWN1dGlvbiB0aW1lczoKCgkgICAgICByZWFsIDBtMC4wNTBzIHVzZXIgMG0wLjAzOXMgc3lzIDBtMC4wMDVzICAgX3N0ZF9jb250YWluZXJzLnNvCiAgICAgICAgICAgICAgcmVhbCAwbTAuMDM5cyB1c2VyIDBtMC4wMjZzIHN5cyAwbTAuMDA3cyAgIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4KCgkgICAgUmVhZCBodHRwOi8vZ2NjLmdudS5vcmcvd2lraS9WaXNpYmlsaXR5IGZvciBtb3JlIGRldGFpbHMuCgoKMDIvMjcvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEFkZCBzdXBwb3J0IGZvciBJTlBVVCwgT1VUUFVULCBhbmQgSU5PVVQgdHlwZW1hcHMuCgkgICAgRm9yIE9VVFBVVCB2YXJpYWJsZXMsIHRoZSBsaXNwIHdyYXBwZXIgcmV0dXJucyBtdWx0aXBsZQoJICAgIHZhbHVlcy4KCjAyLzI2LzIwMDY6IG1tYXR1cwoKCSAgICBbUnVieV0gYWRkIGFyZ2Nhcmd2LmkgbGlicmFyeSBmaWxlLgoJICAgIAoJICAgIFVzZSBpdCBhcyBmb2xsb3c6CgoJCSVpbmNsdWRlIGFyZ2Nhcmd2LmkKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWFwcGx5IChpbnQgQVJHQywgY2hhciAqKkFSR1YpIHsgKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgfSAKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWlubGluZSB7CQkJCQogICAJICAgICAgICAgIGludCBtYWluQXBwKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgCQogICAJICAgICAgICAgIHsJCQkJCQkKICAgCSAgICAgICAgICAgIHJldHVybiBhcmdjOwkJCQkJCiAgIAkgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQkJCQkJCQkKCSAgICAgIAkJCQkJCQkKICAgCSAgICB0aGVuIGluIHRoZSBydWJ5IHNpZGU6CQkJCQkKCSAgICAgIAkJCQkJCQkJCiAgIAkgICAgICAgIGFyZ3MgPSBbImFzZGYiLCAiYXNkZjIiXQkJCQkKICAgCSAgICAgICAgbiA9IG1haW5BcHAoYXJncyk7CgkKCgkgICAgVGhpcyBpcyB0aGUgc2ltaWxhciB0byB0aGUgcHl0aG9uIHZlcnNpb24gTGliL3B5dGhvbi9hcmdjYXJndi5pCgowMi8yNC8yMDA2OiBtZ29zc2FnZQoKCSAgICBTbWFsbCB1cGRhdGUgTHVhIGRvY3VtZW50cyBvbiB0cm91Ymxlc2hvb3RpbmcgcHJvYmxlbXMKCSAgICAKMDIvMjIvMjAwNjogbW1hdHVzIAoKCSAgICBGaXggYWxsIHRoZSBlcnJvcnMgcmVwb3J0ZWQgZm9yIDEuMy4yOC4KCSAgICAtIGZpeCBidWcgIzExNTgxNzgKCSAgICAtIGZpeCBidWcgIzEwNjA3ODkKCSAgICAtIGZpeCBidWcgIzEyNjM0NTcKCSAgICAtIGZpeCAnY29uc3QgIGNoYXIqJicgdHlwZW1hcCBpbiB0aGUgVVRMLCByZXBvcnRlZCBieSBHZW9mZiBIdXRjaGlzb24KCSAgICAtIGZpeGVzIGZvciBweXRob24gMi4xIGFuZCB0aGUgcnVudGltZSBsaWJyYXJ5CgkgICAgLSBmaXggY29weWN0b3IgKyB0ZW1wbGF0ZSBidWcgIzE0MzIxMjUKCSAgICAtIGZpeCBbIDE0MzIxNTIgXSAlcmVuYW1lIGZyaWVuZCBvcGVyYXRvcnMgaW4gbmFtZXNwYWNlCgkgICAgLSBmaXggZ2NjIHdhcm5pbmcgcmVwb3J0ZWQgYnkgUi4gQmVybnN0ZWluCgkgICAgLSBhdm9pZCBhc3NlcnQgd2hlbiBmaW5kaW5nIGEgcmVjdXJzaXZlIHNjb3BlIGluaGVyaXRhbmNlLAoJICAgICAgZW1pdCBhIHdhcm5pbmcgaW4gdGhlIHdvcnN0IGNhc2UsIHJlcG9ydGVkIGJ5IE5pdHJvIAoJICAgIC0gZml4IHByZW1hdHVyZSBvYmplY3QgZGVsZXRpb24gcmVwb3J0ZWQgYnkgUGF1bCBpbiB0Y2wzZAoJICAgIC0gZml4IHdhcm5pbmcgcmVwb3J0ZWQgYnkgTml0cm8gaW4gVkM3CgkgICAgLSBtb3JlIGZpeGVzIGZvciBvbGQgU29sYXJpcyBjb21waWxlcgoJICAgIC0gZml4IGZvciBweXRob24gMi4zIGFuZCBnY19yZWZzIGlzc3VlIHJlcG9ydGVkIGJ5IEx1aWdpCgkgICAgLSBmaXggZmFzdHByb3h5IGZvciBtZXRob2RzIHVzaW5nIGt3YXJncwoJICAgIC0gZml4IG92ZXJsb2FkICsgcHJvdGVjdGVkIG1lbWJlciBpc3N1ZSByZXBvcnRlZCBieSBDb2xpbiBNY0RvbmFsZAoJICAgIC0gZml4IHNldGVycm9ybXNnIGFzIHJlcG9ydGVkIGJ5IENvbGluIE1jRG9uYWxkCgkgICAgLSBmaXggZGlyZWN0b3JzLCBub3cgdGhlIHRlc3Qtc3VpdGUgcnVucyBhZ2FpbiB1c2luZyAtZGlyZWN0b3JzCgkgICAgLSBmaXggZm9yIGZyaWVuZCBvcGVyYXRvciBhbmQgVmlzdWFsIHN0dWRpbyBhbmQgYnVnIDE0MzIxNTIKCSAgICAtIGZpeCBidWcgIzE0MzUwOTAKCSAgICAtIGZpeCB1c2luZyArICVleHRlbmQgYXMgcmVwb3J0ZWQgYnkgV2lsbGlhbQoJICAgIC0gZml4IGJ1ZyAjMTA5NDk2NAoJICAgIC0gZml4IGZvciBQeV9Ob3RJbXBsZW1lbnRlZCBhcyByZXBvcnRlZCBieSBPbGx5IGFuZCBBbWF1cnkKCSAgICAtIGZpeCBuZXN0ZWQgbmFtZXNwYWNlIGlzc3VlIHJlcG9ydGVkIGJ5IENoYXJsaWUKCgkgICAgYW5kIGFsc286CgkgICAgCgkgICAgLSBhbGxvdyBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVycyBieSBkZWZhdWx0CgkgICAgLSBkZWxldGUgZXh0cmEgbmV3IGxpbmVzIGluIHN3aWdtYWNyb3NbVVRMXQoJICAgIC0gY29zbWV0aWMgZm9yIGdlbmVyYXRlZCBweXRob24gY29kZQoJICAgIC0gYWRkIHRoZSBmYWN0b3J5LmkgbGlicmFyeSBmb3IgVVRMCgkgICAgLSBhZGQgc3dpZ3JlZ2lzdGVyIHByb3h5IG1ldGhvZCBhbmQgbW92ZSBfX3JlcHJfXyB0byBhCgkgICAgICBzaW5nbGUgZ2xvYmFsIG1vZHVsZSAgW3B5dGhvbl0KCjAyLzIyLzIwMDY6IG1tYXR1cyAKCgkgICAgV2hlbiB1c2luZyBkaXJlY3RvcnMsIG5vdyBzd2lnIHdpbGwgZW1pdCBhbGwgdGhlIHZpcnR1YWwKCSAgICBwcm90ZWN0ZWQgbWV0aG9kcyBieSBkZWZhdWx0LiAKCgkgICAgSW4gcHJldmlvdXMgcmVsZWFzZXMsIHlvdSBuZWVkZWQgdG8gdXNlIHRoZSAnZGlycHJvdCcKCSAgICBvcHRpb24gdG8gYWNoaWV2ZSB0aGUgc2FtZS4KCgkgICAgSWYgeW91IHdhbnQsIHlvdSBjYW4gZGlzYWJsZSB0aGUgbmV3IGRlZmF1bHQgYmVoYXZpb3VyLAoJICAgIHVzZSB0aGUgJ25vZGlycHJvdCcgb3B0aW9uOiAKCgkgICAgICAgc3dpZyAtbm9kaXJwcm90IC4uLgoKCSAgICBhbmQvb3IgdGhlICVub2RpcmVjdG9yIGZlYXR1cmUgZm9yIHNwZWNpZmljIG1ldGhvZHMsIGkuZS46CgoJICAgICAgICVub2RpcmVjdG9yIEZvbzo6YmFyOwoKCSAgICAgICBzdHJ1Y3QgRm9vIHsKCSAgICAgICAgIHZpcnR1YWwgfkZvbygpOwoKCSAgICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKCk7CgkgICAgICAgfTsKCSAgICAKCgkgICAgQXMgYmVmb3JlLCBwdXJlIGFic3RyYWN0IHByb3RlY3RlZCBtZW1iZXJzIGFyZSBhbGx3YXlzCgkgICAgZW1pdHRlZCwgaW5kZXBlbmRlbnQgb2YgdGhlICdkaXJwcm90L25vZGlycHJvdCcgb3B0aW9ucy4KCgowMi8yMi8yMDA2OiBtbWF0dXMKCSAgICBBZGQgdGhlIGZhY3RvcnkuaSBsaWJyYXJ5IGZvciBsYW5ndWFnZXMgdXNpbmcgdGhlIFVUTCAocHl0aG9uLHRjbCxydWJ5LHBlcmwpLgoJICAgIAogICAgICAgICAgICBmYWN0b3J5LmkgaW1wbGVtZW50cyBhIG1vcmUgbmF0dXJhbCB3cmFwIGZvciBmYWN0b3J5IG1ldGhvZHMuIAoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmU6CQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIC0tLS0gIGdlb21ldHJ5LmggLS0tLS0tLS0JCQkJCSAgICAKICAJICAgICAgICAgc3RydWN0IEdlb21ldHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgIAogIAkgICAgICAgICAgIGVudW0gR2VvbVR5cGV7CQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgICAgICBQT0lOVCwJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICAgIENJUkNMRQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIH5HZW9tZXRyeSgpIHt9ICAgIAkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIGludCBkcmF3KCkgPSAwOwkJCQkgICAgCiAgCSAgICAJIAkJCQkJCQkgICAgCiAgCSAgICAJIC8vCQkJCQkJCSAgICAKICAJICAgIAkgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgCSAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgICAgc3RhdGljIEdlb21ldHJ5ICpjcmVhdGUoR2VvbVR5cGUgaSk7ICAgICAJCSAgICAKICAJICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBQb2ludCA6IEdlb21ldHJ5ICB7CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGludCBkcmF3KCkgeyByZXR1cm4gMTsgfQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBkb3VibGUgd2lkdGgoKSB7IHJldHVybiAxLjA7IH0gICAgCSAgICAgCQkgICAgCiAgCSAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgQ2lyY2xlIDogR2VvbWV0cnkgIHsJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgaW50IGRyYXcoKSB7IHJldHVybiAyOyB9CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRvdWJsZSByYWRpdXMoKSB7IHJldHVybiAxLjU7IH0gICAgICAgICAgCQkgICAgCiAgCSAgICAgICAgIH07IAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICAgIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgICAgICAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgIEdlb21ldHJ5ICpHZW9tZXRyeTo6Y3JlYXRlKEdlb21UeXBlIHR5cGUpIHsJCSAgICAKICAJICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGNhc2UgUE9JTlQ6IHJldHVybiBuZXcgUG9pbnQoKTsJICAgICAJCSAgICAKICAJICAgICAgICAgICBjYXNlIENJUkNMRTogcmV0dXJuIG5ldyBDaXJjbGUoKTsgCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB9CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICB9CQkJCQkgICAgCQkgICAgCiAgCSAgICAtLS0tICBnZW9tZXRyeS5oIC0tLS0tLS0tCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgWW91IGNhbiB1c2UgdGhlICVmYWN0b3J5IHdpdGggdGhlIEdlb21ldHJ5OjpjcmVhdGUgbWV0aG9kIGFzIGZvbGxvd3M6CgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICVuZXdvYmplY3QgR2VvbWV0cnk6OmNyZWF0ZTsJCQkJICAgIAogIAkgICAgICAlZmFjdG9yeShHZW9tZXRyeSAqR2VvbWV0cnk6OmNyZWF0ZSwgUG9pbnQsIENpcmNsZSk7CSAgICAKICAJICAgICAgJWluY2x1ZGUgImdlb21ldHJ5LmgiCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICBhbmQgR2VvbWV0cnk6OmNyZWF0ZSB3aWxsIHJldHVybiBhICdQb2ludCcgb3IgJ0NpcmNsZScgaW5zdGFuY2UgICAKICAJICAgIGluc3RlYWQgb2YgdGhlIHBsYWluICdHZW9tZXRyeScgdHlwZS4gRm9yIGV4YW1wbGUsIGluIHB5dGhvbjoJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgICBjaXJjbGUgPSBHZW9tZXRyeS5jcmVhdGUoR2VvbWV0cnkuQ0lSQ0xFKQkJCSAgICAKICAJICAgICAgciA9IGNpcmNsZS5yYWRpdXMoKQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIHdoZXJlICdjaXJjbGUnIG5vdyBpcyBhIENpcmNsZSBwcm94eSBpbnN0YW5jZS4JICAgIAkJICAgIAoKCjAyLzE3LzIwMDY6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIFR5cGVtYXBzIGZvciBhbGwgaW50ZWdyYWwgdHlwZXMgbm93IGFjY2VwdCB0aGUgZnVsbCByYW5nZSBvZiBpbnRlZ3JhbAoJICAgIHZhbHVlcywgYW5kIHRoZXkgc2lnbmFsIGFuIGVycm9yIHdoZW4gYSB2YWx1ZSBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBpcyBwYXNzZWQuCgkgICAgW0d1aWxlXSBUeXBlbWFwcyBmb3IgYWxsIGludGVncmFsIHR5cGVzIG5vdyBzaWduYWwgYW4gZXJyb3Igd2hlbiBhIHZhbHVlIG91dHNpZGUKCSAgICB0aGUgdmFsaWQgcmFuZ2UgaXMgcGFzc2VkLgoKMDIvMTMvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0RvY3VtZW50c10gdXBkYXRlZCB0aGUgZXh0ZW5kaW5nIGRvY3VtZW50cyB0byBnaXZlIGEgc2tlbGV0b24gc3dpZ2dpbmcgY29kZQogICAgICAgICAgICB3aXRoIGEgZmV3IHR5cGVtYXBzLgogICAgICAgICAgICBbTHVhXSBhZGRlZCBhbiBleHRyYSB0eXBlbWFwIGZvciB2b2lkKiBbaW5dLCBzbyBhIGZ1bmN0aW9uIHdoaWNoIHJlcXVpcmVzIGEgdm9pZCoKICAgICAgICAgICAgY2FuIHRha2UgYW55IGtpbmQgb2YgcG9pbnRlcgoKVmVyc2lvbiAxLjMuMjggKEZlYnJ1YXJ5IDEyLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMS8yMDA2OiBtbWF0dXMKCSAgICBGaXggbWFueSBpc3N1ZXMgd2l0aCBsaW5lIGNvdW50aW5nIGFuZCBlcnJvciByZXBvcnRzLgoKMDIvMTEvMjAwNjogbW1hdHVzCgkgICAgW1B5dGhvbl0gQmV0dGVyIHN0YXRpYyBkYXRhIG1lbWJlciBzdXBwb3J0LCBpZiB5b3UgaGF2ZQoJICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgYmFyOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoZW4gbm93IGlzIHZhbGlkIHRvIGFjY2VzcyB0aGUgc3RhdGljIGRhdGEgbWVtYmVyLCBpZToKCiAgICAgICAgICAgICAgICBmID0gRm9vKCkKICAgICAgICAgICAgICAgIGYuYmFyID0gMwoKCSAgICBqdXN0IGFzIGluIEMrKy4KCgowMi8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0KICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHRvIHdvcmsgYWdhaW4gd2l0aCBvbGQgdmVyc2lvbnMgb2YgUGVybAogICAgICAgICAgICAoNS4wMDQgYW5kIGxhdGVyIHRlc3RlZCkKCjAyLzA0LzIwMDY6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCB0aGUgJWV4dGVuZF9zbWFydF9wb2ludGVyKCkgZGlyZWN0aXZlIHRvIGV4dGVuZAoJICAgIFNXSUcgc21hcnQgcG9pbnRlciBzdXBwb3J0IGluIHB5dGhvbi4gCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHNtYXJ0IHBvaW50ZXIgYXM6CgkgICAgCgkgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4gY2xhc3MgUkNQdHIgewoJICAgICAgcHVibGljOgoJICAgICAgICAuLi4KCSAgICAgICAgUkNQdHIoVHlwZSAqcCk7CgkJVHlwZSAqIG9wZXJhdG9yLT4oKSBjb25zdDsKCQkuLi4KCSAgICAgIH07CgkgICAgICAKCSAgICB5b3UgdXNlIHRoZSAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIgZGlyZWN0aXZlIGFzOgoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSAgUkNQdHI8QT47CgkgICAgCgkgICAgdGhlbiwgaWYgeW91IGhhdmUgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgUkNQdHI8QT4gbWFrZV9wdHIoKTsKCSAgICAgIGludCBmb28oQSAqKTsKCgkgICAgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nOgoKCSAgICAgIGEgPSBtYWtlX3B0cigpOwoJICAgICAgYiA9IGZvbyhhKTsKCiAgICAgICAgICAgIGllLCBzd2lnIHdpbGwgYWNjZXB0IGEgUkNQdHI8QT4gb2JqZWN0IHdoZXJlIGEgJ0EgKicgaXMKICAgICAgICAgICAgZXhwZWN0ZWQuCgoJICAgIEFsc28sIHdoZW4gdXNpbmcgdmVjdG9ycwoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSBSQ1B0cjxBPjsKCSAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfQSkgc3RkOjp2ZWN0b3I8UkNQdHI8QT4gPjsKCQkKCSAgICB5b3UgY2FuIHR5cGUKCgkgICAgICBhID0gQSgpOwoJICAgICAgdiA9IHZlY3Rvcl9BKDIpCgkgICAgICB2WzBdID0gYQoKICAgICAgICAgICAgaWUsIGFuICdBIConIG9iamVjdCBpcyBhY2NlcHRlZCwgdmlhIGltcGxpY2l0IGNvbnZlcnNpb24sIAoJICAgIHdoZXJlIGEgUkNQdHI8QT4gb2JqZWN0IGlzIGV4cGVjdGVkLiBBZGRpdGlvbmFsbHkKCgkgICAgICB4ID0gdlswXQoKCSAgICByZXR1cm5zIChhbmQgc2V0cyAneCcgYXMpIGEgY29weSBvZiB2WzBdLCBtYWtpbmcgcmVmZXJlbmNlCgkgICAgY291bnRpbmcgcG9zc2libGUgYW5kIGNvbnNpc3RlbnQuCgoJICAgICVleHRlbmRfc21hcnRfcG9pbnRlciBpcyBqdXN0IGEgY29sbGVjdGlvbnMgb2YgbmV3L29sZAoJICAgIHRyaWNrcywgaW5jbHVkaW5nICV0eXBlbWFwcyBhbmQgdGhlIG5ldyAlaW1wbGljaXRjb252CgkgICAgZGlyZWN0aXZlLgoKMDIvMDIvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgYnVnZml4ICMxMzU2NTc3LCBjaGFuZ2VkIGRvdWJsZT0+bHVhX251bWJlciBpbiBhIGZldyBwbGFjZXMuCiAgICAgICAgICAgIGFkZGVkIHRoZSBzdGQ6OnBhaXIgd3JhcHBpbmcKCjAxLzMwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFuZCBzdGQ6OndzdHJpbmcgbWVtYmVyIHZhcmlhYmxlcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBub3cgdXNlCiAgICAgICAgICAgICVuYXR1cmFsdmFyIGJ5IGRlZmF1bHQsIG1lYW5pbmcgdGhleSB3aWxsIG5vdyBiZSB3cmFwcGVkIGFzIGV4cGVjdGVkIGluIGFsbCBsYW5ndWFnZXMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlc2Ugd2VyZSB3cmFwcGVkIGFzIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhIHRhcmdldCBsYW5ndWFnZSBzdHJpbmcuCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYWRkIHRoZSBmb2xsb3dpbmcgd29ya2Fyb3VuZCB0byB3cmFwIHRoZXNlIGFzIHN0cmluZ3M6CgoJCSVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKn0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjAxLzI4LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gCgkgICAgQWRkIHR5cGVtYXBzIGZvciBoYW5kbGluZyBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgowMS8yNC8yMDA2OiBtbWF0dXMKCSAgICAtIEJldHRlciBzdXBwb3J0IGZvciB0aGUgJW5hdHVyYWx2YXIgZGlyZWN0aXZlLCBub3cgaXQKCSAgICAgIHdvcmtzIHdpdGggdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgYXMgd2VsbCBhcwoJICAgICAgSmF2YS9DIy4KCSAgICAgIAoJICAgICAgTm93LCBpdCBjYW4gYWxzbyBiZSBhcHBsaWVkIHRvIGNsYXNzIHR5cGVzOgoKCSAgICAgICAgJW5hdHVyYWx2YXIgc3RkOjpzdHJpbmc7CgkgICAgICAgICVpbmNsdWRlIDxzdGRfc3RyaW5nLmk+CgkgICAgICAKICAgICAgICAgICAgICB0aGF0IHdpbGwgdGVsbCBzd2lnIHRvIHVzZSB0aGUgJ25hdHVyYWwnIHdyYXBwaW5nCiAgICAgICAgICAgICAgbWVjaGFuaXNtIHRvIGFsbCBzdGQ6OnN0cmluZyBnbG9iYWwgYW5kIG1lbWJlcgogICAgICAgICAgICAgIHZhcmlhYmxlcy4KCgkgICAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlICVhbGxvd2V4Y2VwdCBmZWF0dXJlIGFsb25nIHRoZQogICAgICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZXMsIHdoaWNoIGFsbG93cyB0aGUgJWV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgICAgdG8gYmUgYXBwbGllZCB0byB0aGUgdmFyaWFibGUgYWNjZXNzIG1ldGhvZHMuIEFsc28sIGFkZAogICAgICAgICAgICAgIHRoZSAlZXhjZXB0aW9udmFyIGRpcmVjdGl2ZSB0byBzcGVjaWZ5IGEgZGlzdGludGljCiAgICAgICAgICAgICAgZXhjZXB0aW9uIG1lY2hhbmlzbSBvbmx5IGZvciB2YXJpYWJsZXMuCgkgICAgICAKCSAgICAKCSAgICAtIEFkZCBtb3JlIGRvY3MgZm9yIHRoZSAlZGVsb2JqZWN0IGRpcmVjdGl2ZSB0byBtYXJrIGEgbWV0aG9kIGFzIGEKCSAgICAgIGRlc3RydWN0b3IsICdkaXNvd25pbmcnIHRoZSBmaXJzdCBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgoJICAgICAgICAlbmV3b2JqZWN0IGNyZWF0ZV9mb287CgkgICAgICAgICVkZWxvYmplY3QgZGVzdHJveV9mb287CgoJICAgICAgICBGb28gKmNyZWF0ZV9mb28oKSB7IHJldHVybiBuZXcgRm9vKCk7IH0KCSAgICAgICAgdm9pZCBkZXN0cm95X2ZvbyhGb28gKmZvbykgeyBkZWxldGUgZm9vOyB9CgoJICAgICAgb3IgaW4gYSBtZW1iZXIgbWV0aG9kIGFzOgoKCSAgICAgICAgJWRlbG9iamVjdCBGb286OmRlc3Ryb3k7CgoJICAgICAgICBjbGFzcyBGb28gewoJICAgICAgICBwdWJsaWM6CgkgICAgICAgICAgdm9pZCBkZXN0cm95KCkgeyBkZWxldGUgdGhpczt9CgoJICAgICAgICBwcml2YXRlOgoJICAgICAgICAgIH5Gb28oKTsKICAgICAgICAgICAgICAgfTsKCgowMS8yNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIC0gUmVtb3ZlZCB0aGUgdHlwZSBzd2lnX2x1YV9jb21tYW5kX2luZm8gJiByZXBsYWNlIHdpdGggbHVhTF9yZWcKCSAgICAgICh3aGljaCB0aGVuIGJyb2tlIHRoZSBjb2RlKSwgZml4ZWQgdGhpcwoJICAgIC0gYWRkZWQgYW4gYWRkaXRpb25hbCBjYXN0IGluIHRoZSB0eXBlbWFwcyBmb3IgZW51bSdzCgkgICAgICBkdWUgdG8gdGhlIGlzc3VlIHRoYXQgVkMuTmV0IHdpbGwgbm90IGFsbG93IGNhc3Rpbmcgb2YKCSAgICAgIGEgZG91YmxlIHRvIGFuIGVudW0gZGlyZWN0bHkuIFRoZXJlZm9yZSBjYXN0IHRvIGludCB0aGVuIHRvIGVudW0KCSAgICAgICh0aGFua3MgdG8gSmFzb24gUmVnbyBmb3IgdGhpcyBvYnNlcnZhdGlvbikKCjAxLzE2LzIwMDY6IG1tYXR1cyAoQ2hhbmdlIGRpc2FibGVkLi4uIHdpbGwgYmUgYmFjayBpbiBDVlMgc29vbikKCSAgICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciByZWdleHAgdmlhIHRoZSBleHRlcm5hbCBsaWJyYXJ5CgkgICAgUnhTcGVuY2VyLiBTV0lHIGRvZXNuJ3QgcmVxdWlyZSB0aGlzIGxpYnJhcnkgdG8gY29tcGlsZQoJICAgIGFuZC9vciBydW4uIEJ1dCBpZiB5b3Ugc3BlY2lmeSAtLXdpdGgtcnhzcGVuY2VyLCBhbmQgdGhlCgkgICAgbGlicmFyeSBpcyBmb3VuZCBkdXJpbmcgaW5zdGFsbGF0aW9uLCB0aGVuIHN3aWcgd2lsbCB1c2UKCSAgICBpdCBpbiB0aHJlZSBwbGFjZXM6CgoJICAgIC0gSW4gJXJlbmFtZXMgcnVsZXMsIHZpYSB0aGUgbmV3IHJ4c21hdGNoIHJ1bGVzLCBmb3IgZXhhbXBsZToKCSAgICAJICAKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c21hdGNoJG5hbWU9IkdTTF8uKiIpICIiOwoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzbWF0Y2gkbm9kZVR5cGU9ImVudW0gR1NMXy4qIikgIiI7CgkgICAgCSAKICAgICAgICAgICAgICByeHNtYXRjaCBpcyBzaW1pbGFyIHRvIHRoZSBtYXRjaCBydWxlLCBpdCBqdXN0IHVzZXMKICAgICAgICAgICAgICB0aGUgUnhTcGVuY2VyIHJlZ2V4cCBsaWJyYXJ5IHRvIGRlY2lkZSBpZiB0aGVyZSBpcyBhCiAgICAgICAgICAgICAgbWF0Y2ggd2l0aCB0aGUgcHJvdmlkZWQgcmVnZXhwLiBBcyB3aXRoIHRoZSBtYXRjaAogICAgICAgICAgICAgIHJ1bGUsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIG5lZ2F0ZSBydWxlIG5vdHJ4c21hdGNoLgoKCSAgICAtIEluIHRoZSAlcmVuYW1lIHRhcmdldCBuYW1lIHZpYSB0aGUgcnhzdGFyZ2V0IG9wdGlvbiwgZm9yIGV4YW1wbGU6CgkgICAgCQkgCgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHN0YXJnZXQ9MSkgIkdTTF8uKiI7CgoJICAgIAl3aGVyZSB0aGUgdGFyZ2V0IG5hbWUgIkdTTC4qIiBpcyBub3cgdW5kZXJzdG9vZCBhcyBhCgkgICAgCXJlZ2V4cCB0byBiZSBtYXRjaGVkLiAgCgkgICAgCSAKICAgICAgICAgICAgLSBJbiB0aGUgbmV3IGVuY29kZXIgInJ4c3BlbmNlciIsIHdoaWNoIGxvb2tzIGxpa2U6CgoJICAgIAkgICUocnhzcGVuY2VyOltyZWdleHBdW3JlcGxhY2VdKXMKCgkgICAgCXdoZXJlICJyZWdleHAiIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kICJyZXBsYWNlIgoJICAgIAlpcyBhIHN0cmluZyB1c2VkIGFzIGEgcmVwbGFjZW1lbnQsIHdoZXJlIHRoZSBAMCxAMSwuLi4sQDkKCSAgICAJcHNldWRvIGFyZ3VtZW50cyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlCgkgICAgCWNvcnJlc3BvbmRpbmcgbWF0Y2hpbmcgaXRlbXMgaW4gdGhlIHJlZyBleHByZXNzaW9uLgoKCSAgICAJRm9yIGV4YW1wbGU6CgkgICAgCQkgICAgICAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBIZWxsbyAgICAtPiAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBHU0xIZWxsbyAtPiBHU0xIZWxsbwoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMKC4qKV1bQDFdKXMgICAgIDwtIEdTTEhlbGxvIC0+IEhlbGxvCgkgICAgICAgICUocnhzcGVuY2VyOltHU0woLiopXVtnc2xAMV0pcyAgPC0gR1NMSGVsbG8gLT4gZ3NsSGVsbG8KCgkgICAgCUFub3RoZXIgZXhhbXBsZSBjb3VsZCBiZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIlKGxvd2VyY2FzZSlzIixzb3VyY2VmbXQ9IiUocnhzcGVuY2VyOltHU0xfKC4qKV1bQDFdKXMiLCUkaXNmdW5jdGlvbikgIiI7CgoJICAgIAl3aGljaCB0YWtlIG91dCB0aGUgcHJlZml4ICJHU0xfIiBhbmQgcmV0dXJucyBhbGwgdGhlCgkgICAgCWZ1bmN0aW9uIG5hbWVzIGluIGxvd2VyIGNhc2VzLCBhcyBmb2xsb3dpbmc6CgoJICAgIAkgICAgdm9pZCBHU0xfSGVsbG8oKTsgICAtPiAgIGhlbGxvKCk7CgkgICAgCSAgICB2b2lkIEdTTF9IaSgpOyAgICAgIC0+ICAgaGkoKTsKCSAgICAJICAgIGNvbnN0IGludCBHU0xfTUFYOyAgLT4gICBHU0xfTUFYOyAgLy8gbm8gY2hhbmdlLCBpcyBub3QgYSBmdW5jdGlvbgoJCgkgICAgV2UgdXNlIHRoZSBSeFNwZW5jZXIgYXMgYW4gaW5pdGlhbCB0ZXN0IGJlZCB0bwogICAgICAgICAgICBpbXBsZW1lbnRpb24gd2hpbGUgd2UgZGVjaWRlIHdoaWNoIGxpYnJhcnkgd2lsbCBiZQogICAgICAgICAgICBmaW5hbGx5IGFkZGVkIHRvIHN3aWcuCgogICAgICAgICAgICBZb3UgY2FuIG9idGFpbiB0aGUgUnhTcGVuY2VyIGxpYnJhcnkgZnJvbSAKCSAgICAKCSAgICAgIGh0dHA6Ly9hcmdsaXN0LmNvbS9yZWdleCAoVW5peCkKCgkgICAgb3IKCSAgICAgCgkgICAgICBodHRwOi8vZ251d2luMzIuc291cmNlZm9yZ2UubmV0L3BhY2thZ2VzLmh0bWwgKFdpbmRvd3MpCgoJICAgIE9uY2UgaW5zdGFsbGVkLCB1c2UgIm1hbiByeHNwZW5jZXIiIHRvIGdldCBtb3JlIGluZm8KCSAgICBhYm91dCB0aGUgcmVnZXhwIGZvcm1hdCwgb3IganVzdCBnb29nbGUgcnhzcGVuY2VyLgoKCSAgICBTaW5jZSBub3cgeW91IGNhbiBlbmFibGUgdGhlIHJ4c21hdGNoIHJ1bGVzIChzZWUgYWJvdmUpLAogICAgICAgICAgICB0aGUgc2ltcGxlIG9yICd8JyBzdXBwb3J0IGZvciB0aGUgbWF0Y2ggcnVsZXMKICAgICAgICAgICAgKDAxLzEyLzIwMDY6IG1tYXR1cykgaXMgZGlzYWJsZWQuIFN0aWxsLCBpZiB5b3UgaGF2ZQogICAgICAgICAgICBwcm9ibGVtcyB3aXRoIHRoZSByeHNwZW5jZXIgbGlicmFyeSwgeW91IGNhbiByZS1lbmFibGUKICAgICAgICAgICAgdGhlIHNpbXBsZSAnbWF0Y2ggb3InIHN1cHBvcnQgdXNpbmcKICAgICAgICAgICAgLURTV0lHX1VTRV9TSU1QTEVfTUFUQ0hPUi4KCSAgCgowMS8xNi8yMDA2OiBtbWF0dXMKCSAgICBDaGFuZ2UgdGhlICVyZW5hbWUgcHJlZGljYXRlcyB0byB1c2UgdGhlIHByZWZpeCAnJSQnLCBhcyBpbjoKCSAgICAKCSAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiLCUkaXNmdW5jdGlvbiwlJGlzbWVtYmVyKSAiIjsgCgkgICAJCiAgICAgICAgICAgIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCBvdGhlciBzd2lnIG1hY3Jvcy9kaXJlY3RpdmVzLgoKMDEvMTQvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQoJICAgIEFkZGVkIHN1cHBvcnQgZm9yIFJ1YnkgYmFuZyEgbWV0aG9kcyB2aWEgYSBuZXcgJWJhbmcgZmVhdHVyZS4KCSAgICBCYW5nIG1ldGhvZHMgZW5kIGluIGV4Y2xhbWF0aW9uIHBvaW50cyBhbmQgaW5kaWNhdGUgdGhhdCB0aGUKCSAgICBvYmplY3QgYmVpbmcgcHJvY2Vzc2VkIHdpbGwgYmUgbW9kaWZpZWQgaW4tcGxhY2UgYXMgCgkgICAgb3Bwb3NlZCB0byBiZWluZyBjb3BpZWQuCgowMS8xMi8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgVXBkYXRlZCB0aGUgUnVieSBtb2R1bGUgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0CgkgICAgbWV0aG9kIG5hbWVzIHRvIGxvd2VyX2Nhc2Vfd2l0aF91bmRlcnNjb3JlcyB1c2luZyB0aGUKCSAgICBuZXcgJXJlbmFtZSBmdW5jdGlvbmFsaXR5LgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgYWxpYXNlcyBmb3IgJ2Nhc2UnIGVuY29kZXJzIHVzZWQgd2l0aCAlcmVuYW1lLyVuYW1ld2FybgoKCSAgICAgICUodXBwZXJjYXNlKXMgICBoZWxsb193b3JsZCAtPiBIRUxMT19XT1JMRAoJICAgICAgJShsb3dlcmNhc2UpcyAgIEhlbGxvV29ybGQgIC0+IGhlbGxvd29ybGQKCSAgICAgICUoY2FtZWxjYXNlKXMgICBoZWxsb193b3JsZCAtPiBIZWxsb1dvcmxkCgkgICAgICAlKHVuZGVyY2FzZSlzICAgSGVsbG9Xb3JsZCAgLT4gaGVsbG9fd29ybGQKCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCB0aGUgLWR1bXBfcGFyc2VfbW9kdWxlIGFuZCAtZHVtcF9wYXJzZV90b3Agb3B0aW9ucywKCSAgICB3aGljaCBhcmUgc2ltaWxhciB0byAtZHVtcF9tb2R1bGUgYW5kIC1kdW1wX3RvcCwgYnV0IHRoZXkKCSAgICBkdW1wIHRoZSBub2RlIHRyZWVzIGp1c3QgYWZ0ZXIgcGFyc2luZywgc2hvd2luZyBvbmx5IHRoZSAKCSAgICBhdHRyaWJ1dGVzIHZpc2libGUgYXQgdGhlIHBhcnNpbmcgc3RhZ2UsIGFuZCBub3QgdGhlIGFkZGVkCgkgICAgbGF0ZXIgaW4gdHlwZW1hcC5jeHgsIGFsbG9jYXRlLmN4eCwgbGFuZy5jeHggb3IgZWxzZXdoZXJlLgoJICAgIAoJICAgIEJlc2lkZXMgZGVidWdnaW5nIHBvcnB1c2VzLCB0aGVzZSBvcHRpb25zIGFyZSB2ZXJ5IHVzZWZ1bAoJICAgIGlmIHlvdSBwbGFuIHRvIHVzZSAlcmVuYW1lIGluIGFuICJhZHZhbmNlIHdheSIsIHNpbmNlIGl0CgkgICAgc2hvd3Mgb25seSBhbmQgYWxsIHRoZSBub2RlJ3MgYXR0cmlidXRlcyB5b3UgY2FuIHVzZQoJICAgIGluc2lkZSB0aGUgbWF0Y2ggcnVsZXMuCgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgcHJlZGljYXRlcyB0byAlcmVuYW1lLCBzbywgeW91IGRvbid0IG5lZWQgdG8KCSAgICAgIHJlbWVtYmVyLCBmb3IgZXhhbXBsZSwgaG93IHRvIG1hdGNoIGEgbWVtYmVyIGZ1bmN0aW9uLgoKCSAgICAgIE5vdyBpdCBpcyBlYXN5LCBmb3IgZXhhbXBsZSB0byB1c2UgdGhlICd1dGl0bGUnIGVuY29kZXIgCgkgICAgICBpbiBhbGwgdGhlIG1lbWJlciBtZXRob2RzLCB5b3UgdHlwZToKCgkgICAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiLCVpc2Z1bmN0aW9uLCVpc21lbWJlcikgIiI7CgoJICAgICAgb3IgdG8gaWdub3JlIGFsbCB0aGUgZW51bWl0ZW1zIGluIGEgZ2l2ZW4gY2xhc3M6CgoJICAgICAgICAlcmVuYW1lKCIkaWdub3JlIiwgJWlzZW51bWl0ZW0sICVjbGFzc25hbWU9Ik15Q2xhc3MiKSAiIjsgIAoKCSAgICAgIEF2YWlsYWJsZSBwcmVkaWNhdGVzIGFyZSAoc2VlIHN3aWcuc3dnKToKCiAgICAgICAgICAgICAgICAlaXNlbnVtICAgICAgICAgCgkJJWlzZW51bWl0ZW0gICAgIAoJCSVpc2FjY2VzcyAgICAgICAKCQklaXNjbGFzcyAgICAgICAgCgkJJWlzZXh0ZW5kICAgICAgIAoJCSVpc2V4dGVuZCAgICAgICAKCQklaXNjb25zdHJ1Y3RvciAgCgkJJWlzZGVzdHJ1Y3RvciAgIAoJCSVpc25hbWVzcGFjZSAgICAKCQklaXN0ZW1wbGF0ZSAgICAgCgkJJWlzY29uc3RhbnQgICAgIAoJCQkJCQoJCSVpc3VuaW9uICAgICAgICAKCQklaXNmdW5jdGlvbiAgICAgCgkJJWlzdmFyaWFibGUgICAgIAoJCSVpc2ltbXV0YWJsZSAgICAKCQkJCQkKCQklaXNzdGF0aWMgICAgICAgCgkJJWlzZnJpZW5kICAgICAgIAoJCSVpc3R5cGVkZWYgICAgICAKCQklaXN2aXJ0dWFsICAgICAgCgkJJWlzZXhwbGljaXQgICAgIAoJCSVpc2V4dGVybiAgICAgICAKCQkJCQkKCQklaXNtZW1iZXIgICAgICAgCgkJJWlzZ2xvYmFsIAoJCSVpbm5hbWVzcGFjZQoKCQklaXNwdWJsaWMgICAgCgkJJWlzcHJvdGVjdGVkIAoJCSVpc3ByaXZhdGUgICAKCQkJCSAgICAgCgkJJWNsYXNzbmFtZSAgIAoKICAgICAgICAgICAgICBUaGVzZSBwcmVkaWNhdGVzIGNvcnJlc3BvbmQgdG8gc3BlY2lmaWMgJ21hdGNoJwogICAgICAgICAgICAgIGRlY2xhcmF0aW9ucywgd2hpY2ggc29tZXRpbWVzIGFyZSBub3QgYXMgZXZpZGVudCBhcyB0aGUKICAgICAgICAgICAgICBwcmVkaWNhdGVzIG5hbWVzLgoKCiAgICAgICAgICAgIC0gQWRkIHRoZSBvciAnfCcgb3BlcmF0aW9uIGluICVyZW5hbWUgbWF0Y2gsIGZvcgogICAgICAgICAgICAgIGV4YW1wbGUgdG8gY2FwaXRhbGl6ZSBhbGwgdGhlIGNvbnN0YW50cyAoJWNvbnN0YW50IG9yCiAgICAgICAgICAgICAgY29uc3QgY2RlY2wpOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lKCIlKHVwcGVyKXMiLG1hdGNoPSJjZGVjbHxjb25zdGFudCIsJWlzaW1tdXRhYmxlKSAiIjsKICAgICAgICAgICAgICAgIAoKCjAxLzEyLzIwMDY6IG1nb3NzYWdlCgkgICAgLQlQYXJ0aWFsIGZpeGVkIG9mIGVycm9ycyB1bmRlciBDODksIGJ1ZyAjMTM1NjU3NAoJICAgIAkoY29udmVydGVkIEMrKyBzdHlsZSBjb21tZW50cyB0byBDIHN0eWxlKQoJICAgIC0JQWRkZWQgcGF0Y2hlcyBmcm9tIG5lb21hbnRyYUB1c2Vycy5zZi5uZXQgIzEzNzk5ODggYW5kICMxMzg4MzQzCgkgICAgCW1pc3NpbmcgYSAncmV0dXJuJyBzdGF0ZW1lbnQgZm9yIGVycm9yIGNvbmRpdGlvbnMKCSAgICAJYWxzbyB1cGRhdGVkIHRoZSAlaW5pdCBibG9jayBidWcgIzEzNTY1ODYKCQkgCjAxLzEwLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHRoZSAndXRpdGxlJyBlbmNvZGVyLCBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byBhZGQKCSAgICAgIHlvdXIgb3duIGVuY29kZXIuIEkgYWRkZWQgdGhlIGVuY29kZXIgbWV0aG9kIGluIG1pc2MuYyAKCSAgICAgIGJ1dCBkZXZlbG9wZXJzIGNhbiBhZGQgb3RoZXJzLCB0aGUgc2FtZSB3YXksIGluc2lkZSBhbnkKCSAgICAgIHRhcmdldCBsYW5ndWFnZS4KCSAgICAgIAoJICAgICAgV2VsbCwgJ3V0aXRsZScgaXMgdGhlIHJldmVyc2Ugb2YgJ2N0aXRsZScsIGllOgoKCSAgICAgICAgICVyZW5hbWUoIiUoY3RpdGxlKXMiKSBjYW1lbF9jYXNlOyAgLT4gQ2FtZWxDYXNlOwoJICAgICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIpIENhbWVsQ2FzZTsgICAtPiBjYW1lbF9jYXNlOwoJCSAKCjAxLzEwLzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KICAgICAgICAgICAgVXBkYXRlZCBSdWJ5IEV4Y2VwdGlvbiBoYW5kbGluZy4gIENsYXNzZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRocm93cyBjbGF1c2VzLCAKICAgICAgICAgICAgb3IgYXJlIG1hcmtlZCBhcyAlZXhjZXB0aW9uY2xhc3MsIGFyZSBub3cgaW5oZXJpdGVkIGZyb20gcmJfZVJ1bnRpbWVFcnJvci4gCiAgICAgICAgICAgIFRoaXMgYWxsb3dzIGluc3RhbmNlcyBvZiB0aGVzZSBjbGFzc2VzIHRvIGJlIHJldHVybmVkIHRvIFJ1YnkgYXMgZXhjZXB0aW9ucy4gCiAgICAgICAgICAgIFRodXMgaWYgYSBDKysgbWV0aG9kIHRocm93cyBhbiBpbnN0YW5jZSBvZiBNeUV4Y2VwdGlvbiwgdGhlIGNhbGxpbmcgUnVieSAKICAgICAgICAgICAgbWV0aG9kIHdpbGwgZ2V0IGJhY2sgYSBNeUV4Y2VwdGlvbiBvYmplY3QuICBUbyBzZWUgYW4gZXhhbXBsZSwgCiAgICAgICAgICAgIGxvb2sgYXQgcnVieS9leGFtcGxlcy9leGNlcHRpb25fY2xhc3MuCgowMS8xMC8yMDA2OiBtbWF0dXMKCSAgICAKICAgICAgICAgICAgLSBBZGQgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSwgd2hpY2ggY29tcGxlbWVudHMgdGhlICVleGNlcHRpb24KCSAgICBkaXJlY3RpdmUgaW4gYSBtb3JlIGF1dG9tYXRpYyB3YXkuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQoKICAgICAgICAgICAgICAgIGludCBmb28oKSB0aHJvdyhFMSk7CgogICAgICAgICAgICBzd2lnIGdlbmVyYXRlcyB0aGUgcHJvcGVyIHRyeS9jYXRjaCBjb2RlIHRvIGRpc3BhdGNoIEUxLgoJICAgIAoJICAgIEJ1dCBpZiB5b3UgaGF2ZToKCgoJICAgICAgICAgIGludCBiYXJmb28oaW50IGkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CgkgICAgICAgICAgICAgICB0aHJvdyBFMSgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgIHRocm93IEUyKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBpZSwgd2hlcmUgdGhlcmUgaXMgbm8gZXhwbGljaXQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaW4gdGhlIGRlY2wsIHlvdSAKCSAgICBlbmQgdXAgZG9pbmc6CgkJICAKICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBiYXJmb28gewkJCQoJICAgICAgICAgdHJ5IHsJCQkJCgkgICAgICAgICAgICRhY3Rpb24JCQkKCSAgICAgICAgIH0gY2F0Y2goRTEpIHsJLi4uIH0JCQkJICAKCSAgICAgICAgIH0gY2F0Y2goRTIpIHsJLi4uIH0JCQkJICAKCSAgICAgICB9CQkJCQoJICAgIAoJICAgIHdoaWNoIGlzIHZlcnkgdGVkaW91cy4gV2VsbCwgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSBkZWZpbmVzCgkgICAgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0byBjYXRjaCwgYW5kIGZyb20gc3dpZzoKIAkKCSAgICAgICAlY2F0Y2hlcyhFMSxFMikgYmFyZm9vKGludCBpKTsKCSAgICAgICBpbnQgYmFyZm9vKGludCBpKTsKCiAgICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gCgoJICAgICAgIGludCBiYXJmb28oaW50IGkpIHRocm93KEUxLEUyKTsKCgkgICAgTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgJWNhdGNoZXMgbGlzdCBkb2Vzbid0IGhhdmUgdG8KCSAgICBjb3JyZXNwb25kIHRvIHRoZSBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3UKCSAgICBoYXZlOgoKCQlzdHJ1Y3QgRSB7fTsKCQlzdHJ1Y3QgRTEgOiBFIHt9OwoJCXN0cnVjdCBFMiA6IEUge307CgogIAkgICAgICAgIGludCBiYXJmb28oaW50IGkpIHRocm93KEUxLEUyKTsKCiAgICAgICAgICAgIHlvdSBjYW4gZGVmaW5lCgkgICAgICAgIAoJCSVjYXRjaGVzKEUpIGJhcmZvbyhpbnQgaSk7CgkKCSAgICBhbmQgc3dpZyB3aWxsIGdlbmVyYXRlIGFuIGFjdGlvbiBjb2RlIGVxdWl2YWxlbnQgdG8KCgkgICAgICAgICB0cnkgewkJCQkKCSAgICAgICAgICAgJGFjdGlvbgkJCQoJICAgICAgICAgfSBjYXRjaChFICZfZSkgeyAKCQkgICA8cmFpc2UgX2U+OwoJCSB9CQoKICAgICAgICAgICAgT2YgY291cnNlLCB5b3Ugc3RpbGwgaGF2ZSB0byBzYXRpc2Z5IHRoZSBDKysgcmVzdHJpY3Rpb25zLAoJICAgIGFuZCB0aGUgY2F0Y2hlcyBsaXN0IG11c3QgYmUgY29tcGF0aWJsZSAobm90IHRoZSBzYW1lKQoJICAgIGFzIHRoZSBvcmlnaW5hbCBsaXN0IG9mIHR5cGVzIGluIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4KCgkgICAgQWxzbywgeW91IGNhbiBub3cgc3BlY2lmeSB0aGF0IHlvdSB3YW50IHRvIGNhdGNoIHRoZQoJICAgIHVua25vd24gZXhjZXB0aW9uICcuLi4nLCBmb3IgZXhhbXBsZToKCgkgICAgICAgJWNhdGNoZXMoRTEsRTIsLi4uKSBiYXJmb28oaW50KTsKCgkgICAgSW4gYW55IGNhc2UsIHRoZSAlY2F0Y2hlcyBkaXJlY3RpdmUgd2lsbCBlbWl0IHRoZQoJICAgIGNvZGUgdG8gY29udmVydCBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgZXJyb3IvZXhjZXB0aW9uCiAgICAgICAgICAgIHVzaW5nIHRoZSAndGhyb3dzJyB0eXBlbWFwLgoKCSAgICBGb3IgdGhlICcuLi4nIGNhc2UgdG8gd29yaywgeW91IG5lZWQgdG8KCSAgICB3cml0ZSB0aGUgcHJvcGVyIHR5cGVtYXAgaW4geW91ciB0YXJnZXQgbGFuZ3VhZ2UuIEluIHRoZQoJICAgIFVUTCwgdGhpcyBsb29rcyBsaWtlOgoKCSAgICAgICV0eXBlbWFwKHRocm93cykgKC4uLikgewoJICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX1J1bnRpbWVFcnJvciwidW5rbm93biBleGNlcHRpb24iKTsKICAgICAgICAgICAgICB9CgowMS8wOS8yMDA2OiBtdXRhbmRpegoJICAgIFtBbGxlZ3JvY2xdCgogICAgICAgICAgICBGaXhlcyBhIG51bWJlciBvZiBTRUdWcyBwcmltYXJpbHkgaW4gdGhlIGhhbmRsaW5nIG9mCiAgICAgICAgICAgIHZhcmlvdXMgYW5vbnltb3VzIHR5cGVzLiBGb3VuZCBpbiBhIHBhc3MgdGhyb3VnaCB0aGUKICAgICAgICAgICAgc3dpZyB0ZXN0LXN1aXRlLiBTdGlsbCBtb3JlIHRvIGRvIGhlcmUsIGJ1dCB0aGlzIGlzIGEKICAgICAgICAgICAgZ29vZCBjaGVja3BvaW50LgoKICAgICAgICAgICAgQWRkcyAtY3dyYXAgYW5kIC1ub2N3cmFwIGFzIGFuIGFsbGVncm9jbCBzcGVjaWZpYwogICAgICAgICAgICBjb21tYW5kLWxpbmUgYXJndW1lbnQuIENvbnRyb2xzIGdlbmVyYXRpbmcgb2YgYSBDCiAgICAgICAgICAgIHdyYXBwZXIgZmlsZSB3aGVuIHdyYXBwaW5nIEMgY29kZS4gQnkgZGVmYXVsdCBvbmx5IGEKICAgICAgICAgICAgbGlzcCBmaWxlIGlzIGNyZWF0ZWQgZm9yIEMgY29kZSB3cmFwcGluZy4KCiAgICAgICAgICAgIERvYyB1cGRhdGVzIGZvciB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgZml4ZXMgYXMKICAgICAgICAgICAgcG9pbnRlZCBvdXQgb24gc3dpZy1kZXZlbAoKMDEvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCB1bnNpZ25lZCBsb25nIGxvbmcgYW5kIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAmIHR5cGVtYXBzCiAgICAgICAgICAgIC0gQnVnICMxMzk4Mzk0ICB3aXRoIHBhdGNoIGZyb20gRHJpZXMgRGVjb2NrCgowMS8wNi8yMDA2OiBtbWF0dXMKCSAgICBBZGQgJ25hbWVkJyB3YXJuaW5nIGNvZGVzLCBub3cgaW4gYWRkaXRpb24gdG86CgkgICAgCgkgICAgICAld2FybmZpbHRlcig4MTMpOwoJICAgCgkgICAgeW91IGNhbiB1c2UKCgkgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9KQVZBX01VTFRJUExFX0lOSEVSSVRBTkNFKTsKCgkgICAganVzdCB1c2UgdGhlIHNhbWUgY29kZSBuYW1lIGZvdW5kIGluICBTb3VyY2UvSW5jbHVkZS9zd2lnd2Fybi5oIAoJICAgIHBsdXMgdGhlICdTV0lHJyBwcmVmaXguCgoJICAgIElmIGEgZGV2ZWxvcGVyIGFkZHMgYSBuZXcgd2FybmluZyBjb2RlLCB0aGUgTGliL3N3aWd3YXJuLnN3ZyBmaWxlCiAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gcnVubmluZyB0aGUgdG9wIGxldmVsIG1ha2UuCgowMS8wNS8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgUmVpbXBsZW1lbnRlZCBvYmplY3QgdHJhY2tpbmcgZm9yIFJ1YnkuICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIHdvcmtzCgkgICAgYnkgZXhwYW5kaW5nIHRoZSBzd2lnX2NsYXNzIHN0cnVjdHVyZSBmb3IgUnVieSBieSBhZGRpbmcgYSB0cmFja09iamVjdHMKCSAgICBmaWVsZC4gIFRoaXMgZmllbGQgY2FuIGJlIHNldC91bnNldCB2aWEgJXRyYWNrb2JqZWN0cyBhcyBleHBsYWluZWQKCSAgICBpbiB0aGUgUnVieSBkb2N1bWVudGF0aW9uLiAgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBpcyBtb3JlIHJvYnVzdAoJICAgIGFuZCB0YWtlcyBsZXNzIGNvZGUgdG8gaW1wbGVtZW50LgoJCQowMS8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVleHRlbmQgYW5kIHN0YXRpYyBjb25zdCBpbnRlZ3JhbCB0eXBlcywgZWc6CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGJhciA9IDQyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07IAoKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBpbmZvIGZvciBvbGQgYW5kIG5ldyBkZWJ1ZyBvcHRpb25zOgogICAgICAgICAgICAgIAogICAgICAgICAgICAtZHVtcF90b3AgICAgICAgLSBQcmludCBpbmZvcm1hdGlvbiBvZiB0aGUgZW50aXJlIG5vZGUgdHJlZSwgaW5jbHVkaW5nIHN5c3RlbSBub2RlcyAgICAKICAgICAJICAgIC1kdW1wX21vZHVsZSAgICAtIFByaW50IGluZm9ybWF0aW9uIG9mIHRoZSBtb2R1bGUgbm9kZSB0cmVlLCBhdm9pZGluZyBzeXN0ZW0gbm9kZXMgICAgIAogICAgIAkgICAgLWR1bXBfY2xhc3NlcyAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzZXMgZm91bmQgaW4gdGhlIGludGVyZmFjZQkgICAgICAgCiAgICAgCSAgICAtZHVtcF90eXBlZGVmICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZXMgYW5kIHR5cGVkZWZzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UKICAgICAJICAgIC1kdW1wX3RhZ3MgICAgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YWdzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UJICAgICAgIAogICAgIAkgICAgLWRlYnVnX3R5cGVtYXAgIC0gUHJpbnQgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZyB0eXBlbWFwcwkJCSAgICAgICAKICAgICAgICAgICAgLWRlYnVnX3RlbXBsYXRlIC0gUHJpbnQgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZyB0ZW1wbGF0ZXMJCQkgICAgICAgIAoKCSAgLSBBZGQgdGhlIGZha2V2ZXJzaW9uLiBJZiB5b3UgaGF2ZSBhIHByb2plY3QgdGhhdCB1c2VzCiAgICAgICAgICAgIGNvbmZpZ3VyZS9zZXR1cC5weSwgb3IgYW5vdGhlciBhdXRvbWF0aWMgYnVpbGRpbmcgc3lzdGVtCiAgICAgICAgICAgIGFuZCByZXF1aXJlcyBhIHNwZWNpZmljIHN3aWcgdmVyc2lvbiwgbGV0IHNheSAxLjMuMjIgCgkgICAgeW91IGNhbiB1c2U6CgoJICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1mYWtldmVyc2lvbiAxLjMuMjIiCgoJICAgICBvcgogCiAgICAgICAgICAgICAgIHN3aWcgLWZha2V2ZXJzaW9uIDEuMy4yMgoKICAgICAgICAgICAgIGFuZCB0aGVuIHN3aWcgLXZlcnNpb24gd2lsbCByZXBvcnQgMS4zLjIyIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgICBjdXJyZW50IHZlcnNpb24uCgoJICAgICBUeXBpY2FsIHVzZSB3b3VsZCBiZQoKCSAgICAgICBTV0lHX0ZFQVRVUkVTPSItZmFrZXZlcnNpb24gMS4zLjIyIiAuL2NvbmZpZ3VyZSAJICAgICAKCjEyLzMwLzIwMDU6IG1tYXR1cwoKCSAgLSBBZGQgb3B0aW9uL2Zvcm1hdCBzdXBwb3J0IHRvICVyZW5hbWUgYW5kICVuYW1ld2Fybi4JCgkgICAgTm93ICVuYW1ld2FybiBjYW4gZm9yY2UgcmVuYW1pbmcsIGZvciBleGFtcGxlOgoKCSAgICAgICVuYW1ld2FybigiMzE0OiBpbXBvcnQgaXMgYSBrZXl3b3JkIixyZW5hbWU9Il8lcyIpICJpbXBvcnQiOwoJICAgIAoJICAgIGFuZCByZW5hbWUgY2FuIGFsc28gc3VwcG9ydCBmb3JtYXQgZm9ybXM6CgoJICAgICAgICVyZW5hbWUoInN3aWdfJXMiKSBpbXBvcnQ7CgoJICAgIE5vdywgc2luY2UgdGhlIGZvcm1hdCBpcyBwcm9jZXNzZWQgdmlhIHN3aWcgUHJpbnRmLCB5b3UKCSAgICBjYW4gdXNlIGVuY29kZXJzIGFzIGZvbGxvd3M6CgoJICAgICAgICVyZW5hbWUoIiUodGl0bGUpcyIpICBpbXBvcnQ7ICAgICAtPiBJbXBvcnQKCSAgICAgICAlcmVuYW1lKCIlKHVwcGVyKXMiKSAgaW1wb3J0OyAgICAgLT4gSU1QT1JUCgkgICAgICAgJXJlbmFtZSgiJShsb3dlcilzIikgIEltcG9ydDsgICAgIC0+IGltcG9ydAoJICAgICAgICVyZW5hbWUoIiUoY3RpdGxlKXMiKSBjYW1lbF9jYXNlOyAtPiBDYW1lbENhc2UKCSAgICAgICAKCSAgICBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gYWRkIG1vcmUgZW5jb2RlcnMsIGFzIHRoZSAKCSAgICBleHBlY3RlZCBvbmUgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIAoKCSAgLSBBZGQgdGhlIGFib3ZlICdjdGl0bGUnIGVuY29kZXIsIHdoaWNoIGRvZXMgdGhlIGNhbWVsIGNhc2U6CgoJICAgICAgICBjYW1lbF9jYXNlIC0+IENhbWVsQ2FzZQogIAoJICAtIEFsc28sIHdoaWxlIHdlIGdldCB0aGUgcmVnZXhwIHN1cHBvcnQsIGFkZCB0aGUgJ2NvbW1hbmQnIGVuY29kZXIsCiAgICAgICAgICAgIHlvdSBjYW4gdXNlIGl0IGFzIGZvbGxvd3MKCiAgICAgICAgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDpzZWQgLWUgJ3MvXChbYS16XVwpL1xVXFwxLycgPDw8IClzIikgaW1wb3J0OyAKCgkgICAgdGhlbiBzd2lnIHdpbGwgcG9wZW4gdGhlIGNvbW1hbmQKCSAgICAKCQkic2VkIC1lICdzL1woW2Etel1cKS9cVVxcMS8nIDw8PCBpbXBvcnQiCgkJCiAgICAgICAgICAgIHNlZSBiZWxvdyBmb3IgYW5vbnltb3VzIHJlbmFtZXMgZm9yIGJldHRlciBleGFtcGxlcy4JCQoKICAgICAgICAgIC0gVGhlIHJlbmFtZSBkaXJlY3RpdmUgbm93IGFsc28gYWxsb3dzOgoKCSAgICAtIHNpbXBsZSBtYXRjaDogb25seSBhcHBseSB0aGUgcmVuYW1lIGlmIGEgdHlwZSBtYXRjaAoJICAgICAgaGFwcGVuLCBmb3IgZXhhbXBsZQoKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2g9ImVudW1pdGVtIikgaGVsbG87CgoJCSBlbnVtIEhlbGxvIHsKCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gIAoJCSB9OwoJCSBpbnQgaGVsbG8oKSAgLT4gIGhlbGxvOyAKCgkgICAgLSBleHRlbmRlZCBtYXRjaDogb25seSBhcHBseSB0aGUgcmVuYW1lIGlmIHRoZSAnZXh0ZW5kZWQgYXR0cmlidXRlJyBtYXRjaAoJICAgICAgb2NjdXJyZWQsIGZvciBleGFtcGxlOiAKCgkgICAgICAgICAvLyBzYW1lIGFzIHNpbXBsZSBtYXRjaCAJCQoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRub2RlVHlwZT0iZW51bWl0ZW0iKSBoZWxsbzsgCgoJCSBlbnVtIEhlbGxvIHsKCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gIAoJCSB9OwoKCSAgICAgICBOb3RlIHRoYXQgdGhlIHN5bWJvbCAnJCcgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGluCgkgICAgICAgYSAncmVjdXJzaXZlJyB3YXksIGZvciBleGFtcGxlOgoKCQkgLy8gbWF0Y2ggb25seSBoZWxsbyBpbiAnZW51bSBIZWxsbycKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkcGFyZW50Tm9kZSR0eXBlPSJlbnVtIEhlbGxvIikgaGVsbG87IAoKCQkgZW51bSBIZWxsbyB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgIC8vIG1hdGNoCgkJIH07CgoJCSBlbnVtIEhpIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIGhlbGxvICAgLy8gbm8gbWF0Y2gKCQkgfTsKCiAgICAgICAgICAgICAgIGhlcmUsIGZvciBIZWxsbzo6aGksIHRoZSAicGFyZW50Tm9kZSIgaXMgIkhlbGxvIiwgYW5kIGl0cyAidHlwZSIKICAgICAgICAgICAgICAgaXMgImVudW0gSGVsbG8iLgoJICAgICAgIAoJICAgICAgIAogICAgICAgICAgICAtIEFub255bW91cyByZW5hbWVzOiB5b3UgY2FuIHVzZSAnYW5vbnltb3VzJyByZW5hbWUgZGlyZWN0aXZlcywgZm9yIGV4YW1wbGU6IAoKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGVudW0gaXRlbXMgaW4gSGVsbG8KCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkcGFyZW50Tm9kZSR0eXBlPSJlbnVtIEhlbGxvIikgIiI7IAoKCQkgZW51bSBIZWxsbyB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIEhpLCBIZWxsbyAgIC8vIG1hdGNoIGJvdGgKCQkgfTsKCgkJIGVudW0gSGkgewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgaGVsbG8gICAvLyBubyBtYXRjaAoJCSB9OwoJCSAKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGVudW0gaXRlbXMgCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJG5vZGVUeXBlPSJlbnVtaXRlbSIpICIiOyAKCgkgICAgICAgICAvLyByZW5hbWUgYWxsIHRoZSBpdGVtcyBpbiBnaXZlbiBjb21tYW5kIChzbG9vb293LCBidXQuLi4pCgkJICVyZW5hbWUoJShjb21tYW5kOjxteSBleHRlcm5hbCBjbWQ+KXMpICIiOyAKCgkKCSAgICAgIEFub255bW91cyByZW5hbWVzIHdpdGggY29tbWFuZHMgY2FuIGJlIHZlcnkgcG93ZXJmdWwsIHNpbmNlIHlvdQoJICAgICAgY2FuICdvdXRzb3VyY2UnIGFsbCB0aGUgcmVuYW1pbmcgbWVjaGFuaXNtIChvciBwYXJ0IG9mIGl0KSB0byBhbgoJICAgICAgZXh0ZXJuYWwgcHJvZ3JhbToKCSAgICAgIAoJICAgICAgICAvLyBVcHBlcmNhc2UgYWxsIChhbmQgb25seSkgdGhlIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCAnaScKCSAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOmF3ayAnL15pL3twcmludCB0b3VwcGVyKCQxKX0nIDw8PClzIikgIiI7ICAgCgkgICAgICAgCgkgICAgICAgIGludCBpbXBvcnRlZCgpIC0+IElNUE9SVEVEOwoJICAgICAgICBpbnQgaGVsbG8oKSAgICAtPiBoZWxsbwoKCSAgICAgIE5vdGUgdGhhdCBpZiB0aGUgJ2NvbW1hbmQnIGVuY29kZXIgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsIHN3aWcKCSAgICAgIHVuZGVyc3RhbmRzIHRoYXQgbm8gcmVuYW1lIGlzIG5lY2Vzc2FyeS4KCgkgICAgICBBbHNvIG5vdGUgdGhhdCAlcmVuYW1lICdwYXNzZXMnIHRoZSBtYXRjaGVkIG5hbWUuIEZvciBleGFtcGxlLCBpbgoJICAgICAgdGhpcyBjYXNlCgoJICAgICAgICBuYW1lc3BhY2UgbnMxIHsKCQkgIGludCBmb28oKTsKCQl9CgoJICAgICAgICBuYW1lc3BhY2UgbnMyIHsKCQkgIGludCBiYXIoKTsKCQl9CgoJICAgICAgdGhlIGV4dGVybmFsIHByb2dyYW0gb25seSByZWNlaXZlcyAiZm9vIiBhbmQgImJhciIuIElmIG5lZWRlZCwKCSAgICAgIGhvd2V2ZXIsIHlvdSBjYW4gcmVxdWVzdCB0aGUgJ2Z1bGxuYW1lJyAKCSAgICAgICAJCgkgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDphd2sgJ2F3ayAnL25zMTo6L3tsPXNwbGl0KCQxLGEsIjo6Iik7IHByaW50IHRvdXBwZXIoYVtsXSl9JycgPDw8KXMiLGZ1bGxuYW1lPTEpICIiOyAgIAogICAgICAgICAgICAgICAgCgkJbnMxOjpmb28gLT4gRk9PCgkJbnMyOjpiYXIgLT4gYmFyCQoJCgkgICAgLSBNaXhpbmcgZW5jb2RlcnMgYW5kIG1hdGNoaW5nOiBvZiBjb3Vyc2UsIHlvdSBjYW4gZG8gbWl4IGNvbW1hbmRzCgkgICAgICBhbmQgbWF0Y2ggZmllbGRzLCBmb3IgZXhhbXBsZToKCgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGZuY3M+KSIsbWF0Y2g9ImNkZWNsIikgIiI7CgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGVudW1zPikiLG1hdGNoPSJlbnVtaXRlbSIpICIiOwoJICAgICAgICAlcmVuYW1lKCIlKDxteSBlbmNvZGVyIGZvciBlbnVtcyBpbnNpZGUgYSBjbGFzcz4pIixtYXRjaD0iZW51bWl0ZW0iLAoJCSAgICAgICAgbWF0Y2gkcGFyZW50Tm9kZSRwYXJlbnROb2RlJG5vZGVUeXBlPSJjbGFzcyIpICIiOwoJCQoJICAgICAgVXNlICJzd2lnIC1kdW1wX3BhcnNlX21vZHVsZSIgdG8gc2VlIHRoZSBhdHRyaWJ1dGUgbmFtZXMgeW91IGNhbiB1c2UgdG8KCSAgICAgIG1hdGNoIGEgc3BlY2lmaWMgY2FzZS4KCQogICAgICAgICAgICAtICdzb3VyY2VmbXQnIGFuZCAndGFyZ2V0Zm10Jzogc29tZXRpbWVzIHlvdSBuZWVkIHRvCiAgICAgICAgICAgICAgcHJvY2VzcyB0aGUgJ3NvdXJjZScgbmFtZSBiZWZvcmUgY29tcGFyaW5nLCBmb3IgZXhhbXBsZQoKCSAgICAgICAgJW5hbWV3YXJuKCIzMTQ6IGVtcHR5IGlzIGEga2V5d29yZCIsc291cmNlZm10PSIlKGxvd2VyKXMiKSAiZW1wdHkiOwoKCSAgICAgIHRoZW4gaWYgeW91IGhhdmUKCgkgICAgICAgIGludCBFbXB0eSgpOyAgLy8gIkVtcHR5IiBpcyB0aGUgc291cmNlIAoJCQoJICAgICAgeW91IHdpbGwgZ2V0IHRoZSBrZXl3b3JkIHdhcm5pbmcgc2luY2UgJ0VtcHR5JyB3aWxsIGJlCgkgICAgICBsb3dlciBjYXNlZCwgdmlhIHRoZSBzb3VyY2VmbXQ9IiUobG93ZXIpcyIgb3B0aW9uLAoJICAgICAgYmVmb3JlIGJlZW4gY29tcGFyZWQgdG8gdGhlICd0YXJnZXQnICJlbXB0eSIuCgoJICAgICAgVGhlcmUgaXMgYW4gYWRkaXRpb25hbCAndGFyZ2V0Zm10JyBvcHRpb24gdG8gcHJvY2VzcyB0aGUKCSAgICAgICd0YXJnZXQnIGJlZm9yZSBjb21wYXJpbmcuCgoJICAgIC0gY29tcGxlbWVudGluZyAnbWF0Y2gnOiB5b3UgY2FuIHVzZSAnbm90bWF0Y2gnLCBmb3IgZXhhbXBsZQoJICAgICAgCgkgICAgICAgICVuYW1ld2FybigiMzE0OiBlbXB0eSBpcyBhIGtleXdvcmQiLHNvdXJjZWZtdD0iJShsb3dlcilzIixub3RtYXRjaD0ibmFtZXNwYWNlIikgImVtcHR5IjsKCgkgICAgICBoZXJlLCB0aGUgbmFtZSB3YXJuaW5nIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgdGhlIHN5bWJvbHMgZXhjZXB0IG5hbWVzcGFjZXMuCgkgICAgCiAgICAgIAkKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIGdjaiBhbmQgSmF2YSAtPiA8dGFyZ2V0IGxhbmd1YWdlPiBtZWNoYW5pc20uCgoJICAgIFNlZQlleGFtcGxlcyBpbjogIAoJICAKCQlFeGFtcGxlcy9weXRob24vamF2YQoJCUV4YW1wbGVzL3J1YnkvamF2YQoJCUV4YW1wbGVzL3RjbC9qYXZhCgogICAgICAgICAgICB0byBzZWUgaG93IHRvIHVzZSBnY2orc3dpZyB0byBleHBvcnQgamF2YSBjbGFzc2VzIGludG8KICAgICAgICAgICAgcHl0aG9uL3J1YnkvdGNsLgoJICAgIAoJICAgIFRoZSBpZGVhIGlzIHRvIHB1dCBhbGwgdGhlIGNvbW1vbiBjb2RlIGZvciBnY2ogaW5zaWRlCgoJICAgICAgICAgIExpYi9nY2oKCiAgICAgICAgICAgIGFuZCBsb2NhbGl6ZSBzcGVjaWZpYyB0eXBlcyBzdWNoIGFzIGpzdHJpbmcsIGFzIGNhbiBiZSBmb3VuZAogICAgICAgICAgICBpbgoKCSAgICAgICAgIExpYi9weXRob24vanN0cmluZy5pCgkgICAgICAgICBMaWIvcnVieS9qc3RyaW5nLmkKCSAgICAgICAgIExpYi90Y2wvanN0cmluZy5pCgogICAgICAgICAgICBVc2luZyB0aGUgVVRMLCB0aGlzIGlzIHZlcnkgZWFzeSwgYW5kIHRoZSBwZXJsIHZlcnNpb24gZm9yCiAgICAgICAgICAgIGpzdHJpbmcuaSB3aWxsIGJlIG5leHQuCgkJIAkgICAgCgoxMi8yOS8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlIGNvcHljdG9yIGZlYXR1cmUvZGlyZWN0aXZlL29wdGlvbiB0byBlbmFibGUgdGhlIGF1dG9tYXRpYwoJICAgIGdlbmVyYXRpb24gb2YgY29weSBjb25zdHJ1Y3RvcnMuIFVzZSBhcyBpbjoKCgkgICAgICAlY29weWN0b3IgQTsKCgkgICAgICBzdHJ1Y3QgQSB7CgogICAgICAgICAgICAgIH07CgoJICAgIHRoZW4gdGhpcyB3aWxsIHdvcmsKCgkgICAgICBhMSA9IEEoKTsKCSAgICAgIGEyID0gQShhMSk7CgoJICAgIEFsc28sIHNpbmNlIGl0IGlzIGEgZmVhdHVyZSwgaWYgeW91IGp1c3QgdHlwZQoKCSAgICAgICVjb3B5Y3RvcjsKCgkgICAgdGhhdCB3aWxsICBlbmFibGUgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIGZvciBhbGwgdGhlCgkgICAgY2xhc3Nlcy4gSXQgaXMgYWxzbyBlcXVpdmFsZW50IHRvCgoJICAgICAgIHN3aWcgLWNvcHljdG9yIC1jKysgLi4uCgoJICAgIE5vdGVzOiAKCgkgICAgMS4tIFRoZSBmZWF0dXJlIG9ubHkgd29ya3MgaW4gQysrIG1vZGUuCgoJICAgIDIuLSBUaGUgYXV0b21hdGljIGNyZWF0aW9uIG9mIHRoZSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwKCSAgICAgICAgdXN1YWxseSBwcm9kdWNlIG92ZXJsb2FkaW5nLiBIZW5jZSwgaWYgdGhlIHRhcmdldAoJICAgICAgICBsYW5ndWFnZSBkb2Vzbid0IHN1cHBvcnQgb3ZlcmxvYWRpbmcsIGEgc3BlY2lhbCBuYW1lCgkgICAgICAgIHdpbGwgYmUgdXNlZCAoQV9jb3B5KS4KCSAgICAKCSAgICAzLi0gRm9yIHRoZSBvdmVybG9hZGluZyByZWFzb25zIGFib3ZlLCBpdCBpcyBwcm9iYWJseSBub3QKICAgICAgICAgICAgICAgIGEgZ29vZCBpZGVhIHRvIHVzZSB0aGUgZmxhZyB3aGVuLCBmb3IgZXhhbXBsZSwgeW91IGFyZQoJCXVzaW5nIGtleXdvcmRzIGluIFB5dGhvbi4KCiAgICAgICAgICAgIDQuLSBUaGUgY29weWN0b3IgYXV0b21hdGljIG1lY2hhbmlzbSBmb2xsb3dzIG1vcmUgb3IgbGVzcwoJICAgICAgICB0aGUgc2FtZSBydWxlcyBhcyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBtZWNoYW5pc20sCgkgICAgICAgIGkuZS4sIGEgY29weSBjb25zdHJ1Y3RvciB3aWxsIG5vdCBiZSBhZGRlZCBpZiB0aGUKCSAgICAgICAgY2xhc3MgaXMgYWJzdHJhY3Qgb3IgaWYgdGhlcmUgaXMgYSBwZXJ0aW5lbnQgbm9uLXB1YmxpYyAKCQljb3B5IGN0b3IgaW4gdGhlIGNsYXNzIG9yIGl0cyBoaWVyYXJjaHkuCgoJCUhlbmNlLCBpdCBtaWdodCBiZSBuZWNlc3NhcnkgZm9yIHlvdSB0byBjb21wbGV0ZSB0aGUKCQljbGFzcyBkZWNsYXJhdGlvbiB3aXRoIHRoZSBwcm9wZXIgbm9uLXB1YmxpYyBjb3B5IGN0b3IKCQl0byBhdm9pZCBhIHdyb25nIGNvbnN0cnVjdG9yIGFkZGl0aW9uLgoJCQogICAgICAgICAgLSBGaXggZmVhdHVyZXMvcmVuYW1lIGZvciB0ZW1wbGF0ZXMgY3Rvci9kdG9yIGFuZCBvdGhlcgogICAgICAgICAgICB0aGluZ3MgYXJvdW5kIHdoaWxlIGFkZGluZyB0aGUgY29weWN0b3IgbWVjaGFuaXNtLgoJICAgIAoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSAnbWF0Y2gnIG9wdGlvbiB0byB0eXBlbWFwcy4gQXNzdW1lIHlvdSBoYXZlOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqIChpbnQgcmVzKSB7Li59CgkgICAgICAldHlwZW1hcChmcmVlYXJnKSBTV0lHVFlQRSAqIHsgaWYgKHJlcyRhcmdudW0pIC4uLn0KCgkgICAgdGhlbiBpZiB5b3UgZG8KIAoJICAgICAgJXR5cGVtYXAoaW4pIEEgKiB7Li4ufQoKCSAgICBzd2lnIHdpbGwgJ292ZXJsb2FkIHRoZSAnaW4nIHR5cGVtYXAsIGJ1dCB0aGUgJ2ZyZWVhcmcnIAoJICAgIHR5cGVtYXAgd2lsbCBiZSBhbHNvIGFwcGxpZWQsIGV2ZW4gd2hlbiB0aGlzIGlzIHdyb25nLiBUaGUgb2xkCgkgICAgc29sdXRpb25zIGlzIHRvIHdyaXRlOgoKCSAgICAgICV0eXBlbWFwKGluKSBBICogey4uLn0KICAJICAgICAgJXR5cGVtYXAoZnJlZWFnKSBBICogIiI7CgoJICAgIG92ZXJsb2FkICdmcmVlYXJnJyB3aXRoIGFuIGVtcHR5IGRlZmluaXRpb24uCgoJICAgIFRoZSBwcm9ibGVtIGlzLCBob3dldmVyLCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB5b3UgbmVlZAoJICAgIHRvIGRvIHRoYXQgdW50aWwgeW91IHN0YXJ0IGdldHRpbmcgYnJva2VuIEMrKyBjb2RlLCBvcgoJICAgIHdvcnNlLCBicm9rZW4gcnVudGltZSBjb2RlLgoKCSAgICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBpbmZhbW91cyAndHlwZWNoZWNrJyB0eXBlbWFwLAoJICAgIHdoaWNoIGFsd2F5cyBjb25mdXNlcyBwZW9wbGUsIHNpbmNlIHRoZSBmaXJzdCB0aGluZyB5b3UgZG8KCSAgICBpcyB0byBqdXN0IHdyaXRlIHRoZSAnaW4nIHR5cGVtYXAuCgoJICAgIFRoZSAnbWF0Y2gnIG9wdGlvbiBzb2x2ZXMgdGhlIHByb2JsZW0sIGFuZCBpZiBpbnN0ZWFkIHlvdSB3cml0ZToKCgkgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAoaW50IHJlcykgey4ufQoJICAgICAgJXR5cGVtYXAoZnJlZWFyZyxtYXRjaD0iaW4iKSBTV0lHVFlQRSAqIHsgaWYgKHJlcyRhcmdudW0pIC4uLn0KCSAgICAgICV0eXBlbWFwKHR5cGVjaGVjayxtYXRjaD0iaW4iLHByZWNlZGVuY2UuLi4pIFNXSUdUWVBFICogey4uLn0KCSAgICAKCSAgICBpdCB3aWxsIHRlbGwgc3dpZyB0byBhcHBseSB0aGUgJ2ZyZWVhcmcvdHlwZWNoZWNrJwoJICAgIHR5cGVtYXBzIG9ubHkgaWYgdGhleSAnbWF0Y2gnIHRoZSB0eXBlIG9mIHRoZSAnaW4nCgkgICAgdHlwZW1hcC4gVGhlIHNhbWUgY2FuIGJlIGRvbmUgd2l0aCBvdGhlciB0eXBlbWFwcyBhczoKCgkgICAgICAldHlwZW1hcChkaXJlY3Rvcm91dCkgU1dJR1RZUEUgKiB7Li4ufQoJICAgICAgJXR5cGVtYXAoZGlyZWN0b3JmcmVlLG1hdGNoPSJkaXJlY3Rvcm91dCIpIFNXSUdUWVBFICogey4uLn0KCSAgICAKCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgJ25hdHVyYWx2YXInIG9wdGlvbi9tb2RlL2ZlYXR1cmUgdG8gdHJlYXQgbWVtYmVyCgkgICAgdmFyaWFibGVzIGluIGEgbW9yZSBuYXR1cmFsIHdheSwgaWUsIHNpbWlsYXIgdG8gdGhlIGdsb2JhbAoJICAgIHZhcmlhYmxlIGJlaGF2aW9yLgoKCSAgICBZb3UgY2FuIHVzZSBpdCBpbiBhIGdsb2JhbCB3YXkgdmlhIHRoZSBjb21tYW5kIGxpbmUKCgkgICAgICBzd2lnIC1uYXR1cmFsdmFyIC4uLgoKCSAgICBvciB0aGUgbW9kdWxlIG1vZGUgb3B0aW9uCiAKCSAgICAgICVtb2R1bGUobmF0dXJhbHZhcj0xKQoKCSAgICBib3RoIGZvcm1zIG1ha2Ugc3dpZyB0cmVhdCBhbGwgdGhlIG1lbWJlciB2YXJpYWJsZXMgaW4gdGhlCgkgICAgc2FtZSB3YXkgaXQgdHJlYXRzIGdsb2JhbCB2YXJpYWJsZXMuIAoKCSAgICBBbHNvLCB5b3UgY2FuIHVzZSBpdCBpbiBhIGNhc2UgYnkgY2FzZSBhcHByb2FjaCBmb3IKCSAgICBzcGVjaWZpYyBtZW1iZXIgdmFyaWFibGVzIHVzaW5nIHRoZSBkaXJlY3RpdmUgZm9ybToKCgkgICAgICAlbmF0dXJhbHZhciBCYXI6OnM7CgkgICAgCgkgICAgVGhlbiwgaW4gdGhlIGZvbGxvd2luZyBjYXNlIGZvciBleGFtcGxlOgoKCSAgICAgICBzdGQ6OnN0cmluZyBzOwoJICAgICAgIHN0cnVjdCBCYXIgewoJCSBzdGQ6OnN0cmluZyBzOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgeW91IGNhbiBkbzogIAoKCSAgICAgICBiID0gQmFyKCkKCSAgICAgICBiLnMgPSJoZWxsbyIKCSAgICAgICBjdmFyLnMgPSAiaGVsbG8iCgkgICAgICAgCgkgICAgICAgaWYgKGIucyAhPSBjdmFyLnMpOgoJICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgoKCQkgIAogICAgICAgICAgICBUaGlzIGlzIHZhbGlkIGZvciBhbGwgdGhlIGxhbmd1YWdlcywgYW5kIHRoZQogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBmb3JjaW5nIHRoZSB1c2Ugb2YgdGhlIAogICAgICAgICAgICBjb25zdCBTV0lHVFlQRSYgKEMrKykvU1dJR1RZUEUgKEMpIHR5cGVtYXBzIGZvciB0aGUKICAgICAgICAgICAgZ2V0L3NldCBtZXRob2RzIGluc3RlYWQgb2YgdGhlIFNXSUdUWVBFICogdHlwZW1hcHMuCgkgICAgSGVuY2UsIGZvciAnbmF0dXJhbHZhcicgdG8gd29yaywgZWFjaCB0YXJnZXQgbGFuZ3VhZ2UKCSAgICBtdXN0IGltcGxlbWVudCAndHlwZW1hcChpbi9vdXQpIGNvbnN0IFR5cGUmJyBwcm9wZXJseS4KCgkgICAgVGhlICduYXR1cmFsdmFyJyBvcHRpb24gcmVwbGFjZXMgb3IgbWFrZXMgd29ya2Fyb3VuZHMgc3VjaCAgYXM6CgkgICAgCgkJJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqfQoKICAgICAgICAgICAgdW5uZWNlc3NhcnkuCgoJICAgIE5vdGUxOiBJZiB5b3VyIGludGVyZmFjZSBoYXMgb3RoZXIga2luZHMgb2Ygd29ya2Fyb3VuZHMgdG8KCSAgICBkZWFsIHdpdGggdGhlIG9sZCAndW5uYXR1cmFsJyB3YXkgdG8gZGVhbCB3aXRoIG1lbWJlcgoJICAgIHZhcmlhYmxlcyAocmV0dXJuaW5nL2V4cGVjdGluZyBwb2ludGVycyksIHRoZQoJICAgICduYXR1cmFsdmFyJyBvcHRpb24gY291bGQgYnJlYWsgdGhlbS4KCSAgICAKCSAgICBOb3RlMjogdGhlIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHVubmFtZWQgdHlwZXMsIHN1Y2gKCSAgICBhcyB1bm5hbWVkIG5lc3RlZCB1bmlvbnMuCgkgICAgCgkgIAoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgbW9yZSAnZXhwcmVzc2l2ZScgcmVzdWx0IHN0YXRlcyBmb3IgdGhlIHR5cGVtYXAKICAgICAgICAgICAgbGlicmFyaWVzLgoKCSAgICBJbiB0aGUgcGFzdCwgZm9yIHNjcmlwdGluZyBsYW5ndWFnZXMsIHlvdSB3b3VsZCBkbyBjaGVja2luZyBzb21ldGhpbmcgbGlrZToKCgkgICAgICBpZiAoQ29udmVydFB0cihvYmosJnZwdHIsdHksZmxhZ3MpICE9IC0xKSB7CgkgICAgICAgIC8vIHN1Y2Nlc3MKICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAvLyBlcnJvcgoJICAgICAgfQoKCSAgICBOb3cgdGhlIHJlc3VsdCBzdGF0ZSBjYW4gY2FycnkgbW9yZSBpbmZvcm1hdGlvbiwKCSAgICBpbmNsdWRpbmc6CgoJICAgICAgLSBFcnJvciBzdGF0ZTogbGlrZSB0aGUgb2xkIC0xLzAsIGJ1dCB3aXRoIGVycm9yIGNvZGVzIGZyb20gc3dpZ2Vycm9ycy5zd2cuCgoJICAgICAgICAgaW50IHJlcyA9IENvbnZlcnRQdHIob2JqLCZ2cHRyLHR5LGZsYWdzKTsKCQkgaWYgKFNXSUdfSXNPSyhyZXMpKSB7CgkJICAgLy8gc3VjY2VzcyBjb2RlCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCQkgICBTV0lHX0Vycm9yKHJlcyk7IC8vIHJlcyBjYXJyaWVzIHRoZSBlcnJvciBjb2RlCiAgICAgICAgICAgICAgICAgfQoKCSAgICAgIC0gQ2FzdCByYW5rOiB3aGVuIHJldHVybmluZyBhIHNpbXBsZSBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICBjb252ZXJzaW9uLCB5b3UganVzdCByZXR1cm4gU1dJR19PSywgYnV0IGlmIHlvdSBuZWVkCiAgICAgICAgICAgICAgICB0byBkbyBhICdjYXN0JywgeW91IGNhbiBhZGQgdGhlIGNhc3RpbmcgcmFuaywgaWU6CgkJCgkJICBpZiAoUHlGbG9hdF9DaGVjayhvYmopKSB7CgkJICAgIHZhbHVlID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOwoJCSAgICByZXR1cm4gU1dJR19PSzsKCQkgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2sob2JqKSkgewoJCSAgICB2YWx1ZSA9IChkb3VibGUpIFB5SW50X0FzTG9uZyhvYmopOwoJCSAgICByZXR1cm4gU1dJR19BZGRDYXN0KFNXSUdfT0spOwkJICAgIAogICAgICAgICAgICAgICAgICB9CgkJCgkJbGF0ZXIsIHRoZSBjYXN0aW5nIHJhbmsgaXMgdXNlZCB0byBwcm9wZXJseSBkaXNwYXRjaAoJCXRoZSBvdmVybG9hZGVkIGZ1bmN0aW9uLCBmb3IgZXhhbXBsZS4gVGhpcyBvZiBjb3Vyc2UKCQlyZXF1aXJlcyB5b3VyIGxhbmd1YWdlIHRvIHN1cHBvcnQgYW5kIHVzZSB0aGUgbmV3CgkJZGlzcGF0Y2ggY2FzdC9yYW5rIG1lY2hhbmlzbSAoTm93IG1haW5seSBzdXBwb3J0ZWQgaW4KCQlwZXJsIGFuZCBweXRob24sIGFuZCBlYXNpbHkgZXhwYW5kYWJsZSB0byBydWJ5IGFuZCB0Y2wpLgoJICAgICAgCgkgIC0gW1VUTF0gQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXcgJ2V4cHJlc3NpdmUnIHJlc3VsdCBzdGF0ZXMuCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlIEMrKyBpbXBsaWNpdCBjb252ZXJzaW9uIG1lY2hhbmlzbSwgd2hpY2gKICAgICAgICAgICAgcmVxdWlyZWQgc29tZSBtb2RpZmljYXRpb25zIGluIHBhcnNlci55ICh0byByZWNvZ25pemUKICAgICAgICAgICAgJ2V4cGxpY2l0JykgYW5kIG92ZXJsb2FkLmN4eCAodG8gcmVwbGFjZSAkaW1wbGljaXRjb252IGFzCiAgICAgICAgICAgIG5lZWRlZCkuCgkgICAgCgkgICAgU3RpbGwsIHJlYWwgc3VwcG9ydCBpbiBlYWNoIHRhcmdldCBsYW5ndWFnZSByZXF1aXJlcyBlYWNoCgkgICAgdGFyZ2V0IGxhbmd1YWdlIHRvIGJlIG1vZGlmaWVkLiBQeXRob24gcHJvdmlkZXMgYW4gZXhhbXBsZSwKICAgICAgICAgICAgc2VlIGJlbG93LgoKCgkgIC0gQWRkIHN1cHBvcnQgZm9yIG5hdGl2ZSBDKysgaW1wbGljaXQgY29udmVyc2lvbnMsIGllLCBpZiB5b3UKICAgICAgICAgICAgaGF2ZQoKCSAgICAgICAgJWltcGxpY2l0Y29udiBBOwoKCSAgICAgICAgc3RydWN0IEEgewoJCSAgIGludCBpaTsKCQkgICBBKCkge2lpID0gMTt9CgkJICAgQShpbnQpIHtpaSA9IDI7fQoJCSAgIEEoZG91YmxlKSB7aWkgPSAzO30KCQkgICBleHBsaWNpdCBBKGNoYXIgKnMpIHtpaSA9IDQ7fQoJCX07CgkJCgkJaW50IGdldChjb25zdCBBJiBhKSB7cmV0dXJuIGEuaWk7fQoKICAgICAgICAgICAgeW91IGNhbiBjYWxsOgoKCSAgICAgICAgYSA9IEEoKQoJICAgICAgICBhaSA9IEEoMSkKCSAgICAgICAgYWQgPSBBKDEuMCkKCSAgICAgICAgYXMgPSBBKCJoZWxsbyIpCgkJCgkJIyBvbGQgZm9ybXMKCSAgICAgICAgZ2V0KGEpICAtPiAxCgkgICAgICAgIGdldChhaSkgLT4gMgoJICAgICAgICBnZXQoYWQpIC0+IDMKCSAgICAgICAgZ2V0KGFzKSAtPiA0CgkJCgkJI2ltcGxpY2l0IGNvbnZlcnNpb25zCgkgICAgICAgIGdldCgxKSAgICAgICAtPiAyCgkgICAgICAgIGdldCgxLjApICAgICAtPiAzCgkgICAgICAgIGdldCgiaGVsbG8iKSAtPiBFcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCiAgICAgICAgICAgIEFsc28sIGFzIGluIEMrKywgbm93IGltcGxpY2l0IGNvbnZlcnNpb25zIGFyZSBzdXBwb3J0ZWQgaW4KICAgICAgICAgICAgdmFyaWFibGUgYXNzaWdtZW50cywgYW5kIGlmIHlvdSBoYXZlOgoKCSAgICAgIEEgZ2E7CgkgICAgICBzdHJ1Y3QgQmFyIHsKCSAgICAgICAgQSBhOwogICAgICAgICAgICAgIH07CgoJICAgIHlvdSBjYW4gZG86CgoJICAgICAgY3Zhci5nYSA9IEEoMSkKCSAgICAgIGN2YXIuZ2EgPSAxCgkgICAgICBjdmFyLmdhID0gMS4wCgkgICAgICBjdmFyLmdhID0gQSgiaGVsbG8iKSAKCSAgICAgIGN2YXIuZ2EgPSAiaGVsbG8iIC0+IGVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKCSAgICAgIGIgPSBCYXIoKQoJICAgICAgYi5hID0gQSgiaGVsbG8iKQoJICAgICAgYi5hID0gMQoJICAgICAgYi5hID0gMS4wCgkgICAgICBiLmEgPSAiaGVsbG8iIC0+IGVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKCSAgICBOb3RlIHRoYXQgdGhlIGxhc3QgY2FzZSwgYXNzaWduaW5nIGEgbWVtYmVyIHZhciBkaXJlY3RseSwgCgkgICAgYWxzbyByZXF1aXJlcyB0aGUgJ25hdHVyYWx2YXInIG9wdGlvbi4KCgkgICAgVGhpcyBzdXBwb3J0IG5vdyBtYWtlcyB0aGUgb2xkICclaW1wbGljaXQnIG1hY3JvLCB3aGljaAoJICAgIHdhcyBmb3VuZCBpbiAnaW1wbGljaXQuaScgYW5kIGl0IHdhcyBmcmFnaWxlIGluIG1hbnkgd2F5cywKCSAgICBvYnNvbGV0ZSwgYW5kIHlvdSBzaG91bGQgdXNlIHRoZSBuZXcgJyVpbXBsaWNpdGNvbnYnCgkgICAgZGlyZWN0aXZlIGluc3RlYWQuCgoJICAgIE5vdGUgdGhhdCB3ZSBmb2xsb3cgdGhlIEMrKyBjb252ZW50aW9ucywgaWUsIGluIHRoZQoJICAgIGZvbGxvd2luZyB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBpcyBhbGxvd2VkOgoKCQlpbnQgZ2V0KEEgYSkge3JldHVybiBhLmlpO30KCQlpbnQgZ2V0KGNvbnN0IEEmIGEpIHtyZXR1cm4gYS5paTt9CgkgICAgCgkgICAgYnV0IG5vdCBpbiB0aGVzZSBjYXNlczoKCgkJaW50IGdldChBICphKSB7cmV0dXJuIGEtPmlpO30KCQlpbnQgZ2V0KEEmIGEpIHtyZXR1cm4gYS5paTt9CgkJCgkgICAgQWxzbywgaXQgd29ya3MgZm9yIGRpcmVjdG9yIG1ldGhvZHMgdGhhdCByZXR1cm4gYSBieSB2YWx1ZQoJICAgIHJlc3VsdCwgaWUsIHRoZSBmb2xsb3dpbmcgd2lsbCB3b3JrOgoKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSBnZXRfYSgpID0gMDsKCgkJZGVmIGdldF9hKHNlbGYpOgoJCSAgIHJldHVybiAxCgogICAgICAgICAgICBidXQgbm90IGluIHRoaXMgY2FzZToKCiAgICAgICAgICAgICAgICB2aXJ0dWFsIGNvbnN0IEEmIGdldF9hKCkgPSAwOwogICAgICAgICAgICAgICAgdmlydHVhbCBBJiBnZXRfYSgpID0gMDsKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSogZ2V0X2EoKSA9IDA7CgkgICAgCgkgIE5vdGVzOgoKCSAgLSB0aGUgaW1wbGljaXRjb252IG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZCBieSBkaXJlY3RseQoJICAgIGNhbGxpbmcvZGlzcGF0Y2hpbmcgdGhlIHB5dGhvbiBjb25zdHJ1Y3RvciwgdHJpZ2dlcmluZyBhCgkgICAgY2FsbCB0byB0aGUgX19pbml0X19tZXRob2QuIEhlbmNlLCBpZiB5b3UgZXhwYW5kZWQgdGhlCgkgICAgX19pbml0X18gbWV0aG9kLCBsaWtlIGluOgoKCSAgICAgICAgY2xhc3MgQToKCQkgICBkZWYgX19pbml0X18oc2VsZixhcmdzKToKCQkgICAgICA8c3dpZyBjb2RlPgoJCSAgICAgIDxteSBjb2RlIGhlcmU+CgogICAgICAgICAgICB0aGVuICdteSBjb2RlJyB3aWxsIGFsc28gYmUgZXhlY3V0ZWQuCgkgICAgCgkgIC0gU2luY2UgdGhlICVpbXBsaWNpdGNvbnYgZGlyZWN0aXZlIGlzIGEgU1dJRyBmZWF0dXJlLCBpZiB5b3UgdHlwZToKCSAgICAKICAJICAgICAgICVpbXBsaWNpdGNvbnY7ICAKCgkgICAgdGhhdCB3aWxsIGVuYWJsZSBpbXBsaWNpdCBjb252ZXJzaW9uIGZvciBhbGwgdGhlIGNsYXNzZXMgaW4KCSAgICB5b3VyIG1vZHVsZS4KCgkgICAgQnV0IGlmIHlvdSBhcmUgd29ycmllZCBhYm91dCBwZXJmb3JtYW5jZSwgbWF5YmUgdGhhdCB3aWxsIGJlCgkgICAgdG9vIG11Y2gsIGVzcGVjaWFsbHkgaWYgeW91IGhhdmUgb3ZlcmxvYWRlZCBtZXRob2RzLCBzaW5jZQoJICAgIHRvIHJlc29sdmUgdGhlIGRpc3BhdGNoaW5nIHByb2JsZW0sIHB5dGhvbiB3aWxsIGVmZWN0aXZlbHkKCSAgICB0cnkgdG8gY2FsbCBhbGwgdGhlIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBhcyBuZWVkZWQuCgoJICAtIEZvciB0aGUgc2FtZSByZWFzb24sIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UKICAgICAgICAgICAgdGhlIG5ldyAnY2FzdG1vZGUnIHdoZW4gbWl4aW5nIGltcGxpY2l0IGNvbnZlcnNpb24gYW5kCiAgICAgICAgICAgIG92ZXJsb2FkaW5nLgoKCSAtIFtweXRob25dIFRoZSAlaW1wbGljaXQgZGlyZWN0aXZlIGlzIGRlY2xhcmVkIG9ic29sZXRlLCBhbmQKICAgICAgICAgICB5b3Ugc2hvdWxkIHVzZSAlaW1wbGljaXRjb252IGluc3RlYWQuIElmIHlvdSBpbmNsdWRlCgkgICB0aGUgaW1wbGljaXQuaSBmaWxlLCBhIHdhcm5pbmcgd2lsbCByZW1pbmQgeW91IG9mIHRoaXMuCgoJICAgTm90ZTogU2luY2UgJWltcGxpY2l0IGlzIGZyYWdpbGUsIGp1c3QgcmVwbGFjaW5nIGl0IGJ5CgkgICAlaW1wbGljaXRjb252IGNvdWxkIGxlYWQgdG8gZGlmZmVyZW50IGJlaGF2aW9yLiBIZW5jZSwgd2UKCSAgIGRvbid0IGF1dG9tYXRpY2FsbHkgc3dpdGNoIGZyb20gdG8gdGhlIG90aGVyLCBhbmQgdGhlIHVzZXIKCSAgIG11c3QgbWlncmF0ZSB0byB0aGUgbmV3ICVpbXBsaWNpdGNvbnYgZGlyZWN0aXZlIG1hbnVhbGx5LgoKCjEyLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10KICAgICAgICAgICAgTW9kaWZ5IHN0ZDo6dmVjdG9yIHdyYXBwZXJzIHRvIHVzZSBzdGQ6OnZlY3Rvcjo6dmFsdWVfdHlwZSBhcyB0aGlzIGlzCiAgICAgICAgICAgIGNsb3NlciB0byB0aGUgcmVhbCBTVEwgZGVjbGFyYXRpb25zIGZvciBzb21lIG1ldGhvZHMsIGVnIGZvciBwdXNoX2JhY2soKS4KICAgICAgICAgICAgRml4ZXMgc29tZSBjb21waWxhdGlvbiBlcnJvcnMgZm9yIHNvbWUgY29tcGlsZXJzIGVnIHdoZW4gdGhlIHRlbXBsYXRlZAogICAgICAgICAgICB0eXBlIGlzIGEgcG9pbnRlci4KCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBzdGQ6OnZlY3RvciBpbXByb3ZlbWVudHMgLSBhIGZldyBtb3JlIG1ldGhvZHMgYXJlIHdyYXBwZWQgYW5kIHNwZWNpYWxpemF0aW9ucyBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHJlcXVpcmVkLiBUaGUgc3BlY2lhbGl6ZV9zdGRfdmVjdG9yIG1hY3JvIGlzIG5vIGxvbmdlciBuZWVkZWQgKGEKICAgICAgICAgICAgd2FybmluZyBpcyBpc3N1ZWQgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVzZSBpdCkuCgoxMi8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIEFkZCBpbiBwb2ludGVyIHJlZmVyZW5jZSB0eXBlbWFwcy4gVGhpcyBhbHNvIGVuYWJsZXMgb25lIHRvIGVhc2lseSB3cmFwCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IHdoZXJlIFQgaXMgYSBwb2ludGVyLgoKMTIvMjQvMjAwNTogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBUaGUgY2ZmaSBtb2R1bGUgZm9yIFNXSUc6CiAgICAgICAgICAgICAgLSBGdWxseSBzdXBwb3J0cyBDLCBidXQgcHJvdmlkZXMgbGltaXRlZCBzdXBwb3J0cyBmb3IgQysrLCBpbgogICAgICAgICAgICAgICBwYXJ0aWN1bGFyIEMrKyBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMgYW5kIG92ZXJsb2FkaW5nIG5lZWRzIHRvCiAgICAgICAgICAgICAgIGJlIHdvcmtlZCB1cG9uLiAKCjEyLzIzLzIwMDU6IG1tYXR1cwoJICAgIFtweXRob25dIEFkZCB0aGUgY2FzdG1vZGUgdGhhdCBhbGxvd3MgdGhlIHB5dGhvbgoJICAgIHR5cGUgY2FzdGluZyB0byBvY2N1ci4KCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlICdpbnQgZm9vKGludCknLCBub3cKCSAgICAKCSAgICAgIGNsYXNzIEFpKCk6CgkgICAgICAgICBkZWYgX19pbml0X18oc2VsZix4KTogCgkJICAgIHNlbGYueCA9IHgKCSAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOiAKCQkgICAgcmV0dXJuIHNlbGYueAoKCSAgICAgIGZvbygxKSAgIC8vIE9rCgkgICAgICBmb28oMS4wKSAvLyBPawoJICAgICAgZm9vKDEuMykgLy8gRXJyb3IKCSAgICAgIGEgPSBBaSg0KQogICAgICAgICAgICAgIGZvbyhhaSkgIC8vIE9rCgogICAgICAgICAgICBUaGUgY2FzdG1vZGUsIHdoaWNoIGNhbiBiZSBlbmFibGVkIGVpdGhlciB3aXRoIHRoZQogICAgICAgICAgICAnLWNhc3Rtb2RlJyBvcHRpb24gb3IgdGhlICVtb2R1bGUoImNhc3Rtb2RlIikgb3B0aW9uLCB1c2VzCiAgICAgICAgICAgIHRoZSBuZXcgY2FzdC9yYW5rIGRpc3BhdGNoIG1lY2hhbmlzbS4gSGVuY2UsIG5vdyBpZiB5b3UKICAgICAgICAgICAgaGF2ZSAnaW50IGZvbyhpbnQpOyBpbnQgZm9vKGRvdWJsZSk7JywgdGhlIGZvbGxvd2luZyB3b3JrcwogICAgICAgICAgICBhcyBleHBlY3RlZDoKCgkgICAgICBmb28oMSkgICAtPiBmb28oaW50KQoJICAgICAgZm9vKDEuMCkgLT4gZm9vKGRvdWJsZSkKCSAgICAgIGFpID0gQWkoNCkKCSAgICAgIGZvbyhhaSkgIC0+IGZvbyhpbnQpCgoJICAgIE5vdGUxOiB0aGUgJ2Nhc3Rtb2RlJyBjb3VsZCBkaXNydXB0IHNvbWUgc3BlY2lhbGl6ZWQKCSAgICB0eXBlbWFwcy4gSW4gcGFydGljdWxhciwgdGhlICJpbXBsaWNpdC5pIiBsaWJyYXJ5IHNlZW1zIHRvCgkgICAgaGF2ZSBwcm9ibGVtIHdpdGggdGhlIGNhc3Rtb2RlLiBCdXQgYmVzaWRlcyB0aGF0IG9uZSwgdGhlCgkgICAgZW50aXJlIHRlc3Qtc3VpdGUgY29tcGlsZXMgZmluZSB3aXRoIGFuZCB3aXRob3V0IHRoZQoJICAgIGNhc3Rtb2RlLgoKIAkgICAgTm90ZTI6IHRoZSBjYXN0IG1vZGUgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCB0aGUgZmFzdAoJICAgIGRpc3BhdGNoIG1vZGUsIGllLCB0aGUgLWZhc3RkaXNwYXRjaCBvcHRpb24gaGFzIG5vIGVmZmVjdAoJICAgIHdoZW4gdGhlIGNhc3QgbW9kZSBpcyBzZWxlY3RlZC4gVGhlIHBlbmFsdGllcywgaG93ZXZlciwKCSAgICBhcmUgbWluaW11bSBzaW5jZSB0aGUgY2FzdCBkaXNwYXRjaCBjb2RlIGlzIGFscmVhZHkgYmFzZWQKCSAgICBvbiB0aGUgc2FtZSBmYXN0IGRpc3BhdGNoIG1lY2hhbmlzbS4KCgkgICAgU2VlIHRoZSBmaWxlIG92ZXJsb2FkX2Rpc3BhdGNoX2Nhc3RfcnVubWUucHkgZmlsZSBmb3IKCSAgICBuZXcgY2FzZXMgYW5kIGV4YW1wbGVzLgoKMTIvMjIvMjAwNTogbW1hdHVzCgkgICAgQWRkIHRoZSBjYXN0IGFuZCByYW5rIG1lY2hhbmlzbSB0byBkaXNwYXRjaCBvdmVybG9hZGluZwoJICAgIGZ1bmN0aW9ucy4gVGhlIFVURiBzdXBwb3J0cyBpdCBub3csIGJ1dCBmb3IgZWFjaCBsYW5ndWFnZQoJICAgIGl0IG11c3QgYmUgZGVjaWRlZCBob3cgdG8gaW1wbGVtZW50IGFuZC9vciB3aGVuIHRvIHVzZSBpdC4KCgkgICAgW3BlcmxdIE5vdyBwZXJsIHVzZXMgdGhlIG5ldyBjYXN0IGFuZCByYW5rIGRpc3BhdGNoCgkgICAgbWVjaGFuaXNtLCB3aGljaCBzb2x2ZXMgYWxsIHRoZSBwYXN0IHByb2JsZW1zIGtub3duIAoJICAgIGluIHBlcmwsIHN1Y2ggYXMgdGhlIG9sZCAnKyAxJyBwcm9ibGVtOgoKCSAgICAgICAgaW50IGZvbyhpbnQpOwoJICAgIAoJCSRuID0gMQogICAgICAgICAgICAgICAgJG4gPSAkbiArIDEKICAgICAgICAgICAgICAgICRyID0gZm9vKG4pCgogICAgICAgICAgICBhbHNvIHdvcmtzOgoKICAgICAgICAgICAgICAgICBmb28oMSk7CiAgICAgICAgICAgICAgICAgZm9vKCIxIik7CiAgICAgICAgICAgICAgICAgZm9vKDEuMCk7CiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKTsKCiAgICAgICAgICAgICBidXQgZmFpbHMKCiAgICAgICAgICAgICAgICAgZm9vKCJsIik7CgogICAgICAgICAgICAgYW5kIHdoZW4gb3ZlcmxvYWRpbmcgIGZvbyhpbnQpIGFuZCBmb28oZG91YmxlKTsKCiAgICAgICAgICAgICAgICAgZm9vKDEpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKDEuMCkgLT4gZm9vKGRvdWJsZSkKICAgICAgICAgICAgICAgICBmb28oIjEiKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygiMS4wIikgLT4gZm9vKGRvdWJsZSkKICAgICAgICAgICAgICAgICBmb28oImwiKSAtPiBlcnJvcgoJCSBmb28oJG4pIC0+IGZvbyhpbnQpICBmb3IgZ29vZCBwZXJsIHZlcnNpb25zCgkJIGZvbygkbikgLT4gZm9vKGRvdWJsZSkgIGZvciBvbGQgYmFkIHBlcmwgdmVyc2lvbnMKCgkgICAgIHdoZW4gb3ZlcmxvYWRpbmcgZm9vKGludCksIGZvbyhjaGFyKikgYW5kIGZvbyhkb3VibGUpOgoKICAgICAgICAgICAgICAgICBmb28oMSkgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygiMSIpIC0+IGZvbyhjaGFyKikKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpIC0+IGZvbyhjaGFyKikKICAgICAgICAgICAgICAgICBmb28oImwiKSAtPiBmb28oY2hhciopCgogICAgICAgICAgICAgTm90ZTogSW4gcGVybCB0aGUgb2xkIGRpc3BhdGNoIG1lY2hhbmlzbSB3YXMgYnJva2VuLAogICAgICAgICAgICAgc28sIHdlIGRvbid0IHByb3ZpZGUgYW4gb3B0aW9uIHRvIGVuYWJsZSB0aGUgb2xkIG9uZQoJICAgICBzaW5jZSwgYWdhaW4sIGl0IHdhcyByZWFsbHkgcmVhbGx5IGJyb2tlbi4KCgkgICAgIFNlZSAnb3ZlcmxvYWRfc2ltcGxlX3J1bm1lLnBsJyBmb3IgbW9yZSBjYXNlcyBhbmQgdGVzdHMuCgoJICAgICBQUzogYWxsIHRoZSBvbGQga25vd24gaXNzdWVzIGFyZSBkZWNsYXJlZCByZXNvbHZlZCwgYW55CgkgICAgIG5ldyAicHJvYmxlbSIgdGhhdCBjb3VsZCBiZSBkaXNjb3ZlcmVkIGlzIGRlY2xhcmVkLCAKCSAgICAgYSBwcmlvcmksIGFzICJmZWF0dXJlcyIgb2YgdGhlIG5ldyBkaXNwYXRjaCBtZWNoYW5pc20KCSAgICAgKHVudGlsIHdlIGZpbmQgYW5vdGhlciBzb2x1dGlvbiBhdCBsZWFzdCkuCgkgICAgIAoJICAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKCSAgICBBcyB3aXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIFVURiwgc29tZSB0aGluZ3MgY291bGQKCSAgICBub3cgc3RhcnQgdG8gd29yayBhcyBleHBlY3RlZCwgYW5kIHBlb3BsZSB1c2VkIHRvIGRlYWwgb3IKCSAgICB3b3JrYXJvdW5kIHByZXZpb3VzIGJ1Z3MgcmVsYXRlZCB0byB0aGUgZGlzcGF0Y2gKCSAgICBtZWNoYW5pc20sIGNvdWxkIHNlZSBub3cgYSBkaWZmZXJlbmNlIGluIHBlcmwgYmVoYXZpb3IuCgoxMi8yMS8yMDA1OiBtbWF0dXMKCSAgLSBUaGUgJy1ub2RlZmF1bHQnIGZsYWcgKHByYWdtYSBhbmQgZmVhdHVyZSkgbm93IGdlbmVyYXRlcwoJICAgIGEgd2FybmluZywgYW5kIHJlY29tbWVuZHMgdG8gdXNlIHRoZSBleHBsaWNpdAoJICAgIC1ub2RlZmF1bHRjdG9yIGFuZCAgLW5vZGVmYXVsdGR0b3Igb3B0aW9ucy4KCSAgICAKCSAgICBUaGUgcmVhc29uIHRvIHNwbGl0IHRoZSAnbm9kZWZhdWx0JyBiZWhhdmlvciBpcyB0aGF0LCBpbgoJICAgIGdlbmVyYWwsIGlnbm9yaW5nIHRoZSBkZWZhdWx0IGRlc3RydWN0b3IgZ2VuZXJhdGVzIG1lbW9yeQoJICAgIGxlYWtzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIEhlbmNlLCBpcyB0b28gcmlza3kganVzdCB0bwoJICAgIGRpc2FibGUgYm90aCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcgoJICAgIGF0IHRoZSBzYW1lIHRpbWUuCgoJICAgIElmIHlvdSBuZWVkIHRvIGRpc2FibGUgdGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciwgaXQgaXMKCSAgICBhbHNvIHJlY29tbWVuZGVkIHlvdSB1c2UgdGhlIGRpcmVjdGl2ZSBmb3JtOgoKCSAgICAgICAlbm9kZWZhdWx0ZHRvciAgTXlWZXJ5U3BlY2lhbENsYXNzOwoKICAgICAgICAgICAgZm9yIHNwZWNpZmljIGNsYXNzZXMsIGFuZCBhbHdheXMgYXZvaWQgdXNpbmcgdGhlIGdsb2JhbAogICAgICAgICAgICAtbm9kZWZhdWx0IGFuZCAtbm9kZWZhdWx0ZHRvciBvcHRpb25zLgoJICAgIAoxMi8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIEZpeCBpbmNvcnJlY3QgY29kZSBnZW5lcmF0aW9uIHdoZW4gdGhlIGludGVybWVkaWFyeSBjbGFzc25hbWUgaXMgY2hhbmdlZAogICAgICAgICAgICBpbiB0aGUgbW9kdWxlIGRpcmVjdGl2ZSBmcm9tIGl0cyBkZWZhdWx0LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJW1vZHVsZShqbmljbGFzc25hbWU9Im15aW1jbGFzc25ld25hbWUiKSAibXltb2R1bGUiIC8vIEphdmEKICAgICAgICAgICAgICAlbW9kdWxlKGltY2xhc3NuYW1lPSJteWltY2xhc3NuZXduYW1lIikgIm15bW9kdWxlIiAvLyBDIwoKICAgICAgICAgICAgQWRkIGluIG5ldyBzcGVjaWFsIHZhcmlhYmxlICRpbWNsYXNzbmFtZS4gU2VlIGRvY3MuCgoxMi8xNy8yMDA1OiBtbWF0dXMKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1hbGlhc29iajAvLW5vYWxpYXNvYmowIG9wdGlvbnMgdG8gdXNlIHdpdGgKCSAgICAtZmFzdHVucGFjayBhbmQvb3IgLU8gYW5kIG9sZCB0eXBlbWFwcyB0aGF0IHVzZSAnb2JqMCcKCSAgICBkaXJlY3RseS4KCgkgICAgU28sIGlmIHlvdSBjb21waWxlIHlvdXIgY29kZSB1c2luZyAtTyBhbmQgZ2V0IGVycm9ycyBhYm91dAoJICAgIHRoZSB1bmRlY2xhcmVkICdvYmowJyB2YXJpYWJsZSwgcnVuIGFnYWluIHVzaW5nIAoKCQlzd2lnIC1PIC1hbGlhc29iajAgLXB5dGhvbiAuLi4uCgkgICAgCgkgICAgRm9yIG5ldyB0eXBlbWFwcywgbmV2ZXIgdXNlICdvYmowJyBkaXJlY3RseSwgaWYgbmVlZGVkLAoJICAgIHVzZSB0aGUgJyRzZWxmJyBuYW1lIHRoYXQgd2lsbCBiZSBwcm9wZXJseSAgZXhwYW5kZWQgdG8KCSAgICAnb2JqMCcgKG5vZmFzdHVucGFjaykgb3IgJ3N3aWdfb2JqWzBdJyAoZmFzdHVucGFjaykuIAogIAoJICAgIElmIHlvdSBoYXZlIG5vIGlkZWEgd2hhdCBJIGFtIHRhbGtpbmcgYWJvdXQsIGJldHRlciwgdGhhdAoJICAgIG1lYW5zIHlvdSBoYXZlIG5vIHR5cGVtYXAgd2l0aCB0aGlzIHByb2JsZW0uCgoKMTIvMTQvMjAwNTogbW1hdHVzIAkgCgkgIFtQeXRob25dCgkgIC0gQWRkIHRoZSAtZmFzdHVucGFjay8tbm9mYXN0dW5wYWNrIG9wdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUKCSAgICB0aGUgdXNlIG9mIHRoZSBpbnRlcm5hbCBVbnBhY2tUdXBsZSBtZXRob2QsIGluc3RlYWQgb2YKCSAgICBjYWxsaW5nIHRoZSBvbmUgZnJvbSB0aGUgcHl0aG9uIEMgQVBJLgoKCSAgICBUaGUgb3B0aW9uIC1PIG5vdyBhbHNvIGltcGxpZXMgLWZhc3R1bnBhY2suCgkgICAgCgoxMi8xMS8yMDA1OiBtbWF0dXMgCgkgIFtQeXRob25dCgkgIC0gQWRkIHRoZSAtcHJveHlkZWwvLW5vcHJveHlkZWwgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZQoJICAgIHRoZSBnZW5lcmF0aW9uIG9mIHByb3h5L3NoYWRvdyBfX2RlbF9fIG1ldGhvZHMsIGV2ZW4KCSAgICB3aGVuIG5vdyB0aGV5IGFyZSByZWR1bmRhbnQsIHNpbmNlIHRoZXkgYXJlIGVtcHR5LgoJICAgIEhvd2V2ZXIsIG9sZCBpbnRlcmZhY2VzIGNvdWxkIHJlbHkgb24gY2FsbGluZyB0aGVtLgoKCSAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBnZW5lcmF0ZSB0aGUgX19kZWxfXyBtZXRob2RzCgkgICAgYXMgaW4gMS4zLjI3IG9yIG9sZGVyIHN3aWcgdmVyc2lvbnMuCgoJICAgIFRoZSBvcHRpb24gLU8gbm93IGFsc28gaW1wbGllcyAtbm9wcm94eWRlbC4KCjEyLzEwLzIwMDU6IG1tYXR1cyAKCSAgW1VURl0KICAgICAgICAgIC0gRml4IHVubmVjY2Vzc2FyeSBjYWxscyB0byBTV0lHX1R5cGVRdWVyeSBmb3IgJ2NoYXIgKicKCSAgICBhbmQgJ3djaGFyX3QgKicsIHByb2JsZW0gZm91bmQgYnkgQ2xheSBDdWx2ZXIgd2hpbGUKCSAgICBwcm9maWxpbmcgdGhlIFB5T2dyZSBwcm9qZWN0LgoKCSAgCgkgIFtQeXRob25dIAoJICAtIEFkZCB0aGUgLWRpcnZ0YWJsZS8tbm9kaXJ2dGFibGUgdG8gZW5hYmxlL2Rpc2FibGUKCSAgICBhIHBzZXVkbyB2aXJ0dWFsIHRhYmxlIHVzZWQgZm9yIGRpcmVjdG9ycywgYXZvaWRpbmcKCSAgICB0aGUgbmVlZCB0byByZXNvbHZlIHRoZSBweXRob24gbWV0aG9kIGF0IGVhY2ggY2FsbC4KCSAgICAKCSAgLSBBZGQgdGhlIC1zYWZlY3N0cmluZ3MvLW5vc2FmZWNzdHJpbmdzIG9wdGlvbnMgdG8KCSAgICBlbmFibGUvZGlzYWJsZSB0aGUgdXNlIG9mIHNhZmUgY29udmVyc2lvbnMgZnJvbSBQeVN0cmluZwoJICAgIHRvIGNoYXIgKi4gUHl0aG9uIHJlcXVpcmVzIHlvdSB0byBuZXZlciBjaGFuZ2UgdGhlIGludGVybmFsCgkgICAgYnVmZmVyIGRpcmVjdGx5LCBhbmQgaGVuY2UgJ3NhZmVjdHJpbmdzJyB3YXJyYW50aWVzIHRoYXQKCSAgICBidXQgcmV0dXJuaW5nIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgcHl0aG9uIHN0cmluZyBidWZmZXIuCgoJICAgIFRoZSBkZWZhdWx0LCBhcyBpbiBwcmV2aW91cyByZWxlYXNlcywgaXMgdG8gcmV0dXJuIGEKCSAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgKG5vc2FmZWNzdHJpbmdzKSwgc28sIGl0IGlzIHRoZSB1c2VyJ3MKCSAgICByZXNwb25zaWJpbGl0eSB0byBhdm9pZCBpdHMgbW9kaWZpY2F0aW9uLgoJICAgIAoJICAtIEFkZCB0aGUgLU8gb3B0aW9uIHRvIGVuYWJsZSBhbGwgdGhlIG9wdGltaXphdGlvbiBvcHRpb25zCgkgICAgYXQgb25jZSwgaW5pdGlhbGx5IGVxdWl2YWxlbnQgdG8KCgkgICAgLW1vZGVybiAtZmFzdGRpc3BhdGNoIC1kaXJ2dGFibGUgLW5vc2FmZWNzdHJpbmdzIC1mdmlydHVhbAoKMTIvMDgvMjAwNTogbW1hdHVzIAoKCSAgLSBBZGQgdGhlIC1mYXN0ZGlzcGF0Y2ggb3B0aW9uIChmYXN0ZGlzcGF0Y2ggZmVhdHVyZSkuIFRoaXMKCSAgICBlbmFibGVzIHRoZSAiZmFzdCBkaXNwYXRjaCIgbWVjaGFuaXNtIGZvciBvdmVybG9hZGVkCgkgICAgbWV0aG9kcyBwcm92aWRlZCBieSBTYWx2YWRvciBGYW5kaX5ubyBHYXJjJ2lhICgjOTMwNTg2KS4KCgkgICAgVGhlIHJlc3VsdGluZyBjb2RlIGlzIHNtYWxsZXIgYW5kIGZhc3RlciBzaW5jZSBsZXNzIHR5cGUKCSAgICBjaGVja2luZyBpcyBwZXJmb3JtZWQuIEhvd2V2ZXIsIHRoZSBlcnJvciBtZXNzYWdlcyB5b3UKCSAgICBnZXQgd2hlbiB0aGUgb3ZlcmxvYWRpbmcgaXMgbm90IHJlc29sdmVkIGNvdWxkIGJlCgkgICAgZGlmZmVyZW50IGZyb20gd2hhdCB0aGUgdHJhZGl0aW9uYWwgbWV0aG9kIHJldHVybnMuCgoJICAgIFdpdGggdGhlIG9sZCBtZXRob2QgeW91IGFsd2F5cyBnZXQgYW4gZXJyb3Igc3VjaCBhcyAKCgkgICAgICAgIk5vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBvdmVybG9hZGVkIC4uLiIKCiAgICAgICAgICAgIHdpdGggdGhlIG5ldyBtZXRob2QgeW91IGNhbiBhbHNvIGdldCBlcnJvcnMgc3VjaCBhcwoKCSAgICAgICAiVHlwZSBlcnJvciBpbiBhcmd1bWVudCAxIG9mIHR5cGUgLi4uIgoKCSAgICBTZWUgYnVnIHJlcG9ydCAjOTMwNTg2IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICAgIAogIAkgICAgU28sIHRoaXMgb3B0aW1pemF0aW9uIG11c3QgYmUgZXhwbGljaXRseSBlbmFibGVkIGJ5IHVzZXJzLgoKCSAgICBUaGUgbmV3IG1lY2hhbmlzbSBjYW4gYmUgdXNlZCBhczoKCiAgICAgICAgICAgICAgc3dpZyAtZmFzdGRpc3BhdGNoCgogICAgICAgICAgICBvciB1c2luZyB0aGUgZmVhdHVyZSBmb3JtCgoJICAgICAgJWZlYXR1cmUoImZhc3RkaXNwYXRjaCIpIG1ldGhvZDsKICAgICAgICAgICAgb3IKICAgICAgICAgICAgICAlZmFzdGRpc3BhdGNoIG1ldGhvZDsKCSAgICAKCjEyLzA2LzIwMDU6IG1tYXR1cyAKCiAgICAgICAgICAtIFNldmVyYWwgbWVtb3J5IGFuZCBzcGVlZCBpbXByb3ZlbWVudHMsIHNwZWNpYWxseSBmb3IKCSAgICB0ZW1wbGF0ZXMuIE5vdyBzd2lnIGlzIHVwIHRvIDIwIGZhc3RlciB0aGFuIGJlZm9yZSBmb3IKCSAgICBsYXJnZSB0ZW1wbGF0ZSBpbnRlcmZhY2VzLCBzdWNoIGFzIHRoZSBzdGRfY29udGFpbmVycy5pCgkgICAgYW5kIHRlbXBsYXRlX21hdHJpeC5pIGZpbGVzIGluIHRoZSBweXRob24gdGVzdC1zdWl0ZS4KCgkgICAgTWVtb3J5IGZvb3RwcmludCBpcyBhbHNvIHJlZHVjZWQgaW4gY29uc2lkZXJhdGlvbiBvZiBzbWFsbAoJICAgIHBjcy9hcmNoaXRlY3R1cmVzLgoKCSAgLSBhZGQgY29tbWFuZGxpbmUgb3B0aW9ucyAtY3BwZXJyYXN3YXJuIGFuZCAtbm9jcHBlcnJhc3dhcm4iIHRvIGZvcmNlCiAgICAgICAgICAgIHRoZSBzd2lnIHByZXByb2Nlc3NvciB0byB0cmVhdCB0aGUgI2Vycm9yIGRpcmVjdGl2ZSBhcyBhICN3YXJuaW5nLgoJICAgIAoJICAgIHRoZSBwcmFnbWFzCgogICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgY3BwZXJyYXN3YXJuPTEKICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIGNwcGVycmFzd2Fybj0wCgkgICAgICAgCgkgICAgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLCByZXNwZWN0aXZlbHkuCiAgICAgICAgICAgICAKCjEyLzA2LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIFRoZSBnZW5lcmF0ZWQgY29kZSBpcyBub3cgbW9yZSBwb3J0YWJsZSwgZXNwZWNpYWxseQoJICAgIGZvciBXaW5kb3dzLiBGb2xsb3dpbmcgCgogICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvZmFxL3dpbmRvd3MuaHRtbAoKICAgICAgICAgICAgUHlfTm9uZSBpcyBuZXZlciBhY2Nlc3NlZCBhcyBhIHN0cnVjdHVyZSwgcGx1cyBvdGhlcgogICAgICAgICAgICB0cmlja3MgbWVudGlvbmVkIHRoZXJlLgoKMTIvMDYvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB0aHJlYWRzIGJhc2VkIGluIHRoZQoJICAgIHByb3Bvc2FsIGJ5IEpvc2VwaCBXaW5zdG9uLgoKCSAgICBUaGUgdXNlciBpbnRlcmZhY2UgaXMgYXMgZm9sbG93czoKCgkgICAgMS4tIHRoZSBtb2R1bGUgdGhyZWFkIHN1cHBvcnQgaXMgZW5hYmxlIHZpYSB0aGUgInRocmVhZHMiIG1vZHVsZQogICAgICAgICAgICAgICAgb3B0aW9uLCBpLmUuCgogICAgICAgICAgICAgICAgICAlbW9kdWxlKCJ0aHJlYWRzIj0xKQoKICAgICAgICAgICAgMi4tIEVxdWl2YWxlbnQgdG8gdGhhdCwgaXMgdGhlIG5ldyAnLXRocmVhZHMnIHN3aWcgb3B0aW9uCgogICAgICAgICAgICAgICAgICBzd2lnIC10aHJlYWRzIC1weXRob24gLi4uCgogICAgICAgICAgICAzLi0gWW91IGNhbiBwYXJ0aWFsbHkgZGlzYWJsZSB0aHJlYWQgc3VwcG9ydCBmb3IgYSBnaXZlbgogICAgICAgICAgICAgICAgbWV0aG9kIHVzaW5nOgoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkIikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZCBtZXRob2Q7CgogICAgICAgICAgICAgICAgYWxzbywgeW91IGNhbiBkaXNhYmxlIHNlY3Rpb25zIG9mIHRoZSB0aHJlYWQgc3VwcG9ydCwgCiAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZQoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkYmxvY2siKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkYmxvY2sgbWV0aG9kOwoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkYWxsb3ciKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkYWxsb3cgbWV0aG9kOwoKICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBkaXNhYmxlcyB0aGUgQysrL3B5dGhvbiB0aHJlYWQgcHJvdGVjdGlvbiwgYW5kIHRoZQogICAgICAgICAgICAgICAgc2Vjb25kIGRpc2FibGVzIHRoZSBweXRob24vQysrIHRocmVhZCBwcm90ZWN0aW9uLiAKCiAgICAgICAgICAgIDQuLSBUaGUgY3VycmVudCB0aHJlYWQgc3VwcG9ydCBpcyBiYXNlZCBpbiB0aGUgUHlHSUwKICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBwcmVzZW50IGluIHB5dGhvbiB2ZXJzaW9uIDIuMyBvciBsYXRlciwgYnV0CiAgICAgICAgICAgICAgICB5b3UgY2FuIHByb3ZpZGUgdGhlIHRocmVhZCBjb2RlIGZvciBvbGRlciB2ZXJzaW9ucyBieQogICAgICAgICAgICAgICAgZGVmaW5pbmcgdGhlIG1hY3JvcyBpbiBweXRocmVhZHMuc3dnLgoKCQlJZiB5b3UgZ2V0IGEgd29ya2luZyBpbXBsZW1lbnRhdGlvbiBmb3Igb2xkZXIgdmVyc2lvbnMsCgkJcGxlYXNlIHNlbmQgdXMgYSBwYXRjaC4KCiAgICAgICAgICAgIEZvciB0aGUgY3VyaW91cyBhYm91dCBwZXJmb3JtYW5jZSwgaGVyZSBhcmUgc29tZSBudW1iZXJzCiAgICAgICAgICAgIGZvciB0aGUgcHJvZmlsZXRlc3QuaSB0ZXN0LCB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIHRoZSBzcGVlZAoJICAgIG9mIHRoZSB3cmFwcGVkIGNvZGU6CgoJICAgICAgICBub3RocmVhZCAgICAgICAgICAgOS42cyAgKG5vIHRocmVhZCBjb2RlKQoJCW5vdGhyZWFkYmxvY2sgICAgIDEyLjJzICAob25seSAnYWxsb3cnIGNvZGUpCgkJbm90aHJlYWRhbGxvdyAgICAgMTMuNnMgIChvbmx5ICdibG9jaycgY29kZSkKICAgICAgICAgICAgICAgIGZ1bGwgdGhyZWFkICAgICAgIDE1LjVzICAoJ2FsbG93JyArICdibG9jaycgY29kZSkKCSAgICAKCSAgICBpLmUuLCBmdWxsIHRocmVhZCBjb2RlIGRlY3JlYXNlcyB0aGUgd3JhcHBpbmcgcGVyZm9ybWFuY2UgYnkKCSAgICBhcm91bmQgNjAlLiBJZiB0aGF0IGlzIGltcG9ydGFudCB0byB5b3VyIGFwcGxpY2F0aW9uLCB5b3UKCSAgICBjYW4gdHVuZSBlYWNoIG1ldGhvZCB1c2luZyB0aGUgZGlmZmVyZW50ICdub3RocmVhZCcsCgkgICAgJ25vdGhyZWFkYmxvY2snIG9yICdub3RocmVhZGFsbG93JyBmZWF0dXJlcyBhcwoJICAgIG5lZWRlZC4gTm90ZSB0aGF0IGZvciBzb21lIG1ldGhvZHMgZGVhY3RpdmF0aW5nIHRoZQoJICAgICd0aHJlYWQgYmxvY2snIG9yICd0aHJlYWQgYWxsb3cnIGNvZGUgaXMgbm90IGFuIG9wdGlvbiwKCSAgICBzbywgYmUgY2FyZWZ1bC4KCSAgICAKCjExLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNXSUcgbGlicmFyeSBmaWxlcyB1c2Ugc3lzdGVtIGFuZ2xlIGJyYWNrZXRzIGV2ZXJ5d2hlcmUgZm9yICVpbmNsdWRlLCBlZwogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfY29tbW9uLmkiCiAgICAgICAgICAgIGJlY29tZXMKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX2NvbW1vbi5pPgoKMTEvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBUeXBlc2FmZSBlbnVtcyBhbmQgcHJvcGVyIGVudW1zIGhhdmUgYW4gZXh0cmEgY29uc3RydWN0b3Igc28gdGhhdCBlbnVtIGl0ZW0gdmFsdWVzIHRoYXQKICAgICAgICAgICAgYXJlIGluaXRpYWxpc2VkIGJ5IGFub3RoZXIgZW51bSBpdGVtIHZhbHVlIGNhbiBiZSB3cmFwcGVkIHdpdGhvdXQgaGF2aW5nIHRvIHVzZSAlamF2YWNvbnN0dmFsdWUvCiAgICAgICAgICAgICVjc2NvbnN0dmFsdWUgZm9yIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKS4gU3VnZ2VzdGlvbiBieQogICAgICAgICAgICBCb2IgTWFyaW5pZXIvRG91Z2xhcyBQZWFyc29uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdHlwZWRlZiBlbnVtCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHh5eiwKICAgICAgICAgICAgICAgICBsYXN0ID0geHl6CiAgICAgICAgICAgICAgfSByZXBlYXQ7CgoxMS8yMS8yMDA1OiBtbWF0dXMKCSAgICBbcnVieSArIHB5dGhvbl0KCgkgICAgRml4ZXMgZm9yIGRpcmVjdG9ycyArIHBvaW50ZXJzLiBUaGlzIGlzIGFuIHVnbHkgcHJvYmxlbSB3aXRob3V0IGFuIGVhc3kKCSAgICBzb2x1dGlvbi4gQmVmb3JlIHdlIGlkZW50aWZpZWQgdGhpcyBjYXNlIGFzIHByb2JsZW1hdGljOgoKCSAgICAgICAgICB2aXJ0dWFsIGNvbnN0IE15Q2xhc3MmIG15X21ldGhvZCgpOwoKICAgICAgICAgICAgYnV0IGl0IHR1cm5zIG91dCB0aGF0IGFsbCB0aGUgY2FzZXMgd2hlcmUgYSBwb2ludGVyLCBhcnJheSBvcgogICAgICAgICAgICByZWZlcmVuY2UgaXMgcmV0dXJuZWQsIGFyZSBwcm9ibGVtYXRpYywgZXZlbiBmb3IgCgkgICAgcHJpbWl0aXZlIHR5cGVzIChhcyBpbnQsIGRvdWJsZSwgY2hhciosIGV0YykuCgoJICAgIFRvIHRyeSB0byBmaXggdGhlIGlzc3VlLCBhIG5ldyB0eXBlbWFwIHdhcyBhZGRlZCwKCSAgICAnZGlyZWN0b3JmcmVlJywgd2hpY2ggaXMgdXNlZCB0byAnZnJlZScgdGhlIHJlc291cmNlcwoJICAgIGFsbG9jYXRlZCBkdXJpbmcgdGhlICdkaXJlY3Rvcm91dCcgcGhhc2UuIEF0IHRoZSBzYW1lCgkgICAgdGltZSwgYSBwcmltaXRpdmUgZ2FyYmFnZSBjb2xsZWN0b3IgZW5naW5lIHdhcyBhZGRlZCB0bwoJICAgIGRlYWwgd2l0aCBvcnBoYW5lZCBhZGRyZXNzZXMsIHdoZW4gbmVlZGVkLgoJICAgIAoJICAgIFRoZSBzaXR1YXRpb24gaXMgbXVjaCBiZXR0ZXIgbm93LCBidXQgc3RpbGwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZQoJICAgIG1lbW9yeSBleGhhdXN0YXRpb24gaWYgcmVjdXJzaW9uIGlzIHVzZWQuCgoJICAgIFNvLCBzdGlsbCB5b3UgbmVlZCB0byBhdm9pZCByZXR1cm5pbmcgcG9pbnRlcnMsIGFycmF5cyBvcgoJICAgIHJlZmVyZW5jZXMgd2hlbiB1c2luZyBkaXJlY3RvciBtZXRob2RzLgoKCSAgICAtIEFkZGVkIHN0ZGludC5pIC0gdHlwZW1hcHMgZm9yIGxhdGVzdCBDOTkgaW50ZWdyYWwgdHlwZXMgZm91bmQgaW4gc3RkaW50LmguCgkgICAgCjExLzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgdHlwZXMgYWRkZWQgdG8gd2luZG93cy5pLCBlZyBVSU5UOCwgV09SRCwgQllURSBldGMuIAogICAgICAgICAgICBJbmNsdWRpbmcgd2luZG93cy5pIHdpbGwgYWxzbyBlbmFibGUgU1dJRyB0byBwYXJzZSB0aGUgX19kZWNsc3BlYyBNaWNyb3NvZnQKICAgICAgICAgICAgZXh0ZW5zaW9uLCBlZyBfX2RlY2xzcGVjKGRsbGltcG9ydCkuIEFsc28gb3RoZXIgV2luZG93cyBjYWxsaW5nIGNvbnZlbnRpb25zCiAgICAgICAgICAgIHN1Y2ggYXMgX19zdGRjYWxsLgoKMTEvMTAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZSBmb3IgV2luZG93cyAtIHdpbmRvd3MuaS4gVGhpcyBmaWxlIHdpbGwgY29udGFpbiB1c2VmdWwgdHlwZQogICAgICAgICAgICBpbmZvcm1hdGlvbiBmb3IgdXNlcnMgd2hvIGluY2x1ZGUgd2luZG93cy5oLiBJbml0aWFsIHN1cHBvcnQgaXMgZm9yIHRoZQogICAgICAgICAgICBub24gSVNPIGludGVncmFsIHR5cGVzOiBfX2ludDgsIF9faW50MTYsIF9faW50MzIsIF9faW50NjQgYW5kIHVuc2lnbmVkIHZlcnNpb25zLgogICAgICAgICAgICBUaGUgdW5zaWduZWQgdmVyc2lvbnMgcHJldmlvdXNseSBjb3VsZCBub3QgYmUgcGFyc2VkIGJ5IFNXSUcuICBTRiAjODcyMDEzLgoKMTEvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBQb3J0YWJpbGl0eSB3YXJuaW5nIGZvciBmaWxlcyB3aGljaCB3aWxsIG92ZXJ3cml0ZSBlYWNoIG90aGVyIG9uIGNhc2UKICAgICAgICAgICAgaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW1zIHN1Y2ggYXMgRkFUMzIvTlRGUy4gVGhpcyB3aWxsIG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0d28KICAgICAgICAgICAgY2xhc3MgbmFtZXMgYXJlIHRoZSBzYW1lIGJhcnJpbmcgY2FzZS4gVGhlIHdhcm5pbmcgaXMgaXNzdWVkIG9uIGFsbCBwbGF0Zm9ybXMgYW5kCiAgICAgICAgICAgIGNhbiBiZSBzdXBwcmVzc2VkIHdpdGggdGhlIHVzdWFsIHdhcm5pbmcgc3VwcHJlc3Npb24gdGVjaG5pcXVlcy4gU0YgYnVnICMxMDg0NTA3LgoKMTEvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXB5dGhvbiAtLXdpdGgtcnVieSAtLXdpdGgtcGVybDUgZXRjIGVuYWJsZSB0aGVzZSBsYW5ndWFnZXMsCiAgICAgICAgICAgIGllIHRoZSAtLXdpdGgteHh4eCBvcHRpb25zLCB3aGVyZSBubyBwYXRoIGlzIHNwZWNpZmllZCwgd29yayB0aGUgc2FtZSBhcyBpZiAKICAgICAgICAgICAgdGhlIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZCBhdCBhbGwuIEJhc2VkIG9uIHBhdGNoZXMgIzEzMzUwNDIgIzEzMjkwNDggIzEzMjkwNDcuCgoxMS8wOS8yMDA1OiBkYW5jeQoKCSAgICBbQWxsZWdyb2NsXQoJICAgIEFkZCBDKysgc3VwcG9ydCB0byB0aGUgQWxsZWdyb2NsIG1vZHVsZS4gRnVydGhlcgoJICAgIGVuaGFuY2VzIHRoZSBDIHN1cHBvcnQgYXMgd2VsbC4gU29tZSBvZiB0aGUKCSAgICBmZWF0dXJlczoKCgkgICAgLSBNVUNIIGJldHRlciBnZW5lcmF0aW9uIG9mIGZvcmVpZ24gdHlwZXMgYmFzZWQgb24KCSAgICB0aGUgQy9DKysgdHlwZXMgZm9yIHVzZSBpbiBkZWZpbmluZyB0aGUgRkZJIG9uCgkgICAgdGhlIGxpc3Agc2lkZS4gV2UgZG9uJ3QgcGFzcyBldmVyeXRoaW5nIGFzIGEgKCogOnZvaWQpCgkgICAgYW55IGxvbmdlci4KCgkgICAgLSBVc2VzIHR5cGVtYXBzIGZvciBiZXR0ZXIgY29udHJvbCBvZiB0eXBlIGNvbnZlcnNpb25zCgkgICAgYW5kIGNvZGUgZ2VuZXJhdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIGxpc3AgYW5kIGMrKyB3cmFwcGVyCgkgICAgY29kZS4KCgkgICAgLSBDTE9TIHdyYXBwaW5nIG9mIHBvaW50ZXJzIHJldHVybmVkIGZyb20gZm9yZWlnbiBzcGFjZQoJICAgIG1ha2VzIGl0IGVhc2llciB0byBkaWZmZXJlbnRpYXRlIHBvaW50ZXJzIGluIHVzZXIgY29kZS4KCSAgICBUaGUgd3JhcHBpbmcgb2JqZWN0cyBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIEZGIGNhbGxzLgoKCSAgICAtIERlZnVuIHdyYXBwaW5nIG9mIEZGIGNhbGxzLCBhbGxvd2luZyBmb3IgbW9yZSBsaXNweQoJICAgIGludGVyZmFjZS4gQ29udmVyc2lvbiwgR0NpbmcsIG9mIGxpc3Agb2JqZWN0cyB0byAKCSAgICBmb3JlaWduIG9iamVjdHMgY2FuIGJlIGRvbmUgaW4gdGhlIHdyYXBwaW5nIGRlZnVuIHZpYQoJICAgIHRoZSB1c2Ugb2YgdHlwZW1hcHMuCgkgICAgCgkgICAgLSBvdmVybG9hZCBkaXNwYXRjaGluZyBpbXBsZW1lbnRlZCBvbiB0aGUgbGlzcCBzaWRlCgkgICAgdXNpbmcgZ2VuZXJpYyBmdW5jdGlvbnMuCgoJICAgIC0gVGVtcGxhdGVzIGFuZCBzeW5vbnltb3VzIHR5cGVzIHN1cHBvcnRlZC4KCjExLzA3LzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRpbmcgcHJvcGVyIHN1cHBvcnQgZm9yIG11bHRpLWluaGVyaXRhbmNlIGluCgkgICAgdGhlIHB5dGhvbiBzaWRlLCBpZSwgaWYgeW91IGhhdmUgdHdvIEMrKyB3cmFwcGVkIGNsYXNzLCBGb28KCSAgICBhbmQgQmFyLCBub3c6CgoJICAgICAgIGNsYXNzIE15UHl0aG9uQ2xhc3MoRm9vLEJhcik6CgkgICAgICAgICAgLi4uLgoKICAgICAgICAgICAgd2lsbCBwcm9wZXJseSB3b3JrLCBldmVuIHdpdGggZGlyZWN0b3JzLCBhbmQgdGhlCiAgICAgICAgICAgIGRlYWxsb2NhdGlvbiBvZiBGb28udGhpcyBhbmQgQmFyLnRoaXMgd2lsbCBmb2xsb3cKICAgICAgICAgICAgY29ycmVjdGx5LiBCZWZvcmUsIGEgY2xhc3MgY291bGQgb25seSBoYXZlIG9uZSAndGhpcycKICAgICAgICAgICAgaW5zdGFuY2UgKHVubGlrZSBDKyspLCBvbmx5IHRoZSBsYXN0IGJhc2UgY2xhc3Mgd2FzCiAgICAgICAgICAgIHByb3Blcmx5IGRlbGV0ZWQsIG9yIGRldGVjdGVkIHdpdGggZGlyZWN0b3JzLgoKCSAgICBOb3cgJ3NlbGYudGhpcycgY2FuIGJlIGEgbGlzdCwgd2hpY2ggd2lsbCBjb250YWluIHRoZSBDKysKCSAgICBpbnN0YW5jZSBwb2ludGVycyBmb3IgYWxsIHRoZSBiYXNlIGNsYXNzZXMuCgkgICAgCgkgICAgQWxzbywgc3dpZy50aGlzIGlzIHJlc3BvbnNpYmxlIGZvciBkZWFsbG9jYXRpbmcgdGhlIEMrKwoJICAgIGluc3RhbmNlKHMpLCBhbmQgdGhlIF9fZGVsX18gbWV0aG9kIGlzIG5vdCBlbWl0dGVkIHVubGVzcwoJICAgIHRoZSB1c2VyIHByZXBwZW5kL2FwcGVuZCBzb21lIGNvZGUgdG8gaXQuCgoJICAtIFN3aWcgY2FuIG5vdyBkZXRlY3QgbWVtb3J5IGxlYWtzLCBpZSwgaWYgeW91IHN0aWxsCgkgICAgZG9uJ3QgdXNlIHByb3h5L3NoYWRvdyBjbGFzc2VzLCBhbmQgdHlwZSBzb21ldGhpbmcgbGlrZQoJICAgIAoJICAgICAgICAgaW1wb3J0IF9leGFtcGxlCgkgICAgICAgICBmID0gX2V4YW1wbGUubmV3X0ZvbygpCgoJICAgIGFuZCBmb3JnZXQgdG8gY2FsbCBfZXhhbXBsZS5kZWxldGVfRm9vKGYpLCB0aGVuIHN3aWcgd2lsbAoJICAgIHRlbGwgeW91IHRoYXQgdGhlcmUgaXMgYSBtZW1vcnkgbGVhay4KCgkgICAgT3RoZXJ3aXNlLCBpZiB5b3UgYWx3YXlzIHVzZSB0aGUgcHJveHkgY2xhc3NlcywgeW91IHByb2JhYmx5CgkgICAgeW91IHdpbGwgbmV2ZXIgZXZlciBzZWUgdGhpcyB3YXJuaW5nIHVubGVzcyB0aGVyZSBpcwoJICAgIHNvbWV0aGluZyB3cm9uZyBpbnNpZGUgdGhlIHN3aWcgd3JhcHBpbmcgY29kZS4KCSAgICAgICAKCQogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCSAgICAKCSAgICBJZiB5b3Ugb3ZlcmxvYWRlZCB0aGUgX19kZWxfXyBtZXRob2QsIGFuZCBjYWxsIHRoZSBiYXNlCgkgICAgb25lCSB3aXRob3V0IGEgdHJ5IGJsb2NrLCBhcyBpbgoKCSAgICAgICAgICAgY2xhc3MgTXlDbGFzcyhTd2lnQ2xhc3MpOgoKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCQkgICAgICAgICAgU3dpZ0NsYXNzLl9fZGVsX18oc2VsZikKCQkJICAKICAgICAgICAgICAgcHl0aG9uIGNvdWxkIGNvbXBsYWluIHRoYXQgdGhlIG1ldGhvZCBTd2lnQ2xhc3MuX19kZWxfXyBpcwogICAgICAgICAgICB1bmRlZmluZWQuIFRyeSB0byB1c2UgaW5zdGVhZDoKCSAgICAKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCQkgICAgICAgICAgdHJ5OiBTd2lnQ2xhc3MuX19kZWxfXyhzZWxmKQoJCQkgIGV4Y2VwdDogcGFzcwoKCSAgICBvciBzaW1wbHkgCQkgIAoKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCjExLzAyLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRpbmcgbW9yZSBmdW4gdG8gU1RML1NURCBjb250YWluZXJzLCBub3cgeW91CgkgICAgY2FuIGRvCgoJICAgICAgICV0ZW1wbGF0ZShweXNldCkgc3RkOjpzZXQ8UHlPYmplY3QgKj47CQkKCSAgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6dmVjdG9yPFB5T2JqZWN0ICo+OwkKCSAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8UHlPYmplY3QgKixQeU9iamVjdCAqPjsJCgkgICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6Om1hcDxQeU9iamVjdCAqLFB5T2JqZWN0ICo+OwoJICAgICAgIC4uLi4KCgkgICAgVGhlIHNhbWUgIGFwcGxpZXMgdG8gc3RkOjpsaXN0LCBzdGQ6OmRlcXVlLCBzdGQ6Om11bHRpc2V0LCBldGMuCgoJICAgIFRoZW4sIGF0IHRoZSBweXRob24gc2lkZSB5b3UgY2FuIGRvIG5vdzoKCgkgICAgICAgIyBDKysgc3RkOjp2ZWN0b3IgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIHYgPSBweXZlY3RvcihbMSwiaGVsbG8iLCgxLDIpXSkKCSAgICAgICBwcmludCB2WzFdCgkgICAgICAgPj4gJ2hlbGxvJwoJICAgICAgIHByaW50IHZbMl0KCSAgICAgICA+PiAoMSwyKQoJICAgICAgIAkJCQkJICAgCgkgICAgICAgIyBDKysgc3RkOjpzZXQgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIHMgPSBweXNldCgpCQkJICAgCgkgICAgICAgcy5pbnNlcnQoKDEsMikpCQkgICAKCSAgICAgICBzLmluc2VydCgxKQkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KCJoZWxsbyIpCgkgICAgICAgc3VtPSgpCgkgICAgICAgZm9yIGkgaW4gczoKCSAgICAgICAgIHN1bSArPShpLCkKCSAgICAgICBwcmludCBzdW0KCSAgICAgICA+Pj4gKDEsICdoZWxsbycsICgxLCAyKSkKCSAgICAgICAJCQkJICAgCgkgICAgICAgIyBDKysgc3RkOjptYXAgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIG0gPSBweW1hcCgpCQkJICAgCgkgICAgICAgbVsiZm9vIl0gPSAiaGVsbG8iCQkgICAKCSAgICAgICBtWzFdID0gKDEsMikKCSAgICAgICBwbSA9IHt9CgkgICAgICAgZm9yIGsgaW4gbToJICAgIAkgICAKCSAgICAgICAgIHBtW2tdID0gbVtrXQoJICAgICAgIHByaW50IHBtCgkgICAgICAgPj4+IHsxOiAoMSwgMiksICdmb28nOiAnaGVsbG8nfQoKCSAgICBpZSwgdGhlIFNURC9TVEwgY29udGFpbmVycyB3b3JrIGFzIHJlYWwgbmF0aXZlIHB5dGhvbgoJICAgIGNvbnRhaW5lciwgd2l0aCBhcmJpdHJhcnkgaXRlbSB0eXBlcyBhbmQgc28uCgoJICAgIEJ1dCBzaW5jZSBub3JtYWwgQysrIGNvbnRhaW5lcnMgZG8gbm90IHByb3Blcmx5IHJlZi91bnJlZgoJICAgIHRoZWlyIGl0ZW1zLCB5b3Ugc2hvdWxkIHVzZSB0aGUgc2FmZXIgdmVyc2lvbnM6CgkgICAgCgkgICAgICAldGVtcGxhdGUocHlzZXQpIHN0ZDo6c2V0PHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6dmVjdG9yPHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8c3dpZzo6UHlPYmplY3RfcHRyLCBzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6Om1hcDxzd2lnOjpQeU9iamVjdF9wdHIsc3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgIC4uLi4KCgkgICAgd2hlcmUgc3dpZzo6UHlPYmplY3RfcHRyIGlzIGEgUHlPYmplY3QgKiBlbnZlbG9wZSBjbGFzcyBwcm92aWRlZAoJICAgIHRvIHNhZmVseSBpbmNyZWYvZGVjcmVmIHRoZSBweXRob24gb2JqZWN0LiAKCSAgICAKCSAgICBTbywgbm93IHlvdSBjYW4gdXNlIGFsbCB0aGUgU1RML1NURCBjb250YWluZXJzIGFzIG5hdGl2ZQoJICAgIFB5dGhvbiBjb250YWluZXJzLiAKCgkgICAgTm90ZSAxOiBzdGQ6Om1hcCwgc3RkOjpzZXQgYW5kIHRoZSBvdGhlciAnb3JkZXJlZCcKCSAgICBjb250YWluZXJzIHdpbGwgcHJvcGVybHkgdXNlIFB5T2JqZWN0X0NvbXBhcmUgZm9yIHNvcnRpbmcsCgkgICAgd2hlbiBuZWVkZWQuCgoJICAgIE5vdGUgMjogYWxsIHRoZSBTVEwvU1REIGNvbnRhaW5lcnMgaGF2ZSBhIGxpbWl0IHNpemUgb2YKCSAgICBTSVpFX01BWCwgaWUsIHlvdSBjYW4gaGF2ZSBtYW5hZ2UgY29udGFpbmVycyBsYXJnZXIgdGhhbgoJICAgIElOVF9NQVgsIHRoZSBweXRob24gbGltaXQuCgkgICAgCgkgICAgICAKMTEvMDIvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dCgkgICAgLSBhZGQgJ2l0ZXJhdG9yKCknIG1ldGhvZCBmb3IgYWxsIHNlcXVlbmNlcyBhbmQgYWRkaXRpb25hbGx5CgkgICAgICAna2V5X2l0ZXJhdG9yKCknIGZvciBtYXBzLgoKCSAgICAgICdpdGVyYXRvcigpJyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIG5hdGl2ZSBDKysgaXRlcmF0b3IuCgkgICAgICBBZGRpdGlvbmFsbHksIGluIG1hcHMsICdrZXlfaXRlcmF0b3IoKScgd2lsbCByZXR1cm4gYSBweXRob24KCSAgICAgIGl0ZXJhdG9yIHVzaW5nIG9ubHkgdGhlIG1hcCBrZXlzLgoJICAgICAgCgkgICAgICBJbiBnZW5lcmFsIHRoZSBzZXF1ZW5jZSBtZXRob2QgX19pdGVyX18gd2lsbCBjYWxsCgkgICAgICAnaXRlcmF0b3IoKScsIHJldHVybmluZyB0aGUgbmF0aXZlIEMrKyBpdGVyYXRvciwgYnV0IGluCgkgICAgICBtYXBzIGl0IHdpbGwgY2FsbCAna2V5X2l0ZXJhdG9yKCknLCBtYWludGFpbmluZwoJICAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KCgkgICAgICBIZW5jZSwgZm9yIHN0ZDo6bWFwcywgeW91IGNhbiBwbGF5IHRoZW4gd2l0aCB0aGUgbmF0aXZlCgkgICAgICBDKysgaXRlcmF0b3IsIHdoaWNoIHZhbHVlIGlzIGEgKGtleSwgdmFsdWUpIHBhaXIsIGJ5CgkgICAgICBjYWxsaW5nIG1hcC5pdGVyYXRvcigpLCBhcyB3aXRoIG1hcC5iZWdpbigpLCBtYXAuZW5kKCksIGV0Yy4KCgkgICAgICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG1hcC5pdGVyYXRvcigpIHJldHVybnMgYSBzYWZlCgkgICAgICAnY2xvc2VkJyBpdGVyYXRvciwgd2hpbGUgbWFwLmJlZ2luKCkgYW5kIG1hcC5lbmQoKSBhcmUKCSAgICAgICdvcGVuJyBpdGVyYXRvcnMuCgoJICAgICAgQSAnY2xvc2VkJyBpdGVyYXRvciBrbm93cyB0aGUgYmVnaW4gYW5kIHRoZSBlbmQgb2YgdGhlCgkgICAgICBzZXF1ZW5jZSwgYW5kIGl0IG5ldmVyIGNhbiBzZWcuIGZhdWx0LiBBbiAnb3BlbicKCSAgICAgIGl0ZXJhdG9yLCBhcyBpbiBDKyssIGNhbiBzZWcuIGZhdWx0IGF0IHRoZSBDKysgc2lkZS4KCgkgICAgICAgICAjIGEgY2xvc2VkIGl0ZXJhdG9yIGlzIHNhZmUgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLgoJCSAjIHRoZSBuZXh0KCkgbWV0aG9kIHdpbGwgdGhyb3cgYSBTdG9wSXRlcmF0aW9uCgkgICAgICAgICAjIGV4Y2VwdGlvbiBhcyBuZWVkZWQKCQoJICAgICAgICAgaSA9IHNlcS5pdGVyYXRvcigpCgkJIHRyeToKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CgkJICAgICAgICBzdW0gKz0gaS5uZXh0KCkKCQkgZXhjZXB0OiBwYXNzCgkJIAoJCSAjIGFuIG9wZW4gaXRlcmF0b3IgYWx3YXlzIG5lZWQgdG8gYmUgY2hlY2tlZCwKCQkgIyBvciBpdCB3aWxsIGNyYXNoIGF0IHRoZSBDKysgc2lkZQoKCSAgICAgICAgIGN1cnJlbnQgPSBzZXEuYmVnaW4oKQogICAgICAgICAgICAgICAgIGVuZCA9IHNlcS5lbmQoKQoJCSB3aGlsZSAoY3VycmVudCAhPSBlbmQpOgoJCSAgICBzdW0gKz0gY3VycmVudC5uZXh0KCkKCSAgICAgIAoJICAgICAgCgkgICAgW1B5dGhvbl0KCSAgICAtIEZpbmFsbHksIHdoZW4gd2UgY2FsbCAKCgkgICAgICAgIGYgPSBGb28oKQoKCSAgICAgIHRoZSBjb25zdHJ1Y3Rpb24gaXMgJ29uZS13YXknLiBCZWZvcmUgY29uc3RydWN0aW9uICB3YXMgZG9uZQoJICAgICAgc29tZXRoaW5nIGxpa2UKCgkgICAgICAgICAgRm9vKCkgKHB5dGhvbikgLT4gX25ld19Gb28oKSAoQysrKSAKICAgICAgICAgICAgICAgICAgbmV3X0ZvbygpIChDKyspIC0+IEZvb1B0cigpIChweXRob24pIAogICAgICAgICAgICAgICAgICBGb29QdHIoKSAocHl0aG9uKSAtPiBGb28oKSAocHl0aG9uKQoKICAgICAgICAgICAgICBhbmQgcmV0dXJuaW5nIGEgcG9pbnRlciB3YXMgZG9uZSBsaWtlCgogICAgICAgICAgICAgICAgICBOZXdQb2ludGVyT2JqKCkgKEMrKykgLT4gRm9vUHRyKCkgKHB5dGhvbikKICAgICAgICAgICAgICAgICAgRm9vUHRyKHB5dGhvbikgLT4gRm9vKCkgKHB5dGhvbikKICAgICAgICAgICAgICAgICAgCQkgIAoKCSAgICAgIGllLCB3ZSB3aGVuIGdvaW5nIGJhY2sgYW5kIGZvcndhcmQgYmV0d2VlbiB0aGUgQysrIGFuZAoJICAgICAgcHl0aG9uIHNpZGUuCgoJICAgICAgTm93IHNpbmNlIHRoZXJlIGlzIG5vIEZvb1B0ciB0aGUgY29uc3RydWN0aW9uIHByb2Nlc3MgaXMKCgkgICAgICAgICAgRm9vKCkgKHB5dGhvbikgLT4gX25ld19Gb28oKSAoQysrKQogICAgICAgICAgICAgICAgICBfbmV3X0ZvbygpIChDKyspIC0+IE5ld1BvaW50ZXJPYmooKSAoQysrKSAobm8gc2hhZG93IGNsYXNzKQoKICAgICAgICAgICAgICBhbmQgcmV0dXJuaW5nIGEgcG9pbnRlciBpcyBkb25lCgogICAgICAgICAgICAgICAgICBOZXdQb2ludGVyT2JqKCkgKEMrKykgKHdpdGggc2hhZG93IGNsYXNzKSAtPiBOZXdJbnN0YWNlT2JqKCkgKEMrKykKCgkgICAgICB3aGVyZSBOZXdJbnN0YW5jZU9iaiBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIHdpdGhvdXQKCSAgICAgIGNhbGxpbmcgX19pbml0X18gYW5kIGl0IGRvZXNuJ3QgZ28gJ2JhY2snIHRvIHB5dGhvbiwgaXMKCSAgICAgICdwdXJlJyBDIEFQSS4KCgkgICAgIC0gV2l0aCB0aGlzIGNoYW5nZSwgYW5kIHRoZSBvdGhlciBvbmVzIGluIHRoZQogICAgICAgICAgICAgICBQeVN3aWdPYmplY3QgdHlwZSwgd2hpY2ggbm93IGNhcnJpZXMgdGhlIHRoaXNvd24gYW5kCiAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvIHBvaW50ZXIsIHRoZSBnZW5lcmF0ZWQgY29kZSBzaG91bGQgYmUgYXMKICAgICAgICAgICAgICAgZmFzdCBhcyBib29zdDo6UHl0aG9uIGFuZC9vciB0aGUgb3RoZXIgcHl0aG9uIHdyYXBwZXJzCiAgICAgICAgICAgICAgIGJhc2VkIGluIHB1cmUgUHl0aG9uL0MgQVBJIGNhbGxzLgoKCSAgICAgICBBcyBhIHJlZmVyZW5jZSwgdGhlIHByb2ZpbGV0ZXN0X3J1bm1lLnB5IGV4YW1wbGUsIHdoaWNoCgkgICAgICAgZG9lcyBhIHNpbXBsZSBjYWxsIGZ1bmN0aW9uIG1hbnkgdGltZXMsIHN1Y2ggYXMgdGhpcyBjb2RlOgoKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgcHJvZmlsZXRlc3QgICAgICAgCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCQkgICAgYSA9IHByb2ZpbGV0ZXN0LkEoKSAgICAgIAoJCSAgICBiID0gcHJvZmlsZXRlc3QuQigpICAgICAgCgkJICAgIGZvciBpIGluIHJhbmdlKDAsMTAwMDAwMCkKCSAgICAgICAgICAgICAgYSA9IGIuZm4oYSkgICAgICAgICAgICAKCgoJICAgICAgIHdoZXJlIGZuIGlzIGRlZmluZWQgYXMgJ0EqIEI6OmZuKEEgKmEpIHtyZXR1cm4gYTt9JywKCSAgICAgICBwcm9kdWNlcyAgdGhlIGZvbGxvd2luZyB0aW1lcwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbW9kZXJuICAgIG1vZGVybgoJICAgICAgICAgc3dpZy0xLjMuMjYgICAgMTkuNzBzICAgICAgNS45OHMKICAgICAgICAgICAgICAgICBzd2lnLUNWUyAgICAgICAgMC45OXMgICAgICAwLjk4cwoJICAgICAgIAoKCSAgICAgICBDbGVhcmx5LCB0aGVyZSBpcyBhIGxhcmdlIGltcHJvdmVtZW50IGZvciB0aGUgcHl0aG9uCgkgICAgICAgJ25vbW9kZXJuJyBtb2RlLiBTdGlsbCwgdGhlICdtb2Rlcm4nIG1vZGUgaXMgYXJvdW5kCgkgICAgICAgNiB0aW1lcyBmYXN0ZXIgdGhhbiBiZWZvcmUuIEZvciB0aGUgc2FtZSB0ZXN0LCBidXQKCSAgICAgICB1c2luZyB0aGUgbm9uLXNoYWRvdyB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUsIHdlIGdldAoKCSAgICAgICAgICAgICAgICAgICAgICAgX3Byb2ZpbGV0ZXN0IChub24tc2hhZG93KQoJICAgICAgICAgc3dpZy0xLjMuMjYgICAgIDAuODBzIAogICAgICAgICAgICAgICAgIHN3aWctQ1ZTICAgICAgICAwLjYwcyAKCgkgICAgICAgSGVuY2UsIG5vdyBmb3IgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGUgcHJveHkgb3ZlcmhlYWQKCSAgICAgICBpcyBpbnNpZ25pZmljYW50LgoKCSAgICAgICBOb3RlIHRoYXQgdGhlIHBlcmZvcm1hbmNlIG51bWJlcnMgd2UgYXJlIHNob3dpbmcgaXMgZm9yCgkgICAgICAgYSBzaW1wbGUgbW9kdWxlICh0d28gdHlwZXMpIGFuZCBhIHNpbXBsZSBmdW5jdGlvbiAob25lCgkgICAgICAgYXJndW1lbnQpLiBGb3IgcmVhbCBzaXR1YXRpb25zLCBmb3IgbW9kdWxlcyB3aXRoIG1hbnkKCSAgICAgICBtb3JlIHR5cGVzIGFuZC9vciBmdW5jdGlvbnMgd2l0aCBtYW55IG1vcmUgcGFyYW1ldGVycywKCSAgICAgICB5b3Ugd2lsbCBzZWUgZXZlbiBiZXR0ZXIgcmVzdWx0cy4KCSAgICAgICAKCQkgIAkgICAgICAKMTAvMzEvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0KCgkgICAgLSBGaW5hbGx5LCBubyBtb3JlIENsYXNzUHRyIHByb3h5IGNsYXNzZXMuIFlvdSB3aWxsIHNlZQoJICAgICAgb25seSBhIGNsZWFuIENsYXNzIHByb3h5IGNsYXNzIGluIHRoZSAucHkgZmlsZS4KCgkgICAgLSBObyBtb3JlICdyZWFsJyB0aGlzb3duIGF0dHJpYnV0ZSBlaXRoZXIsIHRoZSBQeVN3aWdPYmplY3Qgbm93CiAgICAgICAgICAgICAgY2FycmllcyB0aGUgb3duZXJzaGlwIGluZm8uCgoJICAgICAgWW91IGNhbiBhbHNvIGRvIHNvbWV0aGluZyBsaWtlCgoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBUcnVlCgkJICAKCQkgIHNlbGYudGhpcy5kaXNvd24oKQoJCSAgc2VsZi50aGlzLm93bigwKQoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBGYWxzZQkJICAKCgkJICBzZWxmLnRoaXMuYWNxdWlyZSgpCgkJICBzZWxmLnRoaXMub3duKDEpCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IFRydWUKCgkgICAgICBTdGlsbCB0aGUgb2xkIHdheSwKCSAgICAgIAoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IFRydWUKCgkJICBzZWxmLnRoaXNvd24gPSAwCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gRmFsc2UJCSAgCgoJCSAgc2VsZi50aGlzb3duID0gMQoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IFRydWUKCiAgICAgICAgICAgICAgaXMgc3VwcG9ydGVkLCBhbmQgcHl0aG9uIGRpc3BhdGNoZXMgdGhlIHByb3BlciBtZXRob2QKICAgICAgICAgICAgICBjYWxscyBhcyBuZWVkZWQuIAkJICAKCSAgICAgICAKCgkgICAgLSBTdXBwb3J0IGZvciBpdGVyYXRvcnMgaW4gU1RML1NURCBjb250YWluZXJzLCBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKCiAgICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlPHNldF9zdHJpbmc+IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjsKCSAgICAgICAgICAKICAgICAgICAgICAgICAgeW91IGNhbiB1c2UgdGhlIEMrKyBpdGVyYXRvcnMgYXM6ICAKCiAgICAgICAgICAgICAgICAgICAgIHMgPSBzZXRfc3RyaW5nKCkKCQkgICAgICAgICAgICAgICAgICAgICAKCQkgICAgIHMuYXBwZW5kKCJjIikgICAKCQkgICAgIHMuYXBwZW5kKCJhIikgICAKCSAgICAgICAgICAgICBzLmFwcGVuZCgiYiIpCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkJICAgICBlID0gcy5lbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYi5uZXh0KCkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiYWJjIiAKCgkJYWR2YW5jZSB0aGUgaXRlcmF0b3IgYXMgaW4gQysrCgogICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gcy5iZWdpbigpICAgICAgCgkJICAgICBjdXJyZW50ICs9IDEKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgY3VycmVudC52YWx1ZSgpCgkJICAgICA+Pj4gImIiCgkJICAgICAKCQlub3cgdXNpbmcgdGhlIHJldmVyc2Ugb3BlcmF0b3JzCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5yYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMucmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBiLm5leHQoKSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJjYmEiIAoKCSAgICAgICAgb3IgdGhlICdwcmV2aW91cycgbWV0aG9kCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkJICAgICBlID0gcy5lbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gZS5wcmV2aW91cygpCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJjYmEiIAoKICAgICAgICAgICAgICAgIG9yIGp1c3QgYXMgaW4gYSBweXRob24gZmFzaGlvbgoKICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gczoKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBOb3RlIDE6IEl0ZXJhdG9ycyBpbiBDKysgYXJlIHZlcnkgcG93ZXJmdWwsIGJ1dAogICAgICAgICAgICAgICAgZGFuZ2Vyb3VzIHRvby4gQW5kIGluIHB5dGhvbiB5b3UgY2FuIHNob290IHlvdXJzZWxmIGluIHRoZSBmb290CiAgICAgICAgICAgICAgICBqdXN0IGxpa2UgaW4gQysrLCBzbywgYmUgY2FyZWZ1bC4KCQkKCQlOb3RlIDI6IHRoZSBpdGVyYXRvcnMgYXJlICdsaWdodCcsIGllLCB0aGV5IGRvIG5vdAoJCWNvbnZlcnQgc2VxdWVuY2UgZWxlbWVudHMgdW50aWwgeW91IHJlcXVlc3QgdG8gZG8gc28sIHZpYQoJCW5leHQoKSwgdmFsdWUoKSBvciBwcmV2aW91cygpLiBJZiB5b3UganVzdCBpbmNyZW1lbnQvZGVjcmVtZW50IG9uZQoJCW5vIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJICAgICAgICAgICAgIGIgKz0gMQogICAgICAgICAgICAgICAgICAgICBiLmluY3IoKQogICAgICAgICAgICAgICAgICAgICBiLmluY3IoMikKCQkgICAgIGIuZGVjcigyKQogICAgICAgICAgICAgICAgICAgICBiLmRlY3IoKQogICAgICAgICAgICAgICAgICAgICBiIC09IDEKCgkJIG9ubHkgdGhlIGl0ZXJhdG9yIGlzIG1vZGlmaWVkLCBhbmQgbm90IHZhbHVlIHdyYXBwZXIKCQkgaXMgZ2VuZXJhdGVkLiBPdGhlciB0eXBpY2FsIEMrKyBvcGVyYXRpb25zIGFyZSBhbHNvIAoJCSBhdmFpbGFibGUsIHN1Y2ggYXM6CgoJCSAgICAgcHJpbnQgcy5lbmQoKSAtIHMuYmVnaW4oKQoJCSAgICAgPj4+IDMKCQkgICAgIGYgPSBzLmJlZ2luKCkgKyAxCgkJICAgICBwcmludCBmLnZhbHVlKCkKCQkgICAgID4+PiAiYiIKCQkgICAgIGwgPSBzLmVuZCgpIC0gMQoJCSAgICAgcHJpbnQgbC52YWx1ZSgpCgkJICAgICA+Pj4gImMiCgkJIAoJCSBldGMuICBPZiBjb3Vyc2UsIHRoZSAnZmluZCcsICdpbnNlcnQnLCAnZXJhc2UnLCBhbmQKCQkgc28gb24gbWV0aG9kcyBhbHNvIHN1cHBvcnRzIGl0ZXJhdG9ycyBub3csIGllOgoKCQkgICAgICBpID0gcy5iZWdpbigpCgkJICAgICAgaSArPSAxCgkJICAgICAgcy5lcmFzZShpKQogICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gczoKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBpCgkJICAgICAgcHJpbnQgc3VtCgkJICAgICAgPj4+ICJhYyIKCQkgICAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgIFRoZXJlIGlzIG5vIG1vcmUgJ3RoaXNvd24nIGF0dHJpYnV0ZS4gSWYgeW91IHVzZSBpdCwgcHl0aG9uCgkgICAgd2lsbCB0cmFuc2xhdGUgdGhlIGZvbGxvd2luZyBjb2RlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgaWYgKHNlbGYudGhpc293bik6ICAgPT0+ICAgaWYgKHNlbGYudGhpcy5vd24oKSk6CgkJc2VsZi50aGlzb3duID0gMSAgICAgPT0+ICAgc2VsZi50aGlzLm93bigxKQogICAgICAgICAgICAgICAgc2VsZi50aGlzb3duID0gMCAgICAgPT0+ICAgc2VsZi50aGlzLm93bigwKQoKCSAgICBTdGlsbCwgbWF5YmUgaW4gc29tZSB1bnVzdWFsIGNhc2VzIHRoZSB0cmFuc2xhdGlvbiB3aWxsIG5vdCBiZQoJICAgIDEwMCUgY29ycmVjdCwgc28gaWYgeW91IGhhdmUgYSBwcm9ibGVtLCBwbGVhc2UgcmVwb3J0IGl0CgkgICAgYW5kL29yIHVzZSB0aGUgbmV3ICdzZWxmLnRoaXMub3duKCknIGFjY2Vzc29yLgoJICAgIAoJICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCSAgICAKCSAgICBUaGVyZSBpcyBubyBtb3JlIENsYXNzUHRyIGNsYXNzZXMgaW4gdGhlIHB5dGhvbiBjb2RlLiBIZW5jZSwKCSAgICBpZiBpbiB0aGUgcGFzdCB5b3UgbmVlZGVkIHRvIHJlc29ydCB0byBzb21lIGtpbmQgb2YgdHJpY2tlcnkKCSAgICB3aXRoIHRoZW0sIG9yIG92ZXJjb21lIHRoZWlyIHByZXNlbmNlLCBpdCBpcyBubyBsb25nZXIKCSAgICByZXF1aXJlZCwgYnV0IHRoZSBleHRyYSBjb2RlIHlvdSBhZGRlZCBjb3VsZCBub3cgYnJlYWsKCSAgICB0aGluZ3MuCgoJICAgIElmIG5lZWRlZCwgeW91IGNhbiB1c2UgdGhlIG9wdGlvbiAtY2xhc3NwdHIsIGkuZS4sCgogICAgICAgICAgICAgICBzd2lnIC1jbGFzc3B0ciAtcHl0aG9uIC4uLgoKCSAgICB0byBnZW5lcmF0ZSB0aGUgb2xkIENsYXNzUHRyIGNsYXNzZXMuCgoKMTAvMzAvMjAwNTogbWtvZXBwZSAKCSAgICBbR3VpbGVdIE1ha2UgZGVjbGFyZWQgYW5kIGRlZmluZWQgbGlua2FnZSBvZiBTV0lHX2luaXQgY29uc2lzdGVudC4gIAoJICAgIFJlcG9ydGVkIGJ5IFN0ZXZlbiBHLiBKb2huc29uIChTRiBwYXRjaCAxMzE1NDk4KS4KCjEwLzI2LzIwMDU6IG1tYXR1cwoKCSAgLSBBZGRlZCB0aGUgYXR0cmlidXRlLmkgZmlsZSB0byB0aGUgZ2xvYmFsIGxpYnJhcnkgZGlyZWN0b3IuCgkgICAgTm93IGl0IGNhbiBiZSB1c2VkIGZyb20gb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IHVzZQoJICAgIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSBhcyB3ZWxsLgoKCSAgICBTbywgaWYgeW91IGhhdmUgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgICVpbmNsdWRlIGF0dHJpYnV0ZS5pCgogICAgICAgICAgICAgICAlYXR0cmlidXRlKEEsIGludCwgYSwgZ2V0X2EsIHNldF9hKTsKCSAgICAgICAJCQkJICAgICAgCSAgCgkgICAgICAgc3RydWN0IEEJCQkgICAgICAJICAKCSAgICAgICB7ICAgIAkJCQkgIAoJICAgICAgICAgaW50IGdldF9hKCkgY29uc3Q7IAkJICAKCSAgICAgICAgIHZvaWQgc2V0X2EoaW50IGFhKTsgCQkgIAoJICAgICAgIH07CQkJCSAgCgogICAgICAgICAgICAgICAlYXR0cmlidXRlX3JlZihCLCBpbnQsIGMpOwoJICAgICAgIAkJCQkKCSAgICAgICBzdHJ1Y3QgQgkJCQoJICAgICAgIHsgICAgCQkJCgkgICAgICAgICBpbnQmIGMoKTsgCQkKCSAgICAgICB9OyAKCgkgICAgdGhlbiBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlIHRoZSAnQS5hJyBhbmQgJ0IuYycgYXR0cmlidXRlcyB3aWxsCgkgICAgYmUgdmlzaWJsZSwgaWUsIHlvdSBjYW4gYWNjZXNzIHRoZW0gYXMgcGxhaW4gdmFyaWFibGVzOgoKICAgICAgICAgICAgICAgZiAgID0gQSgpCiAgICAgICAgICAgICAgIGYuYSA9IDMKICAgICAgICAgICAgICAgZyAgID0gQigpCiAgICAgICAgICAgICAgIGcuYyA9IDMgCiAgICAgICAgICAgCgkgICAgICAgaCAgID0gZi5hICsgZy5jCgoJICAgIGFuZCB0aGUgcHJvcGVyIGdldC9zZXQgbWV0aG9kcyB3aWxsIGJlIGRpc3BhdGNoZWQuIFNlZQoJICAgIGF0dHJpYnV0ZS5pIGZvciBtb3JlIGluZm8uCiAgIAogICAgICAgICAgLSBNb3JlIGNsZWFudXBzIGFyb3VuZCBhbmQgYWRkaW5nIG1vcmUgdGVzdC1jYXNlcy4gVGhlCiAgICAgICAgICAgIERJU09XTiB0eXBlbWFwIG5vdyBpcyB0ZXN0ZWQgYW5kIHdvcmtpbmcgaW4gYWxsIHRoZQogICAgICAgICAgICBsYW5ndWFnZXMgdGhhdCB1c2UgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LCBpZSwgdGNsLAogICAgICAgICAgICBydWJ5LCBwZXJsIGFuZCBweXRob24uCgkgICAgCgoxMC8yNS8yMDA1OiBtbWF0dXMKCgkgICAgLSBQZXJsLCBjb21wbGV0ZSB0aGUgRElTT1dOIHR5cGVtYXAuCgkgICAgCgkgICAgLSBhZGRlZCB0aGUgYXR0cmlidXRlLmkgZmlsZSB0byB0aGUgdW5pZmllZCB0eXBlbWFwCiAgICAgICAgICAgICAgbGlicmFyeSAoYmVmb3JlIHdhcyBvbmx5IHVzYWJsZSBmcm9tIHB5dGhvbikuCgoJICAgIC0gdW5pZnkgdGhlIG5hbWVzIGZvciB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIgbWV0aG9kcyBpbgoJICAgICAgcGVybCx0Y2wscnVieSBhbmQgcHl0aG9uLCBzbywgdGhlIGF0dHJpYnV0ZS5pIGxpYnJhcnkKCSAgICAgIGNhbiB3b3JrIGFjcm9zcyB0aGVtLgoJICAgICAgCgkgICAgLSBzZWUgdGhlIGxpX2F0dHJpYnV0ZS5pIHRlc3QtY2FzZSBvciB0aGUgbGlicmFyeSBmaWxlCgogCSAgICAgICAgTGliL3R5cGVtYXBzL2F0dHJpYnV0ZS5zd2cKCiAgICAgICAgICAgICAgZm9yIG1vcmUgaW5mbyBhYm91dCBob3cgdG8gdXNlIGl0LgoKIAoJICAgICAgCgoxMC8yNC8yMDA1OiBtbWF0dXMKCgkgICAgLSBQZXJsIG5vdyB1c2VzIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeS4KCgkgICAgLSBDaGFuZ2VzIGluIHJ1YnkgdG8gdXNlIHRoZSAkdHJhY2sgb3B0aW9uIGluIHR5cGVtYXBzLgoKCSAgICAtIENoYW5nZXMgaW4gdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5IHRvIGZvbGxvdyB0aGUKCSAgICAgIGNvbnZlbnRpb24gdGhhdCBhbGwgbWFjcm9zIHRoYXQgYXJlIG5vdCB1c2VkIGluIHRoZQoJICAgICAgQy9DKysgc2lkZSBzdGFydHMgd2l0aCAlLCBzdWNoIGFzCgoJICAgICAgICAgICAlZGVsZXRlCgkJICAgJW5ld19hcnJheQoKICAgICAgICAgICAgICBldGMuCgkgICAgICAKCSAgICAtIERvY3VtZW50aW5nIGZyYWdtZW50cywgc2VlIGZyYWdtZW50cy5zd2cuCgoJICAgIC0gQ2xlYW5lciB3YXkgdG8gdXNlIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSwgaW5jbHVkZQoJICAgICAganVzdCA8dHlwZW1hcHMvc3dpZ3R5cGVzLnN3Zz4uCgoJICAgICAgQ2hlY2sgc29tZSBvZiB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlczogcGVybCwgdGNsLCBydWJ5LAoJICAgICAgcHl0aG9uLgoKCSAgICAgIEFsd2F5cyBzdGFydCB3aXRoIHRoZSBoZWFkIGZpbGUsIHN1Y2ggYXMKCgkgICAgICAgICBweXRob24vcHl0aG9uLnN3ZwoJICAgICAgICAgdGNsL3RjbDguc3dnCgkgICAgICAgICBydWJ5L3J1Ynkuc3dnCgkgICAgICAgICBwZXJsNS9wZXJsNS5zd2cKCiAgICAgICAgICAgICAgYW5kIHRoZSBwcmluY2lwYWwgZmlsZSB0aGF0IGludm9rZXMgdGhlIHVuaWZpZWQgbGlicmFyeSwgc3VjaCBhcwoKCSAgICAgICAgIHB5dGhvbi9weXR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICB0Y2wvdGNsdHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHJ1YnkvcnVieXR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICBwZXJsL3Blcmx0eXBlbWFwcy5zd2cJICAgIAoJICAgIAoJICAgICAgVGhlIGZpbGUgdGhhdCBwcm92aWRlIHRoZSBzcGVjaWFsaXphdGlvbiBmb3IgZWFjaAoJICAgICAgbGFuZ3VhZ2UgYXJlIHRoZSBvbmUgdGhhdCBwcm92aWRlcyB0aGUgYmFzaWMgdHlwZXM6CgoJICAgICAgICAgcHl0aG9uL3B5cHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHJ1YnkvcnVieXByaW10eXBlcy5zd2cJCgkgICAgICAgICB0Y2wvdGNscHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHBlcmw1L3BlcmxwcmltdHlwZXMuc3dnCgoJICAgICAgYW5kIHRoZSBzdHJpbmcgbWFuaXB1bGF0aW9uOiAgCSAKCSAgICAKCSAgICAgICAgIHB5dGhvbi9weXN0cmluZ3Muc3dnCQoJICAgICAgICAgcnVieS9ydWJ5c3RyaW5ncy5zd2cJCgkgICAgICAgICB0Y2wvdGNsc3RyaW5ncy5zd2cJCgkgICAgICAgICBwZXJsNS9wZXJsc3RyaW5ncy5zd2cKCgkJIAoJICAgICAgVGhlIHJlc3Qgb2YgdGhlIGZpbGVzLCBzdWNoIGFzIGNhcnJheS5pLCBhcmUgbW9zdGx5IG9uZSAKCSAgICAgIGxpbmUgZmlsZXMgdGhhdCBpbmNsdWRlIHRoZSBwcm9wZXIgdHlwZW1hcCBsaWJyYXJ5CgkgICAgICB2ZXJzaW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgaW4gUGVybCAqKioKCgkgICAgU29tZSBtaXNzaW5nL3dyb25nIHR5cGVtYXBzIGNvdWxkIHN0YXJ0IHdvcmtpbmcgcHJvcGVybHksCgkgICAgYW5kIGNoYW5nZSB0aGUgb2xkIGV4cGVjdGVkIGJlaGF2aW9yIGluIFBlcmwuCgoxMC8yMy8yMDA1OiB3dXp6ZWIKICAgICAgICAgICAgQ2hpY2tlbjoKICAgICAgICAgICAgICArIHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMgZmluYWxseSB3b3JrIHByb3Blcmx5CiAgICAgICAgICAgICAgKyBhZGQgdGVzdCBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgdG8gY3BwX2Jhc2ljLmkKCjEwLzIwLzIwMDU6IGRhbmN5CgkgICAgW2FsbGVncm9jbF0gQWRkZWQgQysrIHN1cHBvcnQuIExhcmdlIHVwZGF0ZSwgbWFueSBjaGFuZ2VzLiBTZWUKCSAgICBuZXdseSBhZGRlZCBBbGxlZ3JvIENvbW1vbiBMaXNwIHNlY3Rpb24gaW4gbGlzcC5odG1sCgoxMC8yMC8yMDA1OiBtbWF0dXMKCSAgICBSdWJ5LCBUY2wsIFB5dGhvbjoKCgkgICAgLSBVbmlmb3JtIHdheSB0byBmYWlsIChsYWJlbCBmYWlsOiksIG5vdyBmaW5hbGx5CgkgICAgICBTV0lHX2V4Y2VwdGlvbiB3b3JrcyBhY3Jvc3MgdGhlIHRocmVlIGxhbmd1YWdlcyBhbmQgYWxsCgkgICAgICB0aGUgdHlwZW1hcHMuCgoJICAgIC0gQWRkIHByb3BlciBjbGVhbnVwIGNvZGUgdG8gcnVieQoKCSAgICAtIE1vcmUgdmFsZ3JpbmQgZml4ZXMKCgkgICAgLSBTaW1wbGlmeSB0aGUgaW5saW5lIHVzZSwgaXQgc2VlbXMgYSBzbWFsbCBpbnRlcmZhY2Ugb2YKCSAgICAgIDIwLDAwMCBsaW5lcyAocGx1cyBtYW55IG1hbnkgdGVtcGxhdGVzKSBjYW4gYnJlYWsgCgkgICAgICBnY2MgLU8zIGVhc2lseS4KCgkgICAgLSBGaW5hbGl6ZSB0aGUgdHlwZW1hcHMgbGlicmFyeS4gQWxsIHRoZSBvbGQgICouaSBmaWxlcwoJICAgICAgKGNhcnJheS5pLCBjcG9pbnRlci5pLCBleGNlcHRpb24uaSkgaGFkIGJlZW4gaW1wbGVtZW50ZWQKCSAgICAgIGluIHRoZSBuZXcgdHlwZW1hcHMgbGlicmFyeS4KCSAgICAKCjEwLzE5LzIwMDU6IHd1enplYgoJICAgIFVwZGF0ZSB0aGUgUnVudGltZSBUeXBlbWFwIGRvY3VtZW50YXRpb24gaW4gVHlwZW1hcHMuaHRtbAoKMTAvMTgvMjAwNTogd3V6emViCgkgICAgQ2hpY2tlbjoKCSAgICAgIC0gQ29ycmVjdGx5IGhhbmRsZSAlaWdub3JlZCBjbGFzc2VzCiAgICAgICAgICAgICAgLSBDb3JyZWN0bHkgY29udmVydCBsb25nLCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGV0YwogICAgICAgICAgICAgICAgdG8gY2hpY2tlbiBwcmltaXRpdmVzLiAoVGhhbmtzIHRvIEZlbGl4IFdpbmtlbG1hbm4pCiAgICAgICAgICAgICAgLSBVc2luZyBhcmdvdXQgcGFyYW1ldGVycyB3aGVuIHRoZSByZXR1cm4gdmFsdWUgd2FzIGEKICAgICAgICAgICAgICAgIHdyYXBwZWQgcG9pbnRlciBjYXVzZWQgYSBtZW1vcnkgY29ycnVwdGlvbi4gIFRoZSBjaGlja2VuCiAgICAgICAgICAgICAgICBnYXJiYWdlIGNvbGxlY3RvciBtb3ZlZCBhIHBvaW50ZXIgb3V0IGZyb20gdW5kZXIgdXMuCiAgICAgICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCBieSBydW5uaW5nIGFsbCB0aGUgcHJveHkgY3JlYXRpb24KICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBhcyBjb250aW51YXRpb25zIGFmdGVyIHRoZSB3cmFwcGVyIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICByZXR1cm5zLiAgQXMgcGFydCBvZiB0aGlzLCB3ZSBubyBsb25nZXIgbmVlZCB0aGUKICAgICAgICAgICAgICAgIGNoaWNrZW5mYXN0cHJveHkgZmxhZyBvbiBvdXRwdXQgdHlwZW1hcHMuCiAgICAgICAgICAgICAgLSB1c2luZyAtcHJveHkgYW5kIC1ub2NvbGxlY3Rpb24gdG9nZXRoZXIgd29ya3Mgbm93CiAgICAgICAgICAgICAgICBCZWZvcmUsIGl0IHdhcyBub3QgZXhwb3J0aW5nIHRoZSBkZXN0cnVjdG9yIGluIHRoZSBwcm94eQogICAgICAgICAgICAgICAgd3JhcHBlci4KCjEwLzE4LzIwMDU6IG1tYXR1cwoJICAgIAoJICAgIEFkZGVkIHRoZSBVbmlmaWVkIFR5cGVtYXAgTGlicmFyeSAoVVRMKS4gSXQgdW5pZmllcyB0aGUgdHlwZW1hcHMgZm9yCgogCSAgICAgICAgcHl0aG9uLCBydWJ5LCB0Y2wKCgkgICAgYW5kIGluIHRoZSBwcm9jZXNzLCBmaXhlcyBzZXZlcmFsIHByb2JsZW1zIGluIGVhY2ggb2YgdGhlIHRocmVlCgkgICAgbGFuZ3VhZ2VzIHRvIHdvcmsgaW4gYSAiY2Fub25pY2FsIiB3YXkgbm93IGVzdGFibGlzaGVkIGluCgkgICAgdGhlIHR5cGVtYXAgbGlicmFyeQoJICAgIAoJICAgICAgIFNXSUcvTGliL3R5cGVtcGFzCgoJICAgIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdW5pZmljYXRpb24gaXMgdGhhdCBldmVyeXRoaW5nCgkgICAgY29tcGlsZXMgYW5kIHJ1bnMgaW5zaWRlIHRoZSB0ZXN0LXN1aXRlIGFuZCBleGFtcGxlcwoJICAgIGRpcmVjdG9yaWVzLiBBbmQgZm9yIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgdGhyZWUKCSAgICBsYW5ndWFnZXMgdGhhbiBwYXNzIHRoZSBwcmltaXRpdmVfdHlwZXMuaSBjYXNlLgoKCSAgICBBbHNvLCB3ZSBoYXZlIGEgdW5pZm9ybSB3YXkgdG8gdHJlYXQgdGhlIGVycm9ycywgZm9yIGV4YW1wbGUKCSAgICBpZiB5b3UgZG8gc29tZXRoaW5nIGxpa2UKCgkgICAgICA+Pj4gZnJvbSBwcmltaXRpdmVfdHlwZXMgaW1wb3J0ICoKICAgICAgICAgICAgICA+Pj4gcHJpbnQgdmFsX3VjaGFyKDEwKQogICAgICAgICAgICAgIDEwCgkgICAgICA+Pj4gcHJpbnQgdmFsX3VjaGFyKDEwMDApCiAgICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgkJICAgICAgCgkgICAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8JCQkgICAgCgkgICAgICBPdmVyZmxvd0Vycm9yOiBpbiBhcmd1bWVudCAxIG9mIHR5cGUgJ3Vuc2lnbmVkIGNoYXInCgoJICAgIHlvdSBnZXQgdGhlIHNhbWUgZXhjZXB0aW9uIGluIGFsbCB0aGUgdGhyZWUgbGFuZ3VhZ2VzLgoJICAgIAoJICAgIEFuZCB3ZWxsLCBtYW55IG1vcmUgZ29vZCB0aGluZ3Mgd2lsbCBjb21lIGZyb20gdGhpcwoJICAgIHVuaWZpY2F0aW9uLCBmb3IgZXhhbXBsZSwgcHJvcGVyIHN1cHBvcnQgb2YgdGhlIFNUTC9TVEQgY2xhc3NlcwoJICAgIGZvciBhbGwgdGhlIGxhbmd1YWdlcywgYW5kIGhvcGVmdWxseSwgd2UgY2FuIGtlZXAKCSAgICBhZGRpbmcgb3RoZXIgbGFuZ3VhZ2VzLgoKCSAgICBUaGUgaGFyZGVzdCBwYXJ0LCB3cml0aW5nIGEgY29tbW9uIHR5cGVtYXAgbGlicmFyeQoJICAgIHRoYXQgc3VpdGVzIHRoZSB0aHJlZSBkaWZmZXJlbnQgbGFuZ3VhZ2VzLCBpcyBkb25lLAoJICAgIGFuZCBhZGRpbmcgYW5vdGhlciBsYW5ndWFnZSBzaG91bGQgbm93IGJlIGVhc3kuIAoKCSAgICBTdGlsbCB0aGUgZ2xvYmFsIHVuaWZpY2F0aW9uIGlzIG5vdCBjb21wbGV0ZSwgdGhlIFNUTC9TVEQgCgkgICAgcGFydCBpcyBuZXh0LCBhbmQgcHJvYmFibHkgYXMgd2VsbCBhcyBhZGRpbmcgb25lIG9yIHR3byBtb3JlCgkgICAgbGFuZ3VhZ2VzLgoKCSAgICBJZiB5b3UgYXJlIGN1cmlvdXMsIGxvb2sgYXQgdGhlIHB5dGhvbiwgcnVieSBhbmQvb3IgdGNsCgkgICAgZGlyZWN0b3JpZXMgdG8gc2VlIHdoYXQgaXMgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIG5ldwoJICAgIGNvbW1vbiB0eXBlbWFwcyBsaWJyYXJ5LiAgU3RpbGwsIHRoZSBmaW5hbCB3YXkgdG8KCSAgICBpbnRlZ3JhdGUgYSBuZXcgbGFuZ3VhZ2UgY291bGQgY2hhbmdlIGFzIHdlIG1vdmUgdG8KCSAgICBpbnRlZ3JhdGUgdGhlIFNURC9TVEwuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBpbiBSdWJ5L1RjbCAqKioKCgkgICAgU29tZSBtaXNzaW5nL3dyb25nIHR5cGVtYXBzIGNvdWxkIHN0YXJ0IHdvcmtpbmcgcHJvcGVybHksCgkgICAgYW5kIGNoYW5nZSB0aGUgb2xkIGJlaGF2aW9yLCBzcGVjaWFsbHkgaW4gcnVieSBhbmQgdGNsLgoKVmVyc2lvbiAxLjMuMjcgKE9jdG9iZXIgMTUsIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdHlwZXNhZmUgZW51bSB3cmFwcGluZyBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvCiAgICAgICAgICAgIG92ZXJsb2FkIGEgbWV0aG9kIHdpdGggMiBkaWZmZXJlbnQgZW51bSB0eXBlcy4KCjEwLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWZlYXR1cmUoImltbXV0YWJsZSIsIjAiKSBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIHNldHRlcnMKICAgICAgICAgICAgZm9yIGNvbnN0YW50cy4KCiAgICAgICAgICAgIFJlc3RvcmVkICVpbW11dGFibGUgYW5kICVtYWtlZGVmYXVsdCB0byBjbGVhciB0aGUgZmVhdHVyZSBhcyBpdAogICAgICAgICAgICBiZWhhdmVkIGluIFNXSUctMS4zLjI1IGFuZCBlYXJsaWVyLgoKMTAvMTQvMjAwNTogbW1hdHVzCiAgICAgICAgICAgIEZpeCBidWcgaW4gYW5vbnltb3VzIHR5cGVkZWYgc3RydWN0dXJlcyB3aGljaCB3YXMgbGVhZGluZyB0bwogICAgICAgICAgICBzdHJhbmdlIGJlaGF2aW91ci4KCjEwLzEzLzIwMDU6IG1tYXR1cwoJICAgIFNldmVyYWwgbWlub3IgY2hhbmdlczoKCSAgICAKCSAgICAtIEltcHJvdmUgdGhlIHdjaGFyX3QgdHlwZSBzdXBwb3J0CgkgICAgLSBBZGQgYSB3YXJuaW5nIGZvciB3aGVuIHlvdSBkZWZpbmUgdGhlICdpbicgdHlwZW1hcCBidXQKCSAgICAgIHlvdSBkb24ndCBkZWZpbmUgdGhlICd0eXBlY2hlY2snIG9uZS4gVmVyeSBjb21tb24gbWlzdGFrZS4KCSAgICAtIEFkZCBwcm9wZXIgZGVmYXVsdCBydWxlIGZvciBmdW5jdGlvbiBwb2ludGVycywgbm93IHlvdQoJICAgICAgY2FuIGRlZmluZSBhIHR5cGVtYXAgc3VjaCBhczoKCgkgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKCgqKShBTlkpKSB7Li4ufQoKCSAgICAgIFRoYXQgd2lsbCBhcHBseSB0byBhbGwgdGhlIHBvaW50ZXIgdG8gZnVuY3Rpb25zLiBUaGUKCSAgICAgIHJ1bGUgaW4gQysrIGFsc28gYXBwbHkgdG8gdGhlIGZ1bmN0aW9uICdyZWZlcmVuY2UnLCBpZSwKCSAgICAgIGluIGJvdGggY2FzZXMKCgkgICAgICAgIHR5cGVkZWYgIGludCAoKmZwdHIpKGludCBhKTsKCSAgICAgICAgdHlwZWRlZiAgaW50IChmdW5jKShpbnQgYSk7CgoJICAgICAgVGhpcyB3YXMgbmVlZGVkIHNpbmNlIGl0IHNlZW1zIHRvIGJlICdpbGxlZ2FsJyBpbiBDKysgdG8KCSAgICAgIGRvIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgICAgIHZvaWQgKnB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4oZnB0cik7CgoJICAgICAgYW5kIHByb2JhYmx5LCBhcyBmb3IgbWVtYmVyIGZ1bmN0aW9ucywgaXQgaXMgbm90CgkgICAgICB3YXJyYW50aWVkIHRoYXQgdGhlIHBvaW50ZXIgc2l6ZXMgd2lsbCBtYXRjaC4KCgkgICAgLSBBZGQgdGhlICNlcnJvci8jd2FybmluZyBkaXJlY3RpdmVzIHRvIHN3aWcncyBjcHAuCgoJICAgIC0gQWRkIHRoZSBub2Jsb2NrIG9wdGlvbiBmb3IgdHlwZW1hcHMsIHdoaWNoIGlzIHVzZWQgYXMKICAgICAgICAgICAgICBmb2xsb3dzOiBzdXBwb3NlZCB5b3UgYSB0eXBlbWFwLCBsaWtlIHRoaXMKCgkgICAgICAKCSAgICAgICV0eXBlbWFwKGluLG5vYmxvY2s9MSkgSGVsbG8gewkJCSAgIAoJICAgICAgICAgLi4uLgogICAgICAgICAgICAgIH0KCgkgICAgICB0aGVuIHRoZSB0eXBlbWFwIHdpbGwgYmUgaW5zZXJ0ZWQgd2l0aG91dCB0aGUgYmxvY2sKCSAgICAgIGltcG9zZWQgYnkgdGhlIGJyYWNrZXRzLCBzaW1pbGFyIHRvCgoJICAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiLi4uIjsKCgkgICAgICBTbywgd2h5IHlvdSBkb24ndCBqdXN0IHVzZSB0aGUgcXVvdGUgc3R5bGU/LCBiZWNhdXNlOgoJICAgICAgCgkgICAgICAgICAxLi0gVGhlIHF1b3RlIHN0eWxlIGRvZXNuJ3QgZ2V0IHByZXByb2Nlc3NlZCwgZm9yIGV4YW1wbGUKCSAgICAgIAoJICAgICAgICAgICAgICAldHlwZW1hcChpbikgSGVsbG8gIiQxPSBTV0lHX21hY3JvKCQxKTsiOwoJICAgICAgCgkgICAgICAgICAgICAgaGVyZSwgU1dJR19tYWNybyBkb2Vzbid0IGdldCBleHBhbmRlZAoKICAgICAgICAgICAgICAgICAyLi0gSW5zaWRlIGEgcXVvdGUgdHlwZW1hcCwgeW91IGhhdmUgdG8gdXNlIAogICAgICAgICAgICAgICAgICAgICBxdW90ZXMgY2FyZWZ1bGx5CgoJCSAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiJDEgPSBcImhlbGxvXCIgIjsKCgkJIDMuLSBZb3UgY2FuJ3QgbWFrZSBlbWFjcyBhbmQvb3Igb3RoZXIgZWRpdG9ycwoJCSAgICAgdG8gaW5kZW50IGluc2lkZSBhIHN0cmluZyEuIAoKCgkgICAgICBTbywgd2h5IGRvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgYmxvY2s/LCBiZWNhdXNlIGFuIGV4dHJhCgkgICAgICBibG9jayB3aGVuIG5vdCBuZWVkZWQgKG5vIGxvY2FsIHZhcmlhYmxlcyBpbiBpdCk6CgoJICAgICAgICAgIDEuLSBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZAogICAgICAgICAgICAgICAgICAyLi0gbWFrZXMgdGhlIGNvZGUgbGFyZ2VyCiAgICAgICAgICAgICAgICAgIDMuLSBvciBpbiBzaG9ydCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3ZSBoYXZlIHRoZSBxdW90ZSBzdHlsZS4KClZlcnNpb24gMS4zLjI2IChPY3RvYmVyIDksIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBBZGRlZCAndGhyb3dzJyB0eXBlbWFwcy4KCjEwLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBsYW5ndWFnZXMgdGhhdCBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGluaGVyaXRhbmNlLiBUaGUKICAgICAgICAgICAgZmlyc3Qgbm9uLWlnbm9yZWQgY2xhc3MgaW4gdGhlIHB1YmxpYyBiYXNlIGNsYXNzIGxpc3QgaXMgdXNlZCBmb3IgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIGJ5IHRoZSBwcm94eSBjbGFzcy4gUHJldmlvdXNseSwgaWYgdGhlIGZpcnN0IGNsYXNzIGluIHRoZSBsaXN0IHdhcyBpZ25vcmVkLCB0aGVuCiAgICAgICAgICAgIHRoZSBwcm94eSBjbGFzcyB3b3VsZG4ndCBoYXZlIGFueSBiYXNlIGNsYXNzZXMuCgoxMC8wNy8yMDA1OiBtbWF0dXMKCSAgICAgVXBkYXRlIG1vcmUgZmVhdHVyZXMgdG8gZm9sbG93IG5ldyBjb252ZW50aW9uLCBpbmNsdWRpbmc6CgoJICAgICAgIGNhbGxiYWNrCgkgICAgICAgcmVmL3VucmVmCgkgICAgICAgZXhjZXB0CgkgICAgCgkgICAgIEFsbCBvZiB0aGVtIHVzZSBub3Qgb25seSB0aGUgZmVhdHVyZSBhcyBhIGZsYWcsIGJ1dCBhbHNvCgkgICAgIGFzIGNvZGUgdmFsdWUuIFRvIGRlYWwgd2l0aCB0aG9zZSBmZWF0dXJlcywgd2UgdXNlIG5vdwoJICAgICBHZXRGbGFnQXR0ciwgd2hpY2ggaXMgc2ltaWxhciB0byBHZXRGbGFnLCBidXQgaW5zdGVhZCBvcgoJICAgICByZXR1cm5pbmcgMSBvciAwLCBpdCByZXR1cm5zIHRoZSBhdHRyIHZhbHVlLCBpZiBoYXBwZW5zCgkgICAgIHRvIGJlIGRpZmZlcmVudCBvZiAiMCIgb2YgY291cnNlLgoKCSAgICAgTm93IHRoZXJlIGFyZSBhbHNvIG1vcmUgdW5pZm9ybSBkaXJlY3RpdmUgbmFtZXMgZm9yIHRoZSAKCSAgICAgb25lcyBiYXNlZCBpbiBmZWF0dXJlcywgZm9yIGV4YW1wbGUsIGZvciB0aGUgb2xkCgkgICAgICVuZXdvYmplY3QgZGlyZWN0aXZlIG5vdyB3ZSBoYXZlIHRyZWUgZGlyZWN0aXZlcyBkZWZpbmVkOgoJICAgICAKCgkgICAgICNkZWZpbmUgJW5ld29iamVjdCAgICAgICAgJWZlYXR1cmUoIm5ldyIpCgkgICAgICNkZWZpbmUgJW5vbmV3b2JqZWN0ICAgICAgJWZlYXR1cmUoIm5ldyIsIjAiKQoJICAgICAjZGVmaW5lICVjbGVhcm5ld29iamVjdCAgICVmZWF0dXJlKCJuZXciLCIiKQoKCSAgICAgYW5kIHNvIG9uIGZvciBhbGwgdGhlIG90aGVyIGZlYXR1cmUgZGlyZWN0aXZlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMzAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byBzb21lIGZlYXR1cmVzLiBQcmV2aW91c2x5IGl0IHdhcyBub3QgcG9zc2libGUgdG8gZGlzYWJsZSBtYW55CiAgICAgICAgICAgIGZlYXR1cmVzIG9uY2UgdGhleSBoYWQgYmVlbiBlbmFibGVkLiBUaGlzIHdhcyBmb3IgbW9zdCBmZWF0dXJlcyB0aGF0IGJlaGF2ZSBhcwogICAgICAgICAgICBmbGFncy4gVGhlc2UgZmVhdHVyZXMgbm93IHdvcmsgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiKSAgICAgICAgICAgICAgLy8gZW5hYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIjEiKSAgICAgICAgIC8vIGVuYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIwIikgICAgICAgICAvLyBkaXNhYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIiIpICAgICAgICAgIC8vIGNsZWFycyB0aGUgZmVhdHVyZQoKICAgICAgICAgICAgSW4gZmFjdCBhbnkgbm9uLWVtcHR5IHZhbHVlIG90aGVyIHRoYW4gIjAiIHdpbGwgZW5hYmxlIHRoZSBmZWF0dXJlIChsaWtlIEMgYm9vbGVhbiBsb2dpYykuCiAgICAgICAgICAgIFByZXZpb3VzbHkgIjEiLCAiMCIgb3IgYW55IG90aGVyIG5vbi1lbXB0eSB2YWx1ZSB3b3VsZCBlbmFibGUgdGhlIGZlYXR1cmUgYW5kIGl0IHdvdWxkCiAgICAgICAgICAgIG9ubHkgYmUgcG9zc2libGUgdG8gZGlzYWJsZSB0aGUgZmVhdHVyZSBieSBjbGVhcmluZyBpdCAoYXNzdW1pbmcgdGhlcmUgd2FzIG5vIGdsb2JhbCBlbmFibGUpLgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgYWZmZWN0ZWQ6CgogICAgICAgICAgICAgIGFsbG93ZXhjZXB0CiAgICAgICAgICAgICAgY29tcGFjdGRlZmF1bHRhcmdzCiAgICAgICAgICAgICAgY2xhc3NpYyAgICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIGNzOmNvbnN0ICAgICAgICAgICAgICAgKEMjKQogICAgICAgICAgICAgIGRpcmVjdG9yCiAgICAgICAgICAgICAgZXhjZXB0aW9uY2xhc3MgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIGlnbm9yZQogICAgICAgICAgICAgIGltbXV0YWJsZQogICAgICAgICAgICAgIGphdmE6Y29uc3QgICAgICAgICAgICAgKEphdmEpCiAgICAgICAgICAgICAgamF2YTpkb3duY2FzdCAgICAgICAgICAoSmF2YSkKICAgICAgICAgICAgICBrd2FyZ3MKICAgICAgICAgICAgICBtb2Rlcm4gICAgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbmV3CiAgICAgICAgICAgICAgbm9hdXRvZG9jICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG5vZGVmYXVsdAogICAgICAgICAgICAgIG5vZGlyZWN0b3IKICAgICAgICAgICAgICBub3JlZgogICAgICAgICAgICAgIG5vdGFic3RyYWN0CiAgICAgICAgICAgICAgbm91bnJlZgogICAgICAgICAgICAgIG5vdmFsdWV3cmFwcGVyCiAgICAgICAgICAgICAgcHl0aG9uOm1heWJlY2FsbCAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIHB5dGhvbjpub25keW5hbWljICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBtb2R1bGEzOm11bHRpcmV0dmFsICAgIChNb2R1bGEzKQogICAgICAgICAgICAgIHByZWRpY2F0ZSAgICAgICAgICAgICAgKFJ1YnkpCiAgICAgICAgICAgICAgdHJhY2tvYmplY3RzICAgICAgICAgICAoUnVieSkKICAgICAgICAgICAgICB2YWx1ZXdyYXBwZXIKCiAgICAgICAgICAgIEl0IGlzIG5vdyBwb3NzaWJsZSwgZm9yIGV4YW1wbGUgdG8gaWdub3JlIGFsbCBtZXRob2RzL2NsYXNzZXMgaW4gYSBoZWFkZXIgZmlsZSwgZXhjZXB0IGZvciBhCiAgICAgICAgICAgIGZldyB0YXJnZXR0ZWQgbWV0aG9kcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhbGwgbWV0aG9kcy9jbGFzc2VzCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBzb21lX2Z1bmN0aW9uKGludCwgZG91YmxlKTsgLy8gZG8gbm90IGlnbm9yZSB0aGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBTb21lQ2xhc3M7ICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGlnbm9yZSB0aGlzIENsYXNzCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBTb21lQ2xhc3M6Om1ldGhvZDsgICAgICAgICAgLy8gZG8gbm90IGlnbm9yZSB0aGlzIG1ldGhvZAogICAgICAgICAgICAgICVpbmNsdWRlICJiaWdoZWFkZXIuaCIKCiAgICAgICAgICAgIFJlbW92ZWQgJXB5dGhvbmR5bmFtaWMgLSBpdCBuZXZlciB3b3JrZWQgcHJvcGVybHkuIFVzZSAlcHl0aG9ubm9uZHluYW1pYyBpbnN0ZWFkLgogICAgICAgICAgICBSZW1vdmVkICVmZWF0dXJlKCJub2t3YXJncyIpIC0gaXQgd2Fzbid0IGZ1bGx5IGltcGxlbWVudGVkICAtIHVzZSAlZmVhdHVyZSgia3dhcmdzIiwiMCIpIGluc3RlYWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzI1LzIwMDU6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEFkZCAidGhyb3dzIiB0eXBlbWFwcy4KCjA5LzI0LzIwMDU6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0gQWRkcyBuZXcgJXRyYWNrb2JqZWN0cyBmdW5jdGlvbmFsaXR5IHRoYXQgbWFwcyBDKysgb2JqZWN0cyB0bwogICAgICAgICAgICBSdWJ5IG9iamVjdHMuICBUaGlzIGZ1bmN0aW9uYWxpdHkgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gaW1wbGVtZW50CiAgICAgICAgICAgIG1hcmsgZnVuY3Rpb25zIGZvciB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuICBGb3IgbW9yZSBpbmZvcm1hdGlvbgogICAgICAgICAgICByZWZlciB0byB0aGUgdXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzLgogICAgICAgICAgICAKMDkvMjAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFBhdGNoIDExMTY0MzEgZnJvbSBKb3NoIENoZXJyeS4gRml4ZXMgbm9uIG1lbWJlciBmdW5jdGlvbnMgaW5hZHZlcnRlbnRseQogICAgICAgICAgICBiZWluZyBjYWxsZWQgaW5zdGVhZCBvZiBtZW1iZXIgZnVuY3Rpb25zLgoKMDkvMjAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUGF0Y2ggZnJvbSBNYXJrIEdvc3NhZ2UgdG8gYWRkIHN1cHBvcnQgZm9yIEx1YS01LjEsIHN0ZDo6c3RyaW5nLAogICAgICAgICAgICBzdGQ6OnZlY3Rvciwgc3RkOjpleGNlcHRpb24gYW5kIGRvY3VtZW50YXRpb24uCgowOS8xNC8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGQgLW5vY3BwY2FzdC4gTm93IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCgkgICAgYWx3YXlzIHVzZSB0aGUgY3BwY2FzdCBvcGVyYXRvcnMuIEJlZm9yZSB0aGF0IHdhcyB0aGUgY2FzZQoJICAgIG9ubHkgd2hlbiB5b3UgdXNlZCB0aGUgLWNwcGNhc3Qgb3B0aW9uLgoKICAgICAgICAgICAgSWYgdGhpcyBzZWVtcyB0byBicmVhayB5b3VyIGNvZGUuLi4geW91ciB3ZWxjb21lISwgaXQKCSAgICBtZWFucyBpdCB3YXMgYnJva2VuIGJlZm9yZSwgYW5kIHlvdSBuZXZlciBub3RpY2UuIAoKCSAgICBJZiB5b3UgdGhpbmcgdGhlIGVycm9yIGlzIGR1ZSB0byBvbmUgb2YgdGhlIFNXSUcgdHlwZW1hcHMsCgkgICAgc2VuZCB1cyBhbiBleGFtcGxlLgoKCSAgICBVc2UgLW5vY3BwY2FzdCBvbmx5IHdpdGggdmVyeSBvbGQgQysrIGNvbXBpbGVycyB0aGF0CgkgICAgZG8gbm90IHN1cHBvcnQgdGhlIGNwcGNhc3Qgb3BlcmF0aW9ucy4gCgoJICAgIFNvLCBoZXJlIGFwcGxpZXM6CgoJCVRoaXMgY2hhbmdlIGRvZXNuJ3QgYnJlYWsgY29tcGF0aWJpbGl0eSwgaXQgd2FzIGJyb2tlbiBiZWZvcmUuCgowOS8xMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvciBtZXRob2RzIHdoZW4gYSBjbGFzcyBpcyBwYXNzZWQgYnkgdmFsdWUgYXMgYQogICAgICAgICAgICBwYXJhbWV0ZXIuCgowOS8xMS8yMDA1OiBtbWF0dXMKICAgICAgICAgICAgQWRkaW5nIHRoZSBtb2R1bGUgb3B0aW9uIHRvIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gTm93IHlvdQogICAgICAgICAgICBjYW4gdXNlIGl0IGFzCgoJICAgICAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmkKCgkgICAgd2hlcmUgc3ViZmlsZSBjb3VsZCAob3Igbm90KSBkZWZpbmUgdGhlIG1vZHVsZSBuYW1lIHZpYQoJICAgIHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4gVGhlIG1vZHVsZSBvcHRpb24gdGFrZSBwcmVjZWRlbmNlCgkgICAgYW5kIGl0IGhhcyB0aGUgc2FtZSBlZmZlY3RzIHRoYW4gaGF2aW5nIHRoZSBkaXJlY3RpdmUgCgoJICAgICAgICAlbW9kdWxlIEJpZ01vZHVsZSAgCgoJICAgIGluc2lkZSB0aGUgaW1wb3J0ZWQgZmlsZSBmb28uaS4KCgkgICAgWW91IGNhbiB1c2UgdGhlIG9wdGlvbiBpbiBtYWlubHkgdHdvIGNhc2VzOgoKCSAgICAxLi0gWW91IHVzZWQgdGhlIC1tb2R1bGUgb3B0aW9uIHdoZW4geW91IGdlbmVyYXRlZCB0aGUKICAgICAgICAgICAgICAgIG1vZHVsZSB0byBiZSBpbXBvcnRlZCwgYW5kIGhlbmNlIHRoZSBtb2R1bGUgbmFtZSBpbgogICAgICAgICAgICAgICAgdGhlIGltcG9ydGVkICVtb2R1bGUgZGlyZWN0aXZlIGlzIG5vdCByZWFsbHkgdXNlZnVsLgoKCSAgICAyLi0gVGhlIG1vZHVsZSB5b3Ugd2FudCB0byBpbXBvcnQgaXMgdmVyeSBsYXJnZSwgYW5kIGl0CiAgICAgICAgICAgICAgICBoYXMgc2V2ZXJhbCAuaS8uaCBmaWxlcy4gVGhlbiwgaWYgeW91IGp1c3Qgb25lIHRvCiAgICAgICAgICAgICAgICBpbXBvcnQgYSBjbGFzcyBvciBzbyBmcm9tIHRoZSBtb2R1bGUsIHNheXMgJ2ZvbycsIGFuZAogICAgICAgICAgICAgICAgbm90IHRoZSBlbnRpcmUgbW9kdWxlIHZpYSBpbXBvcnRpbmcgdGhlIG1haW4KICAgICAgICAgICAgICAgIEJpZ01vZHVsZS5pIGZpbGUsIHRoZW4geW91IGp1c3QgZG86CgogCQkgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5oCgogICAJICAgICAgICBvcgoJCQogCQkgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5pCgoJCXdoZXJlIGZvby5pIGNvbnRhaW5zIHRoZSAnZm9vJyBkZWNsYXJhdGlvbiBhbmQgbWF5YmUgYQoJCWNvdXBsZSBvZiBleHRyYSAlaW5jbHVkZSBkaXJlY3RpdmVzLCBhcyBuZWVkZWQuCgoJICAgIAowOS8xMS8yMDA1OiBtbWF0dXMKCSAgICBGaXggYnVnICMxMjgyNjM3LCBhYm91dCB0aGUgLW1vZHVsZSBvcHRpb24gbm90IGhhdmluZyBlZmZlY3QKCSAgICBpbiBwbGFjZXMgd2hlcmUgaXQgd2FzIG5lZWRlZC4KCjA5LzExLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFdoZW4gd3JhcHBpbmcgdmFyaWFibGVzLCBlbnN1cmUgdGhhdCBub25lIG9mIHRoZSB0eXBlbWFwcyB1c2VkIGZvciB0aGUKICAgICAgICAgICAgc2V0IHdyYXBwZXJzIGFyZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgZ2V0IHdyYXBwZXJzLiBJIGRvdWJ0IHRoaXMgd2FzIGEKICAgICAgICAgICAgcHJvYmxlbSBmb3IgYW55IGxhbmd1YWdlcyBleGNlcHQgZm9yIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIG51bGwgYXR0cmlidXRlCiAgICAgICAgICAgIGluIHRoZSBvdXQgdHlwZW1hcCAoQyMgb25seSkuCgowOS8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2VzIHdoZW4gZmlsZXMgZmFpbCB0byBvcGVuLgoKMDkvMDYvMjAwNTogbW1hdHVzIAoKCSAgICBBbGxvdyBhICVkZWZpbmUgYSBtYWNybyBpbnNpZGUgYW5vdGhlciAlZGVmaW5lIG1hY3JvLCBmb3IgZXhhbXBsZQoKCSAgICAgICVkZWZpbmUgaGVsbG8obmFtZSwgVHlwZSkKCSAgICAgICVkZWZpbmUgbmFtZSAjIyBhKFR5cGUpCgkgICAgICAldHlwZW1hcChpbikgVHlwZSAiaGVsbG87IjsKCSAgICAgICVlbmRkZWYKCSAgICAgICVlbmRkZWYKCSAgICAgIAoJICAgIFRvIGxlYXJuIGhvdyB0byB1c2UgdGhpcyBuZXcgZmVhdHVyZXMgaW4geW91ciBvd24gdHlwZW1hcHMgbGlicmFyeSwgc2VlCgkgICAgcHl0aG9uL2NzdHJpbmcuaSwgcHl0aG9uL2N3c3RyaW5nLmkgYW5kIHB5dGhvbi9jd3N0cmJhc2UuaS4JICAgIAoKICAgICAgICAgICAgW1B5dGhvbl0gTm9ybWFsaXplIHRoZSBjc3RyaW5nLmkgaW1wbGVtZW50YXRpb24gdG8gdXNlIGZyYWdtZW50cywgYW5kIGFkZAogICAgICAgICAgICBjd3N0cmluZy5pLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBzYW1lIHR5cGVtYXBzIGJ1dCBmb3Igd2NoYXJfdCBzdHJpbmdzLgoKCSAgICBbUHl0aG9uXSBCdWcgZml4ZWQ6IDEyNDc0NzcsIDEyNDU1OTEsIDEyNDk4NzggYW5kIG90aGVycy4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgU1dJR1RZUEUqIERJU09XTiB0eXBlbWFwIChsaWtlIGluIFB5dGhvbikgZm9yCiAgICAgICAgICAgIGJldHRlciBjb250cm9sIG9mIG1lbW9yeSBtYW5hZ2VtZW50LCBlZyB3aGVuIGFkZGluZyBhbiBvYmplY3QgY3JlYXRlZCBpbiBSdWJ5CiAgICAgICAgICAgIHRvIGEgQysrIGNvbnRhaW5lci4gUGF0Y2ggIzEyNjE2OTIgZnJvbSBDaGFybGllIFNhdmFnZS4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIDY0IGJpdCBwbGF0Zm9ybSBmaXhlcyBmb3IgdGhlIHZhcmFyZ3MgaGFuZGxpbmcgaW4gU1dJR19HZXRBcmdzLiBUaGlzIGlzIGFuCiAgICAgICAgICAgIGltcHJvdmVkIGZpeCBmb3IgYnVnICMxMDExNjA0IGFzIHN1Z2dlc3RlZCBieSBKZXJlbXkgTGluLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQnVnICMxMjQwNDY5IC0gJW5ld29iamVjdCBzdXBwb3J0IGZvciBUY2wuIFBhdGNoIGZyb20gQm9iIE1hcmluaWVyLgoKMDgvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEJ1ZyAjMTI1NDQ5NCAtIEZpeCBmb3IgZ2xvYmFsIG5hbWVzcGFjZSBwb2xsdXRpb24gYnkgcGVybCBoZWFkZXIgZmlsZXMKICAgICAgICAgICAgKGJvb2wgZGVmaW5lKSBwcmV2ZW50ZWQgU1RMIGhlYWRlcnMgZnJvbSBiZWluZyB1c2VkIG9uIHNvbWUgc3lzdGVtcywgZWcKICAgICAgICAgICAgV2luZG93cyB3aXRoIFZpc3VhbCBTdHVkaW8uCgowOC8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQnVnICMxMjQwOTM3IC0gUmVkZWZpbml0aW9uIG9mIF9faW50NjQgdHlwZWRlZiBmb3IgSW50ZWwgY29tcGlsZXJzLgoKMDgvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gQnVnICMxMjUxODMyIC0gIEMrKyB0ZW1wbGF0ZSBtYXkgZ2VuZXJhdGUgaW52YWxpZCBYTUwgZmlsZQoKMDgvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gU3VwcG9ydCBhZGRlZCBmb3IgTHVhLiBQYXRjaCAjMTI0Mjc3MiBmcm9tIE1hcmsgR29zc2FnZS4KICAgICAgICAgICAgSXQgc3VwcG9ydHMgbW9zdCBDL0MrKyBmZWF0dXJlcyAoZnVuY3Rpb25zLCBzdHJ1Y3QsIGNsYXNzZXMsIGFycmF5cywgcG9pbnRlcnMsCiAgICAgICAgICAgIGV4Y2VwdGlvbnMpLCBhcyB3ZWxsIGFzIGxvdHMgb2YgZG9jdW1lbnRhdGlvbiBhbmQgYSBmZXcgdGVzdCBjYXNlcyAmIGV4YW1wbGVzLgoKMDgvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gRml4IGluY29ycmVjdCB4bWwgZXNjYXBpbmcgaW4gYmFzZSBjbGFzcyBuYW1lIHdoZW4gYmFzZSBjbGFzcyBpcyBhIHRlbXBsYXRlLgoKMDgvMTMvMjAwNTogZWZ1enp5b25lCgkgICAgW0NMSVNQXSBBZGRlZCBzdXBwb3J0IGZvciBoYW5kbGluZyBlbnVtcy4gRG9lcyBub3QgYWRkcyB0aGUgcmV0dXJuIHR5cGUgZGVjbGFyYXRpb24KCSAgICB0byB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiwgaWYgYSBmdW5jdGlvbiByZXR1cm5zIHZvaWQuCgowOC8wOS8yMDA1OiBta29lcHBlCgkgICAgTmV3IGxhbmd1YWdlIG1vZHVsZSwgQ29tbW9uIExpc3Agd2l0aCBVRkZJLCBmcm9tIFV0ei1Vd2UgSGF1cy4KCjA4LzA5LzIwMDU6IG1rb2VwcGUKCSAgICBGaXggdGhlIExpc3Agcy1leHByZXNzaW9uIG91dHB1dCBtb2R1bGU7IGl0IG5vIGxvbmdlciBjb21wbGFpbnMgYWJvdXQgInVua25vd24gdGFyZ2V0cyIuCgowNy8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZmljYXRpb25zIHRvIFNUTCB3cmFwcGVycyBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIHVzZXIncyAlZXhjZXB0aW9uIGRpcmVjdGl2ZQogICAgICAgICAgICB0byBiZSBhcHBsaWVkIHRvIHRoZSBTVEwgd3JhcHBlciBtZXRob2RzLiBQcmV2aW91c2x5IHRoZSBmb2xsb3dpbmcgZ2xvYmFsICVleGNlcHRpb24KICAgICAgICAgICAgZGlyZWN0aXZlIHdvdWxkIG5vdCBiZSB1c2VkIG9uIHRoZSB3cmFwcGVyIG1ldGhvZHM6CgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7IAogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBoYXMgYmVlbiBpbXBsZW1lbnRlZCBieSByZXBsYWNpbmcgJWV4Y2VwdGlvbiBkaXJlY3RpdmVzIGZvciBzcGVjaWZpYyBTVEwgd3JhcHBlcgogICAgICAgICAgICBtZXRob2RzIHdpdGggYW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gZGVjbGFyZWQgb24gdGhlIHdyYXBwZXIgbWV0aG9kcy4gdGhyb3dzIHR5cGVtYXBzCiAgICAgICAgICAgIGFyZSBub3cgc3VwcGxpZWQgZm9yIGhhbmRsaW5nIHRoZSBTVEwgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uIFRoZXNlIGNhbiBhbHNvIGJlIGVhc2lseQogICAgICAgICAgICBvdmVycmlkZGVuLCBmb3IgZXhhbXBsZSB0aGUgc3RkOjpvdXRfb2ZfcmFuZ2UgZXhjZXB0aW9uLCB3aGljaCBpcyB1c2VkIGEgbG90IGluIHRoZSBTVEwKICAgICAgICAgICAgd3JhcHBlcnMsIGNhbiBiZSBjdXN0b21pc2VkIGVhc2lseToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF92ZWN0b3IuaSIKICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MpIHN0ZDo6b3V0X29mX3JhbmdlIHsKICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBleGNlcHRpb24gaGFuZGxlcgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldGVtcGxhdGUoVmVjdEludCkgc3RkOjp2ZWN0b3I8aW50PjsKCjA3LzIyLzIwMDU6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0xJU1BdIFRoZSBjbGlzcCBtb2R1bGUgZm9yIFNXSUc6CiAgICAgICAgICAgICAgLSBJdCBjYW4gb25seSBoYW5kbGUgQywgY2xpc3AgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnRzIGZmaSBiaW5kaW5ncyB0byBDKysuCiAgICAgICAgICAgICAgLSBJdCBoYXMgdHdvIG9wdGlvbnMsIChhKSAtZXh0ZXJuLWFsbCB0aGlzIHdpbGwgZ2VuZXJhdGUgd3JhcHBlcnMgZm9yIGFsbCBmdW5jdGlvbnMKICAgICAgICAJYW5kIHZhcmlhYmxlc3Rpb25zLCAoYikgLWdlbmVyYXRlLXR5cGVkZWYgdGhpcyB3aWxsIGdlbmVyYXRlIHdyYXBwZXJzICJkZWYtYy10eXBlIgoJICAgICAgICB3cmFwcGVycyBmb3IgdHlwZWRlZnMKCSAgICAgIC0gQ2FuIGhhbmRsZSBwb2ludGVycyB0byBmdW5jdGlvbnMsIGNvbXBsZXggdHlwZXMgc3VjaCBhcyBuLWRpbWVuc2lvbmFsIGFycmF5cyBvZiAKCSAJcG9pbnRlcnMgb2YgZGVwdGggZAoJICAgICAgLSBHZW5lcmF0ZXMgd3JhcHBlcnMgZm9yIGNvbnN0YW50cyBhcyB3ZWxsIGFzIHZhcmlhYmxlcwoJICAgICAgLSBDb3JyZWN0bHkgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHRoZSBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZXMgaW4gc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zCgkgICAgICAtIENyZWF0ZXMgYSBkZWZwYWNrYWdlICJkZWNsYXJhdGlvbiIgd2l0aCB0aGUgbW9kdWxlIG5hbWUgYXMgdGhlIHBhY2thZ2UgbmFtZSwgdGhlIGNyZWF0ZWQgCgkgICAgCXBhY2thZ2UgZXhwb3J0cyBib3RoIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzCgkgICAgICAtIHRyaWVzIHRvIGd1ZXNzIHdoZW4gc2hvdWxkIGEgcG9pbnRlciB2YXJpYWJsZSBiZSBkZWNsYXJlZCBhcyBjLXB0ciBvciBjLXBvaW50ZXIKCjA3LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQ2hhbmdlcyB0byBzdXBwb3J0IEMjIHN0cnVjdHMgcmV0dXJuZWQgYnkgdmFsdWUuIFRoZSBjaGFuZ2VzIHJlcXVpcmVkIGFyZToKICAgICAgICAgICAgICAtIFVzaW5nIGFuIG9wdGlvbmFsICdudWxsJyBhdHRyaWJ1dGUgaW4gdGhlIG91dCB0eXBlbWFwLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsCiAgICAgICAgICAgICAgICB0aGVuIGl0IGlzIHVzZWQgZm9yIHRoZSAkbnVsbCBzcGVjaWFsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KICAgICAgICAgICAgICAtIFRoZSBjdHlwZSB1c2VkIGluIHRoZSBDL0MrKyB3cmFwcGVycyBpcyBubyBsb25nZXIgaW5pdGlhbGlzZWQgdG8gMCBvbiBkZWNsYXJhdGlvbi4KICAgICAgICAgICAgQm90aCBvZiB0aGVzZSBjaGFuZ2VzIGZpeCB0aGUgc2l0dWF0aW9ucyB3aGVyZSBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFzc2lnbiAwIHRvIHRoZQogICAgICAgICAgICByZXR1cm5lZCBzdHJ1Y3QuIE1hcnNoYWxsaW5nIHN0cnVjdHMgYXMgdmFsdWUgdHlwZXMgc3RpbGwgcmVxdWlyZXMgdXNlciBkZWZpbmVkIHR5cGVtYXBzLgogICAgICAgICAgICBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgYW4gZXhhbXBsZS4KCjA3LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4IFNXSUdfZXhjZXB0aW9uIHVzYWdlIHRvIHdvcmsgd2l0aCBjb21waWxlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGVtcHR5IG1hY3JvCiAgICAgICAgICAgIGFyZ3VtZW50cy4gVW5mb3J0dW5hdGVseSB0aGlzIGZpeCB3aWxsIHN0b3AgdXNhZ2Ugb2YgU1dJR19leGNlcHRpb24gYmVpbmcgdXNlZCB3aXRoaW4gdHlwZW1hcHMKICAgICAgICAgICAgdGhhdCB1c2UgIiIgb3IgJXsgJX0gZGVsaW1pdGVycywgYnV0IGNvbnRpbnVlcyB0byB3b3JrIHdpdGggdHlwZW1hcHMgdXNpbmcge30gZGVsaW1pdGVycy4KICAgICAgICAgICAgUGxlYXNlIHVzZSB0aGUgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uQXJndW1lbnQgb3IgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24gbWV0aG9kcyBpbnN0ZWFkCiAgICAgICAgICAgIGFzIFNXSUdfZXhjZXB0aW9uIGlzIHJlYWxseSBpbnRlbmRlZCBhcyBhIHBsYXRmb3JtIGluZGVwZW5kZW50IG1hY3JvIGZvciB0aGUgU1dJRyBsaWJyYXJ5IHdyaXRlcnMuCgowNy8xNi8yMDA1OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIFVzZSBzcGVjaWZpYyBmb3JlaWduIHR5cGVzIHJhdGhlciB0aGFuICgqIDp2b2lkKS4gCgkgICAgVXNlICpzd2lnLWlkZW50aWZpZXItY29udmVydGVyKi4KCjA2LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZ1bmN0aW9ucyBkZWNsYXJlZCBhcyAnZXh0ZXJuJyBubyBsb25nZXIgaGF2ZSBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFkZGVkIHRvIHRoZSAKICAgICAgICAgICAgd3JhcHBlciBmaWxlcy4gVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgU1dJRyBkb2VzIG5vdCBnZXQgdGhpcyByaWdodCwgZWcgYnVnICMxMjA1ODU5IChleHRlcm4KICAgICAgICAgICAgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgZGVjbGFyZWQgaW4gYSBuYW1lc3BhY2UpLiBBbHNvIFNXSUcgY2Fubm90IGdldCBub24tc3RhbmRhcmQKICAgICAgICAgICAgY2FsbGluZyBjb252ZW50aW9ucyBjb3JyZWN0LCBlZyBXaW5kb3dzIGNhbGxpbmcgY29udmVudGlvbnMgYXJlIHVzdWFsbHkgaGFuZGxlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgI2RlZmluZSBETExJTVBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCiAgICAgICAgICAgICAgI2RlZmluZSBTVERDQUxMIF9fc3RkY2FsbAogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgI2RlZmluZSBETExJTVBPUlQKICAgICAgICAgICAgICAjZGVmaW5lIFNURENBTEwKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgRExMSU1QT1JUIGV4dGVybiBTVERDQUxMIHZvaWQgZnVuY3Rpb24oaW50KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgU1dJRyBpbmNvcnJlY3RseSBnZW5lcmF0ZXM6CgogICAgICAgICAgICBleHRlcm4gdm9pZCBmdW5jdGlvbihpbnQpOwoKICAgICAgICAgICAgVG8gd2hpY2ggdGhlcmUgaXMgbm8gc29sdXRpb24gYXMgU1dJRyBkb2Vzbid0IGhhbmRsZSBub24tc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9ucy4gVGhlIGV4dHJhCiAgICAgICAgICAgICdleHRlcm4nIGZ1bmN0aW9uIHRoYXQgU1dJRyBnZW5lcmF0ZXMgaXMgc3VwZXJmbHVvdXMgdW5sZXNzIGEgdXNlciBoYXMgZm9yZ290dGVuIHRvIGFkZCB0aGUgZnVuY3Rpb24KICAgICAgICAgICAgZGVjbGFyYXRpb24gaW50byB0aGUgd3JhcHBlcnMuCgogICAgICAgICAgICBUaGUgLW5vZXh0ZXJuIGNvbW1hbmRsaW5lIGFyZ3VtZW50IGlzIG5vdyByZWR1bmRhbnQgYW5kIGEgbmV3IGNvbW1hbmRsaW5lIGFyZ3VtZW50IC1hZGRleHRlcm4gY2FuCiAgICAgICAgICAgIGJlIHVzZWQgdG8gb2J0YWluIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIuIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSB1bmxlc3MgdGhlIGhlYWRlciBmaWxlCiAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHdhcyBpbmFkdmVydGVudGx5IG5vdCBhZGRlZCB0byB0aGUgd3JhcHBlcnMuIFRvIGZpeCB0aGlzCiAgICAgICAgICAgIGFkZCB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gaW50byB5b3VyIHdyYXBwZXJzLCBGb3IgZXhhbXBsZSwgcmVwbGFjZToKCiAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZm9vKGludCk7CgogICAgICAgICAgICB3aXRoOgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDYvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhLCBNb2R1bGEzLCBPY2FtbF0KICAgICAgICAgICAgVGhlIGludGVybWVkaWFyeSBmdW5jdGlvbiBuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCB3aGVuIHdyYXBwaW5nIHZhcmlhYmxlcyB0bwogICAgICAgICAgICBtYXRjaCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcyBzbyB0aGF0ICVleHRlbmQgZm9yIGEgbWVtYmVyIHZhcmlhYmxlIHdvcmtzCiAgICAgICAgICAgIHVuaWZvcm1seSBhY3Jvc3MgYWxsIGxhbmd1YWdlIG1vZHVsZXMsIGVnOgoKICAgICAgICAgICAgICAlZXh0ZW5kIEV4dGVuZE1lIHsKICAgICAgICAgICAgICAgIFZhcjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBFeHRlbmRNZV9WYXJfc2V0KEV4dGVuZE1lICosIGRvdWJsZSkgey4uLn0KICAgICAgICAgICAgICAgIGRvdWJsZSBFeHRlbmRNZV9WYXJfZ2V0KEV4dGVuZE1lICopIHsuLi59CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBtZXRob2RzIGltcGxlbWVudGluZyB0aGUgZ2V0L3NldCB1c2VkIHRvIGJlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBzZXRfRXh0ZW5kTWVfVmFyKEV4dGVuZE1lICosIGRvdWJsZSkgey4uLn0KICAgICAgICAgICAgICAgIGRvdWJsZSBnZXRfRXh0ZW5kTWVfVmFyKEV4dGVuZE1lICopIHsuLi59CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBuYW1lIG9mIHZhcmlhYmxlIHdyYXBwZXIgZnVuY3Rpb25zIHdoZW4gdXNpbmcgLW5vcHJveHkuCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBuYW1lcyBjYW4gYmUgZ2VuZXJhdGVkIHdpdGggdGhlIC1vbGR2YXJuYW1lcyBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKClZlcnNpb24gMS4zLjI1IChKdW5lIDExLCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzExLzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBoYW5kbGluZyBvZiBhbm9ueW1vdXMtZW51bSB2YXJpYWJsZXMuCgowNi8xMC8yMDA1OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXNzZWQgYnkKCSAgICBjb3B5LW9mLXZhbHVlLiAgRml4IGZvciBnbG9iYWwgImNvbnN0IGNoYXIgKiIgdmFyaWFibGVzLgoJICAgIEZpeCB0ZXN0Y2FzZXMgYXJyYXlzX2RpbWVuc2lvbmxlc3MsIGFycmF5c19nbG9iYWwuCgowNi8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIHdoZW4gYSBiYXNlIGNsYXNzIGRlZmluZXMgYSBzeW1ib2wgYXMgYSBtZW1iZXIgdmFyaWFibGUgYW5kIGEgZGVyaXZlZCBjbGFzcyBkZWZpbmVzCiAgICAgICAgICAgIHRoZSBzYW1lIHN5bWJvbCBhcyBhIG1lbWJlciBtZXRob2QuCgowNi8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1vcmUgZml4ZXMgZm9yIHZpcnR1YWwvbmV3L292ZXJyaWRlIG1vZGlmaWVycyAtIHdoZW4gYSBtZXRob2QgaGFzIHByb3RlY3RlZCBhY2Nlc3MgCiAgICAgICAgICAgIGluIGJhc2UgYW5kIHB1YmxpYyBhY2Nlc3MgaW4gZGVyaXZlZCBjbGFzcy4KCjA2LzAyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA2NjM2MyAtIEZvbGxvdyBjb252ZW50aW9uIG9mIHJlbGVhc2UgdGFyYmFsbCBuYW1lIG1hdGNoaW5nIGRpcmVjdG9yeSBuYW1lLgoKMDYvMDIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggIzEyMTEzNTMgLSB0eXBlc2FmZSBlbnVtcyAoYW5kIEphdmEgcHJvcGVyIGVudW1zKSB3cmFwcGVycyB3aGVuIGVudW0gdmFsdWUKICAgICAgICAgICAgaXMgbmVnYXRpdmUuCgowNS8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2Rlcm5pc2VkIGFuZCB0aWRpZWQgdXAgV2luZG93cyBtYWNyb3MgLS0+IFNXSUdFWFBPUlQsIFNXSUdTVERDQUxMLiBUaGV5IGNhbiBiZSBvdmVycmlkZGVuCiAgICAgICAgICAgIGJ5IHVzZXJzIHZpYSAtRCBjb21waWxlciBkaXJlY3RpdmVzIGlmIG5lZWQgYmUuCgowNS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICAlY3NtZXRob2Rtb2RpZmllcnMgY2FuIGJlIGFwcGxpZWQgdG8gdmFyaWFibGVzIGFzIHdlbGwgYXMgbWV0aG9kcyBub3cuCgogICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCAncHVibGljJyBtb2RpZmllciB0aGF0IFNXSUcgZ2VuZXJhdGVzLCAlY3NtZXRob2Rtb2RpZmllcnMgd2lsbCBhbHNvCiAgICAgICAgICAgIHJlcGxhY2UgdGhlIHZpcnR1YWwvbmV3L292ZXJyaWRlIG1vZGlmaWVycyB0aGF0IFNXSUcgdGhpbmtzIGlzIGFwcHJvcHJpYXRlLiBUaGlzIGZlYXR1cmUgaXMKICAgICAgICAgICAgdXNlZnVsIGZvciBzb21lIG9ic2N1cmUgY2FzZXMgd2hlcmUgU1dJRyBtaWdodCBnZXQgdGhlIG1vZGlmaWVycyBpbmNvcnJlY3QsIGZvciBleGFtcGxlCiAgICAgICAgICAgIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UgYW5kIG92ZXJyaWRpbmcgYSBtZXRob2QgaW4gdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgbWlzc2luZyBjb25zdHJ1Y3RvcnMgdG8gc3RkOjpwYWlyIHdyYXBwZXJzIChzdGRfcGFpci5pKSBmb3IgYWxsIGxhbmd1YWdlcy4KCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgc3RkOjpwYWlyIHdyYXBwZXJzIGluIHN0ZF9wYWlyLmkKCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlIEMjICduZXcnIGFuZCAnb3ZlcnJpZGUnIG1vZGlmaWVycyB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGEgQysrIGNsYXNzIGluaGVyaXRzIG1ldGhvZHMKICAgICAgICAgICAgdmlhIGEgQysrICd1c2luZycgZGVjbGFyYXRpb24uCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBwcmV2aW91c2x5IGJlaW5nIGlnbm9yZWQgaW4gY2xhc3NlcyB0aGF0IGluaGVyaXRlZCBtZXRob2RzCiAgICAgICAgICAgIGZyb20gJ3VzaW5nJyBkZWNsYXJhdGlvbnMsIGVnIGNhbGxzIHRvIERlcml2ZWQ6OmJhciBiZWxvdyB3aWxsIGNvbnZlcnQgQysrIGV4Y2VwdGlvbnMgaW50bwogICAgICAgICAgICBhIHRhcmdldCBsYW5ndWFnZSBleGNlcHRpb24vZXJyb3IsIGxpa2UgaXQgYWx3YXlzIGhhcyBkb25lIGZvciBCYXNlOjpCYXIuCgogICAgICAgICAgICBjbGFzcyBCYXNlIHsKICAgICAgICAgICAgICB2aXJ0dWFsIGJhcigpIHRocm93IChzdGQ6OnN0cmluZyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7CiAgICAgICAgICAgICAgdXNpbmcgQmFzZTo6YmFyOwogICAgICAgICAgICB9OwoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRldGVjdGluZyB2aXJ0dWFsIG1ldGhvZHMgaW4gJWV4dGVuZCBmb3IgdGhlIC1mdmlydHVhbCBvcHRpb24gYW5kIEMjIG92ZXJyaWRlIGFuZCBuZXcKICAgICAgICAgICAgbWV0aG9kIG1vZGlmaWVycy4KCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICduZXcnIG1vZGlmaWVyIGlzIG5vdyBnZW5lcmF0ZWQgb24gdGhlIHByb3h5IG1ldGhvZCB3aGVuIGEgbWV0aG9kIGluIGEgZGVyaXZlZAogICAgICAgICAgICBjbGFzcyBpcyBub3QgcG9seW1vcnBoaWMgYW5kIHRoZSBzYW1lIG1ldGhvZCBleGlzdHMgaW4gdGhlIGRlcml2ZWQgY2xhc3MgKGllIGl0IGhpZGVzCiAgICAgICAgICAgIHRoZSBiYXNlIGNsYXNzJyBub24tdmlydHVhbCBtZXRob2QpLgoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXhlcyB0byBkZXRlY3Rpb24gb2YgY292YXJpYW50IHJldHVybiB0eXBlcyAtIHdoZW4gdGhlIGNsYXNzIGhpZXJhcmNoeSBpcyBtb3JlCiAgICAgICAgICAgIHRoYW4gMiBjbGFzc2VzIGRlZXAuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp3c3RyaW5nIHR5cGVtYXBzIG1vdmVkIGZyb20gc3RkX3N0cmluZy5pIHRvIHN0ZF93c3RyaW5nLmkKCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgY3Jhc2ggaW4gRG9oU3Ryc3RyLCBidWcgIzExOTA5MjEKCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUQ0xdIEZpeCBmb3IgbWV0aG9kcyB3aXRoIHNpbWlsYXIgbmFtZXMgd2hlbiBzaG93aW5nIGxpc3Qgb2YgbmFtZXMgb24gZXJyb3IgLSBidWcgIzExOTE4MjguCiAgICAgICAgICAgIFBhdGNoIGZyb20gSmVyb2VuIERvYmJlbGFlcmUuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVENMXSBsb25nIGxvbmcgb3ZlcmxvYWRpbmcgZml4IC0gYnVnICMxMTkxODM1LCBwYXRjaCBmcm9tIEplcm9lbiBEb2JiZWxhZXJlLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZyAjMTE5Njc1NSB0byByZW1vdmUgZGVidWcgZnJvbSBzd2lndGNsOC5zd2cuCgowNS8xOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgYW5kIC1mdmlydHVhbCBvcHRpb25dIEZpeCBmb3IgdGhlIG92ZXJyaWRlIGtleSBub3QgYmVpbmcgZ2VuZXJhdGVkIGluIHRoZSBkZXJpdmVkIGNsYXNzIHdoZW4gYQogICAgICAgICAgICB2aXJ0dWFsIG1ldGhvZCdzIHJldHVybiB0eXBlIHdhcyBhIHR5cGVkZWYgaW4gZWl0aGVyIHRoZSBiYXNlIG9yIGRlcml2ZWQgY2xhc3MuIEFsc28gZW5zdXJlcyB0aGUKICAgICAgICAgICAgbWV0aG9kIGlzIGVsaW1pbmF0ZWQgd2hlbiB1c2luZyB0aGUgLWZ2aXJ0dWFsIG9wdGlvbi4gRm9yIGV4YW1wbGUsIERlcml2ZWQubWV0aG9kIG5vdyBoYXMgdGhlIEMjCiAgICAgICAgICAgIG92ZXJyaWRlIGtleXdvcmQgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCogSW50ZWdlclB0cjsKCiAgICAgICAgICAgICAgc3RydWN0IEJhc2UgewogICAgICAgICAgICAgICAgdmlydHVhbCBJbnRlZ2VyUHRyIG1ldGhvZCgpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICBpbnQgKiBtZXRob2QoKSBjb25zdDsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgW0MjXSBGaXggZm9yIHRoZSBvdmVycmlkZSBrZXkgYmVpbmcgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciB2aXJ0dWFsIG1ldGhvZHMgd2hlbiBhIGJhc2UgY2xhc3MKICAgICAgICAgICAgaXMgaWdub3JlZCB3aXRoICVpZ25vcmUuCgowNS8xMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgdG8gcmVtb3ZlICJkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiCiAgICAgICAgICAgIHdhcm5pbmdzIGluIEMgd3JhcHBlcnMgd2hlbiBjb21waWxpbmcgQyBjb2RlIHdpdGggJ2djYyAtV2FsbCAtZnN0cmljdC1hbGlhc2luZycuIFBhdGNoIGZyb20KICAgICAgICAgICAgTWljaGFlbCBDYWhpbGwuIFRoaXMgbW9kaWZpZXMgbWFueSBvZiB0aGUgY2FzdHMgc2xpZ2h0bHksIGZvciBleGFtcGxlCiAgICAgICAgICAgICAgYXJnMSA9ICooREJfRU5WICoqKSZqYXJnMTsKICAgICAgICAgICAgdG8KICAgICAgICAgICAgICBhcmcxID0gKihEQl9FTlYgKiopKHZvaWQgKikmamFyZzE7CgowNS8xMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yIEMjIGF0dHJpYnV0ZXMuIEMjIGF0dHJpYnV0ZXMgY2FuIGJlIGdlbmVyYXRlZDoKICAgICAgICAgICAgMSkgT24gYSBDL0MrKyB0eXBlIGJhc2lzIGJ5IHNwZWNpZnlpbmcgYW4gaW5hdHRyaWJ1dGVzIGFuZC9vciBvdXRhdHRyaWJ1dGVzIHR5cGVtYXAgYXR0cmlidXRlCiAgICAgICAgICAgICAgIGluIHRoZSBpbXR5cGUgb3IgY3N0eXBlIHR5cGVtYXBzIChmb3IgQyMgcmV0dXJuIHR5cGUgb3IgQyMgcGFyYW1ldGVyIHR5cGUgYXR0cmlidXRlcykuCiAgICAgICAgICAgIDIpIE9uIGEgd3JhcHBlZCBtZXRob2Qgb3IgdmFyaWFibGUgYnkgc3BlY2lmeWluZyBhIGNzYXR0cmlidXRlcyBmZWF0dXJlICglZmVhdHVyZSkuCiAgICAgICAgICAgIDMpIE9uIGEgd3JhcHBlZCBwcm94eSBjbGFzcyBvciBlbnVtIGJ5IHNwZWNpZnlpbmcgYSBjc2F0dHJpYnV0ZXMgdHlwZW1hcC4KCiAgICAgICAgICAgIEV4YW1wbGVzIGFyZSBpbiB0aGUgQyMgZG9jdW1lbnRhdGlvbiAoQ1NoYXJwLmh0bWwpLgoKMDQvMjkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gdG8gdHVybiBvZmYgdGhlIGRlZmF1bHQgbWF4aW11bSBjb21waWxlciB3YXJuaW5nIGFzCiAgICAgICAgICAgIHRoZXkgY291bGRuJ3QgYmUgcmVtb3ZlZCBldmVuIHdoZW4gb3ZlcnJpZGluZyBDRkxBR1MgYW5kIENYWEZMQUdTIHdpdGggY29uZmlndXJlCiAgICAgICAgICAgICguL2NvbmZpZ3VyZSBDRkxBR1M9IENYWEZMQUdTPSkuIFRvIHR1cm4gdGhlIG1heGltdW0gd2FybmluZ3Mgb2ZmLCBydW46ICAKCiAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRob3V0LW1heGltdW0tY29tcGlsZS13YXJuaW5ncwoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgd2hpY2ggcmV3b3JrcyB0aGUgSmF2YSBjb25zdHJ1Y3RvciBhbmQgZmluYWxpemUvZGVzdHJ1Y3RvciB0eXBlbWFwcywKICAgICAgICAgICAgZm9yIGRpcmVjdG9ycyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBvdmVyYWxsIEphdmEgdHlwZW1hcHMuIEFkZGVkIHRoZSBkaXJlY3Rvcl90YWtlIGFuZCAKICAgICAgICAgICAgZGlyZWN0b3JfcmVsZWFzZSB0eXBlbWFwcyB0byBlbXVsYXRlIG90aGVyIG1vZHVsZXMnIF9fZGlzb3duX18gZnVuY3Rpb25hbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIERJUkVDVE9SUyAqKioKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ZWQgcHJvYmxlbXMgZHVlIHRvIHRoZSBvdmVyIGVhZ2VyIGdhcmJhZ2UgY29sbGVjdG9yLiBPY2Nhc2lvbmFsbHkgdGhlCiAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIHdvdWxkIGNvbGxlY3QgYSBDIyBwcm94eSBjbGFzcyBpbnN0YW5jZSB3aGlsZSBpdCB3YXMgYmVpbmcgdXNlZAogICAgICAgICAgICBpbiB1bm1hbmFnZWQgY29kZSBpZiB0aGUgb2JqZWN0IHdhcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gYSB3cmFwcGVkIGZ1bmN0aW9uLgogICAgICAgICAgICBOZWVkbGVzcyB0byBzYXkgdGhpcyBjYXVzZWQgaGF2b2MgYXMgdGhlIEMjIHByb3h5IGNsYXNzIGNhbGxzIHRoZSBDKysgZGVzdHJ1Y3RvcgogICAgICAgICAgICB3aGVuIGl0IGlzIGNvbGxlY3RlZC4gUHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMgbm93IHVzZSBhIEhhbmRsZVJlZiwKICAgICAgICAgICAgd2hpY2ggaG9sZHMgYW4gSW50UHRyLCBpbnN0ZWFkIG9mIGEgcGxhaW4gSW50UHRyIHRvIG1hcnNoYWwgdGhlIEMrKyBwb2ludGVyIHRvIHVubWFuYWdlZAogICAgICAgICAgICBjb2RlLiBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbnkgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gYXMgYSByZXN1bHQgb2YgdGhpcwogICAgICAgICAgICBtb2RpZmljYXRpb24uCgogICAgICAgICAgICBUaGUgY2hhbmdlcyBhcmUgaW4gdGhlIHByb3h5IGFuZCB0eXBlIHdyYXBwZXIgY2xhc3Nlcy4gVGhlIHN3aWdDUHRyIGlzIG5vdyBvZiB0eXBlIEhhbmRsZVJlZgogICAgICAgICAgICBpbnN0ZWFkIG9mIEludFB0ciBhbmQgY29uc2VxdWVudGx5IHRoZSBnZXRDUHRyIG1ldGhvZCByZXR1cm4gdHlwZSBoYXMgYWxzbyBjaGFuZ2VkLiBUaGUgbmV0CiAgICAgICAgICAgIGVmZmVjdCBpcyB0aGF0IGFueSBjdXN0b20gd3JpdHRlbiB0eXBlbWFwcyBtaWdodCBoYXZlIHRvIGJlIG1vZGlmaWVkIHRvIHN1aXRlLiBBZmZlY3RlZCB1c2VycwogICAgICAgICAgICBzaG91bGQgbm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBuZXcgJ291dCcgYXR0cmlidXRlIGluIHRoZSBpbXR5cGUgdHlwZW1hcCBhcyB0aGUKICAgICAgICAgICAgaW5wdXQgdHlwZSBpcyBub3cgYSBIYW5kbGVSZWYgYW5kIHRoZSBvdXRwdXQgdHlwZSBpcyBzdGlsbCBhbiBJbnRQdHIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciBhc3ltbWV0cmljIHR5cGUgbWFyc2hhbGxpbmcgYWRkZWQuIFNvbWV0aW1lcyB0aGUgb3V0cHV0IHR5cGUgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZGlmZmVyZW50IHRvIHRoZSBpbnB1dCB0eXBlLiBTdXBwb3J0IGZvciB0aGlzIGNvbWVzIGluIHRoZSBmb3JtIG9mIGEgbmV3IG9wdGlvbmFsICdvdXQnCiAgICAgICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIGN0eXBlLCBpbXR5cGUgYW5kIGNzdHlwZSB0eXBlbWFwcy4gSWYgdGhpcyB0eXBlbWFwIGF0dHJpYnV0ZSBpcyBub3QKICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGVuIHRoZSB0eXBlIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBpcyB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICAgIHR5cGVtYXAsIGFzIGhhcyBhbHdheXMgcHJldmlvdXNseSBiZWVuIHRoZSBjYXNlLiBJZiB0aGlzIHR5cGVtYXAgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwKICAgICAgICAgICAgdGhlbiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBvdXRwdXQgdHlwZXMgYW5kIHRoZSB0eXBlIHNwZWNpZmllZAogICAgICAgICAgICBpbiB0aGUgdHlwZW1hcCBpdHNlbGYgaXMgdXNlZCBmb3IgdGhlIGlucHV0IHR5cGUuIEFuIG91dHB1dCB0eXBlIGlzIGEgcmV0dXJuIHZhbHVlIGZyb20KICAgICAgICAgICAgYSB3cmFwcGVkIG1ldGhvZCBvciB3cmFwcGVkIGNvbnN0YW50IGFuZCBhbiBpbnB1dCB0eXBlIGlzIGEgcGFyYW1ldGVyIGluIGEgd3JhcHBlZCBtZXRob2QuCgogICAgICAgICAgICBBbiBleGFtcGxlIHNob3dzIHRoYXQgY2hhciAqIGNvdWxkIGJlIG1hcnNoYWxsZWQgaW4gZGlmZmVyZW50IHdheXMsIAoKICAgICAgICAgICAgICAldHlwZW1hcChpbXR5cGUsIG91dD0iSW50UHRyIikgY2hhciAqICJzdHJpbmciCiAgICAgICAgICAgICAgY2hhciAqIGZ1bmN0aW9uKGNoYXIgKik7CgogICAgICAgICAgICBUaGUgb3V0cHV0IHR5cGUgaXMgdGh1cyBJbnRQdHIgYW5kIHRoZSBpbnB1dCB0eXBlIGlzIHN0cmluZy4gVGhlIHJlc3VsdGluZyBpbnRlcm1lZGlhcnkgQyMgY29kZSBpczoKCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleHRlcm4gSW50UHRyIGZ1bmN0aW9uKHN0cmluZyBqYXJnMSk7CgowNC8yMi8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBGaXggZ2VuZXJhdGlvbiBvZiAiZGVmaW5lLW1ldGhvZCIgZm9yIG1ldGhvZHMgb2YKCSAgICBjbGFzc2VzIHdpdGggYSBjb25zdHJ1Y3Rvci4gIFJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMDQvMTUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgRm9yIHdyYXBwZWQgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG11bHRpcGxlIHZhbHVlcyAodXNpbmcgYXJnb3V0KSwKCSAgICBTV0lHIENISUNLRU4gbm93IHJldHVybnMgdGhlbSBhcyBtdWx0aXBsZSB2YWx1ZXMgaW5zdGVhZCBvZiBhcwoJICAgIGEgbGlzdC4gIFRoZXkgY2FuIHRoZW4gYmUgYWNjZXNzZWQgdXNpbmcgKGNhbGwtd2l0aC12YWx1ZXMpLgoKMDQvMTQvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXQogICAgICAgICAgICArIEFkZGVkIGEgd2hvbGUgYnVuY2ggb2YgbmV3IF9ydW5tZSBzY3JpcHRzIGludG8gdGhlIGNoaWNrZW4gdGVzdAogICAgICAgICAgICBzdWl0ZS4gIEFsc28gZml4IHNvbWUgYnVncyB0aGVzZSBuZXcgc2NyaXB0cyB0dXJuZWQgdXAuCgogICAgICAgICAgICArIEFkZGVkIG9wdGltaXphdGlvbiB3aGVuIHJldHVybmluZyBhIHdyYXBwZWQgcHJveHkgY2xhc3MuICBCZWZvcmUsCiAgICAgICAgICAgIGEgbWlub3IgZ2FyYmFnZSBjb2xsZWN0aW9uIHdhcyBpbnZva2VkIGV2ZXJ5IHRpbWUgYSBmdW5jdGlvbiByZXR1cm5lZC4KCgkgICAgKyBBbGwgdGhlIGNoaWNrZW4gRXhhbXBsZXMgc2hvdWxkIG5vdyBydW4gY29ycmVjdGx5CgowNC8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1vcmUgZml4ZXMgZm9yIHR5cGVtYXAgbWF0Y2hpbmcgd2hlbiB3cmFwcGluZyB2YXJpYWJsZXMsIGluIHBhcnRpY3VsYXIKICAgICAgICAgICAgc3RkOjpzdHJpbmcsIHNvIHRoYXQgc3RkOjpzdHJpbmcgdmFyaWFibGVzIGNhbiBiZSBlYXNpbHkgbWFyc2hhbGxlZCB3aXRoCiAgICAgICAgICAgIGEgQyMgc3RyaW5nIHByb3BlcnR5IHVzaW5nOgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3N0cmluZy5pIgogICAgICAgICAgICAgICVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKnZhcmlhYmxlX25hbWUgfTsKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lOwoKICAgICAgICAgICAgKFJlY2FsbCB0aGF0IGFsbCBjbGFzcyB2YXJpYWJsZXMgYXJlIHdyYXBwZWQgdXNpbmcgcG9pbnRlcnMpCgowNC8wNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICArIEFkZGVkIEV4YW1wbGVzL2NoaWNrZW4vZWdnLCBhbiBleGFtcGxlIG9uIGhvdyB0byBidWlsZCBhIGNoaWNrZW4KCSAgICAgIGV4dGVuc2lvbiBsaWJyYXJ5IGluIHRoZSBmb3JtIG9mIGFuIGVnZy4gIEFsc28gdXBkYXRlZCB0aGUKCSAgICAgIGRvY3VtZW50YXRpb24gb24gdGhlIGRpZmZlcmVudCBsaW5raW5nIG9wdGlvbnMuCgoJICAgICsgY2hpY2tlbiB0ZXN0LXN1aXRlIG5vdyBoYXMgc3VwcG9ydCB0byBjaGVjayBTV0lHIHdpdGggdGhlIC1wcm94eQoJICAgICAgYXJndW1lbnQgaWYgdGhlcmUgZXhpc3RzIGEgX3Byb3h5X3J1bm1lLnNzIGZpbGUuCgoJICAgICsgTW9yZSBmaXhlcyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMgYW5kIC1wcm94eQoKMDMvMzEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgVHVybmVkIG9uIGV4dHJhIHRlbXBsYXRlIGZlYXR1cmVzIGZvciBhbGwgbGFuZ3VhZ2VzIHdoaWNoIHdlcmUKICAgICAgICAgICAgcHJldmlvdXNseSBvbmx5IGF2YWlsYWJsZSB0byBQeXRob24uCgogICAgICAgICAgICBUaGlzIGVuYWJsZXMgdHlwZW1hcHMgZGVmaW5lZCB3aXRoaW4gYSB0ZW1wbGF0ZWQgY2xhc3MgdG8gYmUgdXNlZCBhcwogICAgICAgICAgICBleHBlY3RlZC4gUmVxdWlyZXMgJXRlbXBsYXRlIG9uIHRoZSB0ZW1wbGF0ZWQgY2xhc3MsICV0ZW1wbGF0ZSgpIHdpbGwKICAgICAgICAgICAgYWxzbyBwaWNrIHVwIHRoZSB0eXBlbWFwcy4gRXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vICJpbiB0eXBlbWFwIGZvciBGb288VD4gIgogICAgICAgICAgICAgICAgb3IKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb288VD4gImluIHR5cGVtYXAgZm9yIEZvbzxUPiAiCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vX2kpIEZvbzxpbnQ+OwogICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIEZvbzxkb3VibGU+OwogICAgICAgICAgICAgIAogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIHRoZSBwcm9wZXIgJ2luJyB0eXBlbWFwcyB3aGVyZXZlciBGb288aW50PiBhbmQgRm9vPGRvdWJsZT4KICAgICAgICAgICAgYXJlIHVzZWQuCgowMy8zMC8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBQYXRjaCBmcm9tIEhhbnMgT2VzdGVyaG9sdCBmb3Igc3VwcG9ydGluZyBNelNjaGVtZSAzMHguCgowMy8yOS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICArIFJlYWxsb3cgb2xkZXIgdmVyc2lvbnMgb2YgY2hpY2tlbiAoMS40MCB0byAxLjg5KSBieSBwYXNzaW5nIC1ub2NvbGxlY3Rpb24KCSAgICAgIGFyZ3VtZW50IHRvIFNXSUcKCSAgICArICVpbXBvcnQgbm93IHdvcmtzIGNvcnJlY3RseSB3aXRoIHRpbnljbG9zLiAgKGRlY2xhcmUgKHVzZXMgLi4uKSkgd2lsbCBiZQoJICAgICAgZXhwb3J0ZWQgY29ycmVjdGx5LgoJICAgICsgVGlueUNMT1MgcHJveHkgY2xhc3NlcyBub3cgd29yayBjb3JyZWN0bHkgd2l0aCBvdmVybG9hZGVkIGZ1bmN0aW9ucwoJICAgICAgYW5kIGNvbnN0cnVjdG9ycy4KCjAzLzI5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCBmb3IgZGlyZWN0b3JvdXQgdHlwZW1hcHMuIEphdmEgZGlyZWN0b3JzCiAgICAgICAgICAgIHJlcXVpcmUgdGhlIGRpcmVjdG9yb3V0IHR5cGVtYXBzIGxpa2UgdGhlIG90aGVyIGxhbmd1YWdlcyBub3cuIFRoZSBuZXcKICAgICAgICAgICAgdHlwZW1hcHMgcHJvdmlkZSBmaXhlcyBmb3IgbWV0aG9kcyB3aGVyZSB0aGUgcmV0dXJuIHR5cGUgaXMgcmV0dXJuZWQKICAgICAgICAgICAgYnkgcmVmZXJlbmNlICh0aGlzIGNhbm5vdCBhdXRvbWF0aWNhbGx5IGJlIG1hZGUgdGhyZWFkIHNhZmUgdGhvdWdoKS4KCjAzLzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEVudW0gY2FzdGluZyBmaXhlcy4gVmlzdWFsIEMrKyBkaWRuJ3QgbGlrZSB0aGUgQyB0eXBlIGNhc3RpbmcgU1dJRyBwcm9kdWNlZAogICAgICAgICAgICB3aGVuIHdyYXBwaW5nIEMrKyBlbnVtIHJlZmVyZW5jZXMsIGFzIHJlcG9ydGVkIGJ5IEFkbWlyZSBLYW5kYXdhc3Zpa2EuCgowMy8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gU0YgIzExMjQ0OTAuIEZpeCBQZXJsIG1hY3JvIGNsYXNoZXMgd2hlbiB1c2luZyBWaXN1YWwgU3R1ZGlvJ3MgU1RMIHN0cmluZywKICAgICAgICAgICAgc28gbm93IHByb2plY3RzIGNhbiAjaW5jbHVkZSA8c3RyaW5nPi4KCjAzLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVkICV2YXJhcmdzIHdoaWNoIGdvdCBicm9rZW4gd2l0aCB0aGUgcmVjZW50IGRlZmF1bHQgYXJndW1lbnQgY2hhbmdlcy4KICAgICAgICAgICAgQWxzbyB3b3JrcyBmb3IgSmF2YSBhbmQgQyMgZm9yIHRoZSBmaXJzdCB0aW1lIG5vdy4KCjAzLzE3LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gCgkgICAgKyBGaXggYSB3aG9sZSBidW5jaCBvZiBidWdzIGluIHRoZSBjaGlja2VuIG1vZHVsZS4gIFRoZSBlbnRpcmUKICAgICAgICAgICAgICB0ZXN0IHN1aXRlIG5vdyBjb21waWxlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSB0ZXN0cyB0aGF0IHJlcXVpcmUKCSAgICAgIHN0ZF92ZWN0b3IuaSwgc3RkX2RlcXVlLmksIGFuZCBzbyBvbiwgd2hpY2ggY2hpY2tlbiBkb2VzIG5vdCBoYXZlIHlldC4KCgkgICAgKyBBZGQgc3VwcG9ydCBmb3IgJWV4Y2VwdGlvbiBhbmQgJXR5cGVtYXAoZXhjZXB0aW9ucykuICBFeGNlcHRpb25zIGFyZQoJICAgICAgdGhyb3duIHdpdGggYSBjYWxsIHRvIChhYm9ydCkgYW5kIGNhbiBiZSBoYW5kbGVkIGJ5IChoYW5kbGUtZXhjZXB0aW9ucykKCjAzLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCBmb3IgZGlyZWN0b3JzLiBNb2RpZmljYXRpb25zIHRvIHRoZSB0eXBlbWFwcwogICAgICAgICAgICBnaXZpbmcgdXNlcnMgZmluZSBjb250cm9sIG92ZXIgbWVtb3J5IG93bmVyc2hpcCBhbmQgbGlmZXRpbWUgb2YgZGlyZWN0b3IgY2xhc3Nlcy4KICAgICAgICAgICAgRGlyZWN0b3IgY2xhc3NlcyBubyBsb25nZXIgbGl2ZSBmb3JldmVyIGJ5IGRlZmF1bHQgYXMgdGhleSBhcmUgbm93IGNvbGxlY3RhYmxlCiAgICAgICAgICAgIGJ5IHRoZSBHQy4KCjAzLzE1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXSBBZGQgc3VwcG9ydCBmb3IgYWRkaW5nIGZpbmFsaXplcnMgZ2FyYmFnZSBjb2xsZWN0ZWQgb2JqZWN0cy4KCSAgICBGdW5jdGlvbnMgdGhhdCByZXR1cm4gbmV3IG9iamVjdHMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoICVuZXdvYmplY3QgYW5kCgkgICAgaW5wdXQgYXJndW1lbnRzIHdoaWNoIGNvbnN1bWUgKG9yIHRha2Ugb3duZXJzaGlwKSBvZiBhIHBvaW50ZXIgc2hvdWxkCgkgICAgYmUgbWFya2VkIHdpdGggdGhlIERJU09XTiB0eXBlbWFwLgoKCSAgICBBbHNvIGFkZCBzdXBwb3J0IGZvciBjb3JyZWN0bHkgY2hlY2tpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkCgkgICAgdG8gYSBmdW5jdGlvbiwgYW5kIHJhaXNpbmcgYW4gZXJyb3IgaWYgdGhlIHdyb25nIG51bWJlciBhcmUgcGFzc2VkLgoKMDMvMTQvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIEFkZCAtLXdpdGhvdXQtYWxsbGFuZyBvcHRpb24gdG8gY29uZmlndXJlLmluLCB3aGljaCBpcyB0aGUgc2FtZSBhcwogICAgICAgICAgICBwYXNzaW5nIGFsbCB0aGUgLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcGVybDUgZXRjLi4uIHRoYXQgTWF0dGhpYXMgYWRkZWQuCgowMy8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBNZW1vcnkgbGVhayBmaXggZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgY2xhc3Nlcy9zdHJ1Y3RzIGJ5IHZhbHVlLgoKMDMvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCBmb3IgUGVybCBpbmNvcnJlY3RseSB0YWtpbmcgbWVtb3J5IG93bmVyc2hpcCBmb3IgcmV0dXJuIHR5cGVzIHRoYXQKICAgICAgICAgICAgYXJlIHR5cGVkZWZzIHRvIGEgc3RydWN0L2NsYXNzIHBvaW50ZXIuIFJlcG9ydGVkIGJ5IEpvc2ggQ2hlcnJ5LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBWYXJpb3VzIGV4Y2VwdGlvbiBjaGFuZ2VzIGZvciB0aGUgc3RkOjp2ZWN0b3Igd3JhcHBlcnMuIFRoZXNlIG5vdyBtb3JlCiAgICAgICAgICAgIGFjY3VyYXRlbHkgbWlycm9yIHRoZSBzYW1lIGV4Y2VwdGlvbnMgdGhhdCBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0IHRocm93LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggdW5kZWZpbmVkIGJlaGF2aW91ciBhZnRlciBhbnkgb2YgdGhlIHN0ZDo6dmVjdG9yIG1ldGhvZHMKICAgICAgICAgICAgdGhyb3cgYW4gZXhjZXB0aW9uLgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBXaGVuIG51bGwgaXMgcGFzc2VkIGZvciBhIEMrKyByZWZlcmVuY2Ugb3IgdmFsdWUgcGFyYW1ldGVyLCB0aGUgCiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24gaGFzIGJlZW4gY29ycmVjdGVkIHRvIGFuIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBpbnN0ZWFkCiAgICAgICAgICAgIG9mIE51bGxSZWZlcmVuY2VFeGNlcHRpb24gYXMgcmVjb21tZW5kZWQgaW4gdGhlIC5ORVQgRnJhbWV3b3JrIGRvY3VtZW50YXRpb24uCgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0aHJvd3MgdHlwZW1hcHMgdHVybiBhIEMrKyBleGNlcHRpb24gaW50byBhbiBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKICAgICAgICAgICAgbm90IGEgU3lzdGVtRXhjZXB0aW9uIG5vdy4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTnVtZXJvdXMgY2hhbmdlcyBpbiBDIyBleGNlcHRpb24gaGFuZGxpbmcgaGF2ZSBiZWVuIG1hZGUgb3ZlciB0aGUgcGFzdAogICAgICAgICAgICBmZXcgd2Vla3MuIEEgc3VtbWFyeSBmb2xsb3dzOgoKICAgICAgICAgICAgVGhlIHdheSBpbiB3aGljaCBDKysgZXhjZXB0aW9ucyBhcmUgbWFwcGVkIHRvIEMjIGV4Y2VwdGlvbnMgaXMgcXVpdGUgZGlmZmVyZW50LgogICAgICAgICAgICBUaGUgY2hhbmdlIGlzIHRvIGZpeCBDIyBleGNlcHRpb25zIHNvIHRoYXQgdGhlIEMrKyBleGNlcHRpb24gc3RhY2sgaXMgY29ycmVjdGx5CiAgICAgICAgICAgIHVud291bmQgYXMgcHJldmlvdXNseSBDKysgZXhjZXB0aW9ucyB3ZXJlIGJlaW5nIHRocm93biBhY3Jvc3MgdGhlIEMgUEludm9rZSBsYXllcgogICAgICAgICAgICBpbnRvIHRoZSBtYW5hZ2VkIHdvcmxkLgoKICAgICAgICAgICAgTmV3IHR5cGVtYXAgYXR0cmlidXRlcyAoY2FudGhyb3cgYW5kIGV4Y29kZSkgaGF2ZSBiZWVuIGludHJvZHVjZWQgdG8gY29udHJvbCB0aGUKICAgICAgICAgICAgbWFwcGluZyBvZiBDKysgdG8gQyMgZXhjZXB0aW9ucy4gRXNzZW50aWFsbHkgYSBjYWxsYmFjayBpbnRvIHRoZSB1bm1hbmFnZWQgd29ybGQKICAgICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSBwZW5kaW5nIGV4Y2VwdGlvbi4gVGhlIGV4Y2VwdGlvbiB0byB0aHJvdyBpcyBzdG9yZWQgaW4gdGhyZWFkIGxvY2FsCiAgICAgICAgICAgIHN0b3JhZ2UgKHNvIHRoZSBhcHByb2FjaCBpcyB0aHJlYWQtc2FmZSkuIFRoZSB0eXBlbWFwcyBhcmUgZXhwZWN0ZWQgdG8gcmV0dXJuCiAgICAgICAgICAgIGZyb20gdW5tYW5hZ2VkIGNvZGUgYXMgc29vbiBhcyB0aGUgcGVuZGluZyBleGNlcHRpb24gaXMgc2V0LiBBbnkgcGVuZGluZyBleGNlcHRpb25zCiAgICAgICAgICAgIGFyZSBjaGVja2VkIGZvciBhbmQgdGhyb3duIG9uY2UgbWFuYWdlZCBjb2RlIHN0YXJ0cyBleGVjdXRpbmcuIFRoZXJlIHNob3VsZAogICAgICAgICAgICBiZSBtaW5pbWFsIGltcGFjdCBvbiBleGVjdXRpb24gc3BlZWQgZHVyaW5nIG5vcm1hbCBiZWhhdmlvdXIuIEZ1bGwgZGV0YWlscyB3aWxsIGJlCiAgICAgICAgICAgIGRvY3VtZW50ZWQgaW4gQ1NoYXJwLmh0bWwuCgogICAgICAgICAgICBUaGUgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbigpIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggdGhlCiAgICAgICAgICAgIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbkFyZ3VtZW50KCkgYW5kIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbigpCiAgICAgICAgICAgIGZ1bmN0aW9ucy4gVGhlIG9yaWdpbmFsIG5hbWUgaGFzIGJlZW4gZGVsaWJlcmF0ZWx5IGNoYW5nZWQgdG8gYnJlYWsgb2xkIGNvZGUgYXMKICAgICAgICAgICAgdGhlIG9sZCBhcHByb2FjaCB3YXMgc29tZXdoYXQgZmxhd2VkLiBBbnkgdXNlciBkZWZpbmVkIGV4Y2VwdGlvbnMgdGhhdCBmb2xsb3cgdGhlCiAgICAgICAgICAgIHNhbWUgcGF0dGVybiBhcyB0aGUgb2xkIGFwcHJvYWNoIHNob3VsZCBhbHNvIGJlIGZpeGVkLgoKICAgICAgICAgICAgTnVtZXJvdXMgbmV3IC5ORVQgZnJhbWV3b3JrIGV4Y2VwdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUgZm9yIGVhc3kgdGhyb3dpbmcgZnJvbSAKICAgICAgICAgICAgdW5tYW5hZ2VkIGNvZGUuIFRoZSBjb21wbGV0ZSBsaXN0IGlzOiAKCiAgICAgICAgICAgICAgQXBwbGljYXRpb25FeGNlcHRpb24sIEFyaXRobWV0aWNFeGNlcHRpb24sIERpdmlkZUJ5WmVyb0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLCBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiwgT3V0T2ZNZW1vcnlFeGNlcHRpb24sIE92ZXJmbG93RXhjZXB0aW9uLCAKICAgICAgICAgICAgICBTeXN0ZW1FeGNlcHRpb24sIEFyZ3VtZW50RXhjZXB0aW9uLCBBcmd1bWVudE51bGxFeGNlcHRpb24gYW5kCiAgICAgICAgICAgICAgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzA1LzIwMDU6IG1tYXR1cwoJICAgIAoJICAgIEZpeCBzZXZlcmFsIG1lbW9yeSBsZWFrcyBhcm91bmQuIEV2ZW4gd2hlbiB3ZSBzdXJ2aXZlICBrbm93bmluZwoJICAgIHN3aWcgaXMgYSBtZW1vcnkgbGVhayBmYWN0b3J5LCBpdCB3YXMgYSBsaXR0bGUgb3V0IG9mCgkgICAgY29udHJvbC4gVG8gcnVuIHN0ZF9jb250YWluZXJzLmkgaW4gdGhlIHB5dGhvbiB0ZXN0LXN1aXRlLAoJICAgIHN3aWcgd2FzIHVzaW5nIH4yNjBNQiwgbm93IGl0IHVzZXMgJ29ubHknIH40ME1CLCB3aGljaCBpcwoJICAgIHRoZSBzYW1lIGFtbW91bnQgdGhhdCBnKysgdXNlcywgc28sIGlzIG5vdCB0aGF0IGJhZC4KCSAgICBJbiB0aGUgcHJvY2VzcywgSSBmb3VuZCBhIGNvdXBsZSBvZiBleHRyYSBEZWxldGVzLCB3aGljaAoJICAgIGluIHNvbWUgY2FzZXMgY291bGQgdHJpZ2dlciBzZWcuIGZhdWx0cyBhbmQvb3IKCSAgICBET0gvYXNzZXJ0cy4KCSAgICAKCSAgICBbcHl0aG9uXSBCZXR0ZXIgc3VwcG9ydCBmb3IgZGlyZWN0b3JzICsgZXhjZXB0aW9uLiBNb3JlCgkgICAgdmVyYm9zZSBlcnJvcnMgYW5kIGFkZGVkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhbmRsZXIuCgoJICAgIFtweXRob25dIEZpeCBtZW1vcnkgbGVhayBmb3IgdGhlCgoJICAgIAkgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50PiA+IAoKCSAgICBjYXNlLHJlcG9ydGVkIGJ5IEJvIFBlbmcuCgoJICAgIFtweXRob25dIEZpeCBTd2lnUHlPYmplY3QgY29tcGFyZSBwcm9ibGVtIHJlcG9ydGUgYnkKCSAgICBDYW1lcm9uIFBhdHJpY2suIAoKCSAgICBbcHl0aG9uXSBGaXggc2V2ZXJhbCB3YXJuaW5ncyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgCgkgICAgZm9yIGdudS1nY2MsIEludGVsIGFuZCBWQzcuMSAgY29tcGlsZXJzLgoKCjAyLzI1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFVwZGF0ZSBkb2N1bWVudGF0aW9uIHRvIHVzZSBDU1MgYW5kIDxkaXY+IGluc3RlYWQgb2YgPGJsb2NrcXVvdGU+CgkgICAgSSB1c2VkIGEgc2NyaXB0IHRvIGNvbnZlcnQgdGhlIGRvY3MsIGFuZCBpdCBzZXQgYWxsIHRoZSBib3ggY2xhc3NlcwoJICAgIHRvIGJlICJjb2RlIi4gIFRoZXJlIGFyZSBhY3R1YWxseSA0IGRpZmZlcmVudCBjbGFzc2VzLAoJICAgICJzaGVsbCIsICJjb2RlIiwgInRhcmdldGxhbmciLCBhbmQgImRpYWdyYW0iLiAgV2UgbmVlZCB0byBnbyB0aHJvdWdoCgkgICAgYW5kIGNvbnZlcnQgdGhlIGRpdnMgZGVwZW5kaW5nIG9uIHdoYXQgdGhleSBjb250YWluLgoKMDIvMjMvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGVkIG9wdGlvbiAtbm9ydHRpIHRvIGRpc2FibGUgdGhlIHVzZSBvZiBuYXRpdmUKCSAgICBDKysgUlRUSSB3aXRoIGRpcmVjdG9ycyAoZHluYW1pY19jYXN0PD4gaXMgbm90IHVzZWQpLgoKCSAgICBBZGQgbW9yZSBjb2RlIGZvciBkaXJlY3RvcnMgdG8gZGV0ZWN0IGFuZCByZXBvcnQgZXJyb3JzIGluCgkgICAgdGhlIHB5dGhvbiBzaWRlLgoKCSAgICBFeHRlbmQgdGhlIHVzZSBvZiBTV0lHSU5URVJOIHdoZW5ldmVyIGlzIHBvc3NpYmxlLgoKCSAgICBSZW1vdmUgdGVtcGxhdGUgd2FybmluZ3MgcmVwb3J0ZWQgYnkgVkM3LjEuCgoJICAgIFJlbW92ZSB3YXJuaW5ncyByZXBvcnRlZCBieSBnY2MvZysrLiBGaW5hbGx5IHlvdSBjYW4KCSAgICBjb21waWxlIHVzaW5nCgoJICAgICAgIGcrKyAtVyAtV2FsbCAtYyBteW1vZHVsZV93cmFwLmN4eAoKCSAgICBhbmQgbm8gc3B1cmlvdXMgZXJyb3JzIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHRoZSB3cmFwcGVyCgkgICAgY29kZS4KCjAyLzIzLzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIEFkZGVkIC1leHRlcm5hbC1ydW50aW1lIGFyZ3VtZW50LiAgVGhpcyBhcmd1bWVudCBpcyB1c2VkIHRvIGR1bXAKCSAgICBvdXQgYWxsIHRoZSBjb2RlIG5lZWRlZCBmb3IgZXh0ZXJuYWwgYWNjZXNzIHRvIHRoZSBydW50aW1lIHN5c3RlbSwKCSAgICBhbmQgaXQgcmVwbGFjZXMgaW5jbHVkaW5nIHRoZSBmaWxlcyBkaXJlY3RseS4gIFRoaXMgY2hhbmdlIGFkZHMKCSAgICB0d28gbmV3IHZpcnR1YWwgZnVuY3Rpb25zIHRvIHRoZSBMYW5ndWFnZSBjbGFzcywgd2hpY2ggYXJlIHVzZWQKCSAgICB0byBmaW5kIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBydW50aW1lIGNvZGUuICBJIGFsc28gdXBkYXRlZAoJICAgIGFsbCBsYW5ndWFnZXMgdGhhdCB1c2UgdGhlIHJ1bnRpbWUgdG8gaW1wbGVtZW50IHRoZXNlIHR3byBmdW5jdGlvbnMuCgowMi8yMi8yMDA1OiBtbWF0dXMgCgkgICAgRml4ICV0ZW1wbGF0ZSArIHByaXZhdGUgZXJyb3IgU0YjMTA5OTk3Ni4KCjAyLzIxLzIwMDU6IG1tYXR1cyAKCgkgICAgRml4IHN3aWdydW4uc3dnIHdhcm5pbmdzIHJlcG9ydGVkIHdoZW4gdXNpbmcgImdjYyAtVyAtV2FsbCIKCSAgICAoc3RhdGljL2lubGluZSBub3QgdXNlZCBpbiBmcm9udCBvZiBhIGZ1bmN0aW9uCgkgICAgZGVjbGFyYXRpb24pLCBhbmQgYWRkIFNXSUdVTlVTRUQgYXR0cmlidXRlIHRvIGF2b2lkCgkgICAgdW51c2VkIHdhcm5pbmdzIGVsc2V3aGVyZS4KCgkgICAgRml4IHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncy4KCgkgICAgW1B5dGhvbl0gVXNlIG5ldyBTV0lHVU5VU0VEIGF0dHJpYnV0ZSB0byBhdm9pZCB3YXJuaW5ncyBpbgoJICAgIFNXSUdJTlRFUk4gbWV0aG9kcy4KCgkgICAgW1B5dGhvbl0gRml4IFB5T1Nfc25wcmludGYgZm9yIHB5dGhvbiB2ZXJzaW9ucyA8IDIuMiAoU0YgIzExMDQ5MTkpLgoKCSAgICBbUHl0aG9uXSBGaXggbWFwL211bHRpbWFwIHRvIGFsbG93IGVtcHR5IG1hcHMgKHJlcG9ydGVkIGJ5CiAgCSAgICBQaGlsaXBwZSBIZXRyb3kpLgoKCSAgICBbRG9jc10gQWRkIHNvbWUgZG9jdW1lbnRhdGlvbiB0byBQeXRob24uaHRtbCBhbmQKCSAgICBTV0lHUGx1cy5odG1sLCBpbmNsdWRpbmcgZm9yIGV4YW1wbGUgdGhlIGZhY3QgdGhhdAoJICAgICdmcmllbmRzJyBhcmUgbm93IHN1cHBvcnRlZC4KCjAyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQSFBdIFBhdGNoIGZyb20gT2xseSBCZXR0cywgc28gdGhhdCB3cmFwcGVycyBjb21waWxlIHdpdGggWmVuZCB0aHJlYWQgc2FmZXR5IGVuYWJsZWQuCgowMi8xNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNZW1vcnkgbGVhayBmaXggaW4gc29tZSBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIG1vZHVsZXMgd2hlbiB1c2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyBpbiBjb25zdHJ1Y3RvcnMuIFRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugd2FzIG5vdCB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZQogICAgICAgICAgICBDKysgb2JqZWN0IG1lbW9yeSB3aGVuIGFueSBvZiB0aGUgY29uc3RydWN0b3JzIHRoYXQgdXNlIGRlZmF1bHQgYXJndW1lbnRzIHdhcyBjYWxsZWQuCgowMi8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMTExNTA1NTogRmFpbGVkIG1ha2UgaW5zdGFsbC4gUGF0Y2ggZnJvbSBSb2IgU3RvbmUuCgowMi8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgIzExMjM0MTYgZnJvbSBQYXVsIE1vb3JlLiBDb3JyZWN0IG1lbW9yeSBhbGxvY2F0aW9uIGZvciBTVFJJTkdBUlJBWQogICAgICAgICAgICB0eXBlbWFwcyBpbiB2YXJpb3VzLmkuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXNhYmxlZCB0eXBlbWFwIHNlYXJjaCBjaGFuZ2VzIGZvciBub3cgKHNlZSBlbnRyeSAxOS8xMi8yMDA0KS4gSXQgYnJlYWtzCiAgICAgICAgICAgIG9sZCB0eXBlbWFwcywgbGVuZ3RoZW5zIHRoZSBleGVjdXRpb24gdGltZSBieSBhYm91dCAyNSUgYW5kIGludHJvZHVjZXMKICAgICAgICAgICAgaW5jb25zaXN0ZW5jaWVzLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgc3dpZyAtaGVscCBmb2xsb3dzIG90aGVyIHNvZnR3YXJlIGJ5IHByaW50aW5nIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciBub3cuCiAgICAgICAgICAgIHN3aWcgLXZlcnNpb24gYWxzbyBkaXNwbGF5cyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIgbm93LgogICAgICAgICAgICBCZWhhdmlvdXIgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBmb3IgdGhlIGxlc3MgY29tbW9ubHkgdXNlZCBvcmRlcmluZyBvZiAlaW5jbHVkZSBhbmQgI2luY2x1ZGUsIHNvCiAgICAgICAgICAgIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLiBCdWcgcmVwb3J0ZWQgYnkgcmVwb3J0ZWQgYnkgTWF4IEJvd3NoZXIuCiAgICAgICAgICAgICAgJWluY2x1ZGUgZm9vLmgKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICNpbmNsdWRlIGZvby5oCiAgICAgICAgICAgICAgJX0gCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIFNXSUdfZXhjZXB0aW9uIG1hY3JvIHdpbGwgbm93IHJldHVybiBmcm9tIHVubWFuYWdlZCBjb2RlIC8gbmF0aXZlIGNvZGUKICAgICAgICAgICAgYXMgc29vbiBhcyBpdCBpcyBjYWxsZWQuIEZpeGVzIHBvc3NpYmxlIEpWTSBjcmFzaGVzIGFuZCBvdGhlciBjb2RlIHVuZXhwZWN0ZWRseQogICAgICAgICAgICBiZWluZyBleGVjdXRlZC4gTm90ZSBTV0lHX2V4Y2VwdGlvbiBpcyBvbmx5IG9jY2FzaW9uYWxseSB1c2VkIGJ5IFNXSUcgbGlicmFyeQogICAgICAgICAgICB3cml0ZXJzLCBhbmQgaXMgYmVzdCBhdm9pZGVkIGJ5IFNXSUcgdXNlcnMuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIFR5cGVtYXBzIGNhbiBub3cgYmUgdGFyZ2V0ZWQgYXQgZ2xvYmFsIHZhcmlhYmxlIG5hbWVzCiAgICAgICAgICAgIGFuZCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlIG5hbWVzLiBQcmV2aW91c2x5IHRoZSB0eXBlbWFwcyBmb3IgCiAgICAgICAgICAgIHRoZSBzZXR0ZXJzIHdlcmUgaWdub3JlZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgZ2xvYmFsaW50ICIuLi4iCiAgICAgICAgICAgICAgaW50IGdsb2JhbGludDsKCjAyLzEzLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZCAldHlwZWNoZWNrIGZvciBTV0lHVFlQRSwgYWRkICV0eXBlY2hlY2sgZm9yIHB0cmRpZmZfdCwgZml4CgkgICAgdHlwZW1hcHMgZm9yIHNpemVfdC4KCgkgICAgW1Bpa2VdIE1lcmdlIHBhdGNoIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmIGZvciBpbXByb3ZlZCBQaWtlIGNvbmZpZ3VyYXRpb24uCgowMi8xMi8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgTmV3IGNvbmZpZ3VyZSBzd2l0Y2hlcyAtLXdpdGhvdXQtdGNsLCAtLXdpdGhvdXQtcHl0aG9uIGV0Yy4gYWxsb3cgdG8KICAgICAgICAgICAgZGlzYWJsZSB0aGUgc2VhcmNoIGZvciBpbnN0YWxsZWQgbGFuZ3VhZ2VzLgoKMDEvMzEvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gQWRkIERvaFNvcnRMaXN0IHRvIERPSAoJICAgIAoJICAgIC0gSW1wcm92ZSB0aGUgcnVudGltZSB0eXBlIHN5c3RlbToKICAgICAgICAgICAgICAgKyBTcGVlZC4gVHlwZSBsb2FkaW5nIGlzIG5vdyBPKG4gbG9nIG4pIGluc3RlYWQgb2YgTyhOXjIpLCB3aGljaAoJICAgICAgICAgZm9yIGxhcmdlIG1vZHVsZXMgaXMgYSBodWdlIGltcHJvdmVtZW50LgogICAgICAgICAgICAgICArIEEgd2hvbGUgYnVuY2ggb2YgZnVuY3Rpb25zIGluIHN3aWdydW4uc3dnIG5vIGxvbmdlciBuZWVkIHRoZSAKICAgICAgICAgICAgICAgICBzd2lnX3R5cGVfbGlzdF9oYW5kbGUgcGFzc2VkIHRvIHRoZW0uICBUaGUgb25seSBvbmUgbGVmdCBpcyAKCQkgVHlwZVF1ZXJ5LiAgVGhpcyBhbHNvIG1ha2VzIHJ1bnRpbWUuc3dnIGEgbG90IHNtYWxsZXIuCgkgICAgICAgKyBTcGxpdCB1cCBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUgaW50byB0d28gc3RydWN0dXJlcwoJICAgICAgICAgKHN3aWdfdHlwZV9pbmZvIGFuZCBzd2lnX2Nhc3RfaW5mbykKCSAgICAgICArIFN0b3JlIGEgcG9pbnRlciB0byBhIHN3aWdfdHlwZV9pbmZvIHJhdGhlciB0aGFuIGp1c3QgdGhlIHR5cGUKCSAgICAgICAgIG5hbWUgc3RyaW5nIGluIHRoZSBsaW5rZWQgbGlzdCBvZiBjYXN0cy4gRmlyc3Qgb2ZmLCB0aGlzIG1ha2VzCgkgICAgICAgICB0aGUgZ3VpbGUgbW9kdWxlIGEgbGl0dGxlIGZhc3RlciwgYW5kIHNlY29uZCwgdGhlCgkgICAgICAgICBTV0lHX1R5cGVDbGllbnREYXRhKCkgZnVuY3Rpb24gaXMgZmFzdGVyIHRvby4gCgkgICAgICAgKyBBZGQgdGhlIGlkZWEgb2YgYSBtb2R1bGUgaW50byB0aGUgdHlwZSBzeXN0ZW0uICBCZWZvcmUsIGFsbCB0aGUKCSAgICAgICAgIHR5cGVzIHdlcmUgc3RvcmVkIGluIG9uZSBodWdlIGxpbmtlZCBsaXN0LiBOb3csIGFub3RoZXIgbGV2ZWwgaXMKCSAgICAgICAgIGFkZGVkLCBhbmQgdGhlIHR5cGUgc3lzdGVtIHN0b3JlcyBhIGxpbmtlZCBsaXN0IG9mIG1vZHVsZXMsIGVhY2gKCSAgICAgICAgIG9mIHdoaWNoIHN0b3JlcyBhbiBhcnJheSBvZiB0eXBlcyBhc3NvY2lhdGVkIHdpdGggaXQuCgkgICAgICAgKyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvZiBob3cgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gbm93IHdvcmtzLAoJICAgICAgICAgcGxlYXNlIHNlZSBEb2MvTWFudWFsL3R5cGVtYXBzLmh0bWwgYW5kIERvYy9EZXZlbC9ydW50aW1lLnR4dAoJCSAKCSAgICAtIFVwZGF0ZSBhbGwgbGFuZ3VhZ2UgbW9kdWxlcyB0byB1c2UgdGhlIG5ldyB0eXBlIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCgkgICAgICB0byBlYWNoIGxhbmd1YWdlIG1vZHVsZSBhcmUgbWlub3IuICBBbGwgbGFuZ3VhZ2VzIGFyZSBub3cgYWJsZSB0bwoJICAgICAgdXNlIHJ1bnRpbWUuc3dnIGZvciBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIHR5cGUgc3lzdGVtLiAgQmVmb3JlCgkgICAgICBvbmx5IHB5dGhvbiBhbmQgcGVybCBkaWQuCgoJICAgIC0gW2d1aWxlLCBtenNjaGVtZSwgb2NhbWwsIGFuZCBwaHA0XSAgVGhlc2UgbGFuZ3VhZ2VzIG9wZW5lZCB1cCB0aGUKCSAgICAgIGluaXQgZnVuY3Rpb24gaW5zaWRlIHRoZSAuY3h4IGNvZGUsIGFuZCBhbnkgY29kZSBpbiB0aGUgLnN3ZyBmaWxlcwoJICAgICAgaW4gdGhlIGluaXQgc2VjdGlvbiB3YXMgaW5zaWRlIHRoaXMgZnVuY3Rpb24uICBUaGlzIHdhcyBhIHByb2JsZW0KCSAgICAgIGZvciBzd2lnaW5pdC5zd2csIHdoaWNoIG5lZWRzIHRvIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgU1dJR19pbml0CgkgICAgICBmdW5jdGlvbiBpcyBvcGVuZWQuICBUaHVzIEkgY2hhbmdlZCB0aGVzZSBsYW5ndWFnZXMgdG8gYmUgbGlrZQoJICAgICAgcHl0aG9uIG9yIHBlcmwsIHdoZXJlIHRoZSBpbml0IGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSAuc3dnCgkgICAgICBmaWxlLgoJICAgICAgCgkgICAgLSBbUnVieV0gSW5zdGVhZCBvZiBtb3ZpbmcgdGhlIGluaXQgZnVuY3Rpb24gdG8gdGhlIC5zd2cgZmlsZSwgSQoJICAgICAgYWRkZWQgYSBuZXcgc2VjdGlvbiBpbml0YmVmb3JlZnVuYywgYW5kIHRoZW4gYWRkZWQKCSAgICAgICVpbnNlcnQoaW5pdGJlZm9yZWZ1bmMpICJzd2lnaW5pdC5zd2ciCgoJICAgIC0gW016U2NoZW1lXSBGaXggZW51bXMgYW5kIGZpeCBFeGFtcGxlcy9NYWtlZmlsZS5pbiBzbyB0aGF0IGlmCgkgICAgICBtdWx0aXBsZSAtSSBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgSU5DTFVERVMgdmFyaWFibGUsIGVhY2gKCSAgICAgIGdldHMgYSArK2NjZi4KCgkgICAgLSBbR3VpbGUgR0hdIFVwZGF0ZSBHdWlsZSBHSCB0byB1c2UgdGhlIG5ldyB0eXBlIHN5c3RlbS4gIFNlZQoJICAgICAgRG9jL01hbnVhbC9HdWlsZS5odG1sIGZvciBob3cgc21vYnMgYXJlIG5vdyB1c2VkLgoKMDEvMTEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgdHlwZW1hcCBjYWxsZWQgJ2NzY29uc3RydWN0Jy4gVGhlIGNvZGUgaW4gdGhpcyB0eXBlbWFwcyB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgICAgICAgIGNvZGVkIGFuZCBjb3VsZCBub3QgYmUgY3VzdG9taXNlZCBieSBhIHVzZXIuIFRoaXMgdHlwZW1hcCBjb250YWlucyB0aGUgY29kZSB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnRvIGEgcHJveHkgY2xhc3MncyBjb25zdHJ1Y3Rvci4KCiAgICAgICAgICAgIFtKYXZhXSBOZXcgdHlwZW1hcCBjYWxsZWQgJ2phdmFjb25zdHJ1Y3QnLiBUaGUgY29kZSBpbiB0aGlzIHR5cGVtYXBzIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICAgICAgICAgY29kZWQgYW5kIGNvdWxkIG5vdCBiZSBjdXN0b21pc2VkIGJ5IGEgdXNlci4gVGhpcyB0eXBlbWFwIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGludG8gYSBwcm94eSBjbGFzcydzIGNvbnN0cnVjdG9yLiBBbm90aGVyIHR5cGVtYXAgbmFtZWQgJ2phdmFjb25zdHJ1Y3RfZGlyZWN0b3InCiAgICAgICAgICAgIGlzIHVzZWQgaW5zdGVhZCB3aGVuIHRoZSBwcm94eSBjbGFzcyBpcyBhIGRpcmVjdG9yIGNsYXNzLgoKICAgICAgICAgICAgW0MjLCBKYXZhXSBJZiBhIEMrKyBjbGFzcyBkaWQgbm90IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBhIHByb3RlY3RlZCBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgICAgIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBTV0lHLiBUaGlzIHNlZW1zIGlzIHVubmVjZXNzYXJ5IGFuZCBoYXMgYmVlbiByZW1vdmVkCiAgICAgICAgICAgIGFuZCB0aGVyZWJ5IGdpdmluZyB0aGUgdXNlciBhbG1vc3QgY29tcGxldGUgY29udHJvbCBvdmVyIHRoZSBnZW5lcmF0ZWQgY29kZSBhbG9uZyB3aXRoIHRoZQogICAgICAgICAgICBuZXcgdHlwZW1hcHMgYWJvdmUuCgoxOS8xMi8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgW0Rpc2FibGVkLCBzZWUgZW50cnkgMDIvMTUvMjAwNF0KICAgICAgICAgICAgLSBGaXggdHlwZW1hcCBzZWFyY2gsIG5vdyB0aGUgIm91dCIgdHlwZW1hcCBzZWFyY2ggaXMgZG9uZSBhcyBmb2xsb3dzCgogICAgICAgICAgICAgICAgIGludCAqRm9vOjpmb28oaW50IGJhcikgICAtPiAgaW50ICpGb286OmZvbyhpbnQgYmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpGb286OmZvbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpmb28oaW50IGJhcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqZm9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKgoKICAgICAgICAgICAgICAgdGhlbiwgbm93IHlvdSBjYW4gYmUgbW9yZSBzcGVjaWZpYywgYW5kIGRlZmluZQoKICAgICAgICAgICAgICAvKiBhcHBseSBvbmx5IGZvciAgJ0Zvbzo6Zm9vJyBtZXRob2QgKi8KICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCAqIEZvbzo6Zm9vKGludCAqYmFyKSAuLi47IAoKICAgICAgICAgICAgICAvKiBhcHBseSBmb3IgYWxsICdmb28nIGZ1bmN0aW9ucy9tZXRob2RzICovCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgKiBmb28oaW50ICpiYXIpIC4uLjsgCgogICAgICAgICAgICAgICVpbmxpbmUgewogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICBpbnQgKmZvbyhpbnQgKmJhcik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KCSAgCgoxNS8xMi8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgLSBNb3JlIGZpeGVzIGZvciB0ZW1wbGF0ZXMgYW5kIHRlbXBsYXRlIGRlZmF1bHQgYXJncy4KICAgICAgICAgICAgICBTZWUgdGVtcGxhdGVfZGVmYXVsdC5pIGZvciBzY2FyeSBjYXNlcyB0aGF0IG5vdyBhcmUgCiAgICAgICAgICAgICAgc3VwcG9ydGVkLCBiZXNpZGVzIHRoZSBhbHJlYWR5IHVnbHkgU1RML3N0ZCBjYXNlcy4KICAgICAgICAgICAgICAKICAgICAgICAgICAgLSBDb3NtZXRpY3MgYW5kIG1vcmUgdXNlIG9mICdjb25zdCcgd2hlcmUgaXQgd2FzIGltcGxpY2l0LgogICAgICAgICAgICAtIE90aGVyIGZpeGVzIGZvciBPU1MsIHdoaWNoIGlzIG5vdyB3b3JraW5nIGFnYWluIHdpdGggMS4zLjI1LgoJClZlcnNpb24gMS4zLjI0IChEZWNlbWJlciAxNCwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMTIvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSBGaXggYSBidW5jaCBvZiBidWdzIHJlbGF0aW5nIHRvIC1wcm94eSBzdXBwb3J0CgkgICAgICArIG5vbi1jbGFzcyB2YXJpYWJsZXMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgbWVtYmVyIGNsYXNzIHZhcmlhYmxlcyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBhZGRlZCBhIC1ub3VuaXQgYXJndW1lbnQsIHdoaWNoIGRvZXMgbm90IGV4cG9ydCB0aGUgKGRlY2xhcmUgKHVuaXQgLi4uKSkKCSAgICAgICsgY29ycmVjdGx5IGluc3RhbGwgc3dpZ2Nsb3NwcmVmaXguc2NtCgkgICAgICArIGNvbnN0YW50cyAoZW51bXMsIGRlZmluZXMpIG5vdyBjb3JyZWNseSBleHBvcnQgd2hlbiB1c2luZyAtcHJveHkKCjEyLzExLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIGNvbmZpZ3VyZSBmaXggZm9yIHdoZW4gbW9yZSB0aGFuIG9uZSB2ZXJzaW9uIG9mIGpuaV9tZC5oIGlzIGZvdW5kCiAgICAgICAgICAgIGluIHRoZSBKYXZhIGluY2x1ZGUgZGlyZWN0b3J5ICh3YXMgZ2VuZXJhdGluZyBsb3RzIG9mIHNlZCBlcnJvcgogICAgICAgICAgICBtZXNzYWdlcykuCgoxMi8wOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgdG8gYXJyYXlzX2phdmEuaSBzbyB0aGF0IG9uZSBjYW4gYXBwbHkgdGhlIGFycmF5CiAgICAgICAgICAgIHR5cGVtYXBzIHRvIGZ1bmN0aW9ucyB0YWtpbmcgcG9pbnRlcnMgYXMgaW5wdXQsIGVnCgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCiAgICAgICAgICAgICAgICAlYXBwbHkgaW50W10ge2ludCp9OwogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50ICphKTsKCjEyLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvciBtb2RzIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbC4gTmV3IHR5cGVtYXBzCiAgICAgICAgICAgIGRpcmVjdG9yZGlzY29ubmVjdCBhbmQgZGlyZWN0b3JkaXNjb25uZWN0X2Rlcml2ZWQgZm9yIHRoZSAKICAgICAgICAgICAgc3dpZ0RpcmVjdG9yRGlzY29ubmVjdCgpIG1ldGhvZC4gQWxzbyBmaXggdG8gZ2V0IHRoZSBqYXZhcGFja2FnZQogICAgICAgICAgICB0eXBlbWFwIHdvcmtpbmcgYWdhaW4uCgoxMi8wNS8yMDA0OiBtbWF0dXMKCSAgICAtIEZpbmlzaGluZyB0aGUgZml4ZXMgZm9yIHRlbXBsYXRlcyArIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MgKyBzcGVjaWFsaXphdGlvbnMuCgogICAgICAgICAgICAtIFtQeXRob25dIE5vdyB3ZSB1c2UgdGhlIG5ldyB0ZW1wbGF0ZXMgKyBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzIGluIHRoZSBzdGQvU1RMIGxpYnJhcnkuIFRoYXQgbWVhbnMgdGhlIGludGVybmFsCgkgICAgICBzd2lnIGZpbGVzIGFyZSBnZXR0aW5nIHVnbGllciBzaW5jZSB3ZSBub3cgc3VwcG9ydCB0aGUKCSAgICAgIG9yaWdpbmFsIGRlY2xhcmF0aW9uczoKCgkgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8IF9UcCA+ID4KCQljbGFzcyB2ZWN0b3IgewoJCS4uLi4KCQl9OwoJICAgICAgCSAgICAgCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXkgPiwKCSAgICAgICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcCA+ID4gPgogICAgICAgICAgICAgICAgY2xhc3MgbWFwIHsKCQkuLi4uCgkJfTsKIAogICAgICAgICAgICAgIGFuZCB0aGUgdXNlciBjYW4gdXNlIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGFzCgoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQsIHN0ZDo6YWxsb2NhdG9yPGludD4gPjsKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50LCBNeUFsbG9jYXRvcjxpbnQ+ID47CgogICAgICAgICAgICAgIE5vdyB3ZSBhcmUgY2xvc2VyIHRvIHRoZSBjbGVhbmluZy9yZXdyaXRpbmcgb2YgdGhlCgkgICAgICBweXRob24gc3RkL1NUTCBzdXBwb3J0LCBzdWNoIHRoYXQgd2UgcmVjb3ZlciBzdXBwb3J0IGZvcgoJICAgICAgTVNWQysrIDYuMCwgYW5kIHdlIGNhbiBhZGQgc3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzCgkgICAgICB0b28uCgoKMTIvMDIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3JzIHdoZW4gd3JhcHBpbmcgbWV0aG9kcyB1c2luZyBhIG1lbWJlciBlbnVtCiAgICAgICAgICAgIGFuZCB0eXBlc2FmZS9wcm9wZXIgZW51bXMgZW5hYmxlZC4KCjEyLzAxLzIwMDQ6IG1tYXR1cwoJICAgIC0gRml4IHR5cGVtYXBzIHRvIHdvcmsgd2l0aCB0ZW1wbGF0ZXMgYW5kIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MsIGllCgoJICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBCID0gaW50PgogICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKCSAgICAgICB9OwoKCSAgICAgICAldHlwZW1hcChpbikgRm9vPGludD4gKnsuLi59CgkgICAgICAgJXR5cGVtYXAob3V0KSBGb288aW50LGludD4gKnsuLi59CgoJICAgICAgIEZvbzxpbnQ+ICogZm9vKCBGb288aW50PiAqZjEsIEZvbzxpbnQsaW50PiAqZjIpOwoKCSAgICAgIG5vdyAnZjEnLCAnZjInIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHJlc29sdmUgdGhlIHByb3ZpZGVkCgkgICAgICB0eXBlbWFwcyBwcm9wZXJseS4KCgkgICAgICBUaGlzIGlzIGhpZ2hseSBuZWVkZWQgZm9yIHByb3BlciBTVEwgc3VwcG9ydCwgc2VlIG5ldyAKCSAgICAgIHN0ZF9iYXNpY19zdHJpbmcuaSwgc3RkX3NzdHJlYW0uaSwgZXRjLgoKCSAgICAtIEFkZGVkIHN0ZF9zc3RyZWFtLmksIGFuZCBmaXggc3RkX2Jhc2ljX3N0cmluZy5pIHRvIHVzZQoJICAgICAgdGhlIG5ldyB0eXBlbWFwcyArIHRlbXBsYXRlIGRlZi4gYXJnIG1lY2hhbmlzbS4gQWxzbywKCSAgICAgIGFkZGVkIHRoZSBuZWVkZWQgc3RkX2FsbG9jLmkuIE5vdywgYWxsIHRoZSBjb250YWluZXJzCgkgICAgICBjYW4gYmUgbW9kaWZpZWQgdG8gc3VwcG9ydCBzdGQ6OmFsbG9jYXRvciwgbGlrZSBpbjoKCSAgICAgIAoJICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBBID0gc3RkOjphbGxvY2F0b3I8VCA+ID4KCQljbGFzcyB2ZWN0b3IgewoJCXB1YmxpYzoKCQkuLi4uCgkJfTsKCSAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgaXMgb25seSBjb21wbGV0ZWQgYnkgbm93IGZvciBiYXNpY19zdHJpbmcuCgoJICAgIC0gRml4IGZvciBzbWFydCBwb2ludGVycyArIG1lbWJlcnMgKyBleHRlbnNpb25zOgoKCSAgICAgICVleHRlbmQgRm9vIHsKCSAgICAgICAgaW50IGV4dGVuc2lvbihpbnQgaSwgaW50IGopIHsgcmV0dXJuIGk7IH0KCQlpbnQgZXh0ZW5zaW9uKCkgeyByZXR1cm4gMTsgfQoJICAgICAgfQoKCSAgICAgICVpbmxpbmUgJXsKCgkgICAgICBjbGFzcyBGb28gewoJICAgICAgcHVibGljOgoJCWludCB5OwoJCXN0YXRpYyBjb25zdCBpbnQgejsKCSAgICAgIH07CiAgCgkgICAgICBjbGFzcyBCYXIgewoJICAgICAgICBGb28gKmY7CgkgICAgICBwdWJsaWM6CgkgICAgICAgIEJhcihGb28gKmYpIDogZihmKSB7IH0KCQlGb28gKm9wZXJhdG9yLT4oKSB7CgkJICByZXR1cm4gZjsKCQl9CgkgICAgICB9OwoKCSAgICAgIG5vdyB5b3UgY2FuIAoJICAgICAKCSAgICAgIGYgPSBGb28oKQoJICAgICAgZi55ID0gMwoJICAgICAgYSA9IGYuegoJICAgICAgZi0+ZXh0ZW5zaW9uKCkKIAoJICAgICAgYiA9IEJhcihmKQoJICAgICAgYi55ID0gMwoJICAgICAgYSA9IGIuegoJICAgICAgYi0+ZXh0ZW5zaW9uKCkKCgkgICAgLSBPdGhlciBzbWFsbCBlcnJvcnMgZml4ZXMsIG1vc3RseSBweXRob24uCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTnVtZXJvdXMgZGlyZWN0b3IgYnVnIGZpeGVzIHNvIHRoYXQgdGhlIGNvcnJlY3QgamF2YSB0eXBlcwogICAgICAgICAgICBhbmQgY2Fub25pY2FsaXplZCB0eXBlcyBpbiB0aGUgSk5JIGNvZGUgYXJlIGVtaXR0ZWQuIFVzZSBvZiB0aGUKICAgICAgICAgICAgJGphdmFjbGFzc25hbWUgc3BlY2lhbCB2YXJpYWJsZXMgaW4gdGhlIGRpcmVjdG9yIHR5cGVtYXBzIG5vdwogICAgICAgICAgICBjb25zaXN0ZW50IHdpdGggdGhlIG5vbi1kaXJlY3RvciB0eXBlbWFwcy4gVGhlIHR5cGVzIHVzZWQgZm9yIAogICAgICAgICAgICB0eXBlbWFwIGxvb2t1cHMgYXJlIGFsc28gY29ycmVjdGVkIGluIGEgZmV3IHBsYWNlcy4gSWYgeW91IAogICAgICAgICAgICBwcmV2aW91c2x5IGhhZCB5b3VyIG93biBkaXJlY3RvciB0eXBlbWFwcywgZW5zdXJlIHRoZXkgYXJlIHVzaW5nIHRoZQogICAgICAgICAgICBjb3JyZWN0IEMrKyB0eXBlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgRElSRUNUT1JTICoqKgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgY29uc3QgZW51bSBTV0lHVFlQRSAmIHR5cGVtYXBzIGFkZGVkLiBUaGVzZSB3cmFwIGNvbnN0IGVudW0gcmVmZXJlbmNlcwogICAgICAgICAgICBhcyBpZiB0aGV5IHdlcmUgcGFzc2VkIGJ5IHZhbHVlLiBDb25zdCBlbnVtIHJlZmVyZW5jZXMgdGh1cyB3b3JrIHRoZQogICAgICAgICAgICBzYW1lIGFzIGNvbnN0IHJlZmVyZW5jZSBwcmltaXRpdmUgdHlwZXMgc3VjaCBhcyBjb25zdCBkb3VibGUgJiwgCiAgICAgICAgICAgIGNvbnN0IGludCAmIGV0Yy4gVHlwZW1hcHMgYWRkZWQgZm9yIEphdmEsIEMjLCBSdWJ5LCBUY2wsIFBlcmwgYW5kIFBpa2UuCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE5ldyBzcGVjaWFsIHZhcmlhYmxlOiAkKmphdmFjbGFzc25hbWUsIHNpbWlsYXIgdG8gJGphdmFjbGFzc25hbWUKICAgICAgICAgICAgYW5kICQmamF2YWNsYXNzbmFtZS4gVGhlIG5ldyBvbmUgcmVtb3ZlcyBhIHBvaW50ZXIgZnJvbSB0aGUgQyB0eXBlIGJlZm9yZQogICAgICAgICAgICBvYnRhaW5pbmcgdGhlIEphdmEgY2xhc3MgbmFtZS4gT25lIG9yIG1vcmUgb2YgJGphdmFjbGFzc25hbWUsCiAgICAgICAgICAgICQmamF2YWNsYXNzbmFtZSBvciAkKmphdmFjbGFzc25hbWUgbWF5IG5vdyBhcHBlYXIgaW4gYSB0eXBlbWFwLiBMaWtld2lzZSBmb3IKICAgICAgICAgICAgQyMgdXNpbmcgY3NjbGFzc25hbWUgaW5zdGVhZCBvZiBqYXZhY2xhc3NuYW1lLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGxhc3QgdmVzdGlnZXMgb2YgZW51bXMgYmVpbmcgaGFuZGxlZCBhcyBpbnRlZ2VycyByZW1vdmVkIGZyb20gdGhlCiAgICAgICAgICAgIGludGVybmFscy4gVGhlIHdyYXBwZXIgbWV0aG9kcyB1c2UgdGhlIGVudW0gdHlwZSByYXRoZXIgdGhhbiBhbiBpbnQKICAgICAgICAgICAgbm93LiBUaGUgbmV0IHJlc3VsdCBpcyBhZGRlZCB0eXBlIHNhZmV0eSBmb3IgZW51bXMgd2hlbiBoYW5kbGVkIGFzCiAgICAgICAgICAgIHBvaW50ZXJzLCByZWZlcmVuY2VzIGV0Yy4gUHJldmlvdXNseSBpbiBzaXR1YXRpb25zIHN1Y2ggYXMgYSBtZXRob2QKICAgICAgICAgICAgdGFraW5nIGEgcG9pbnRlciB0byBhbiBlbnVtLCBhIHBvaW50ZXIgdG8gYW4gaW50IG9yIGEgcG9pbnRlciB0byBhbgogICAgICAgICAgICBlbnVtIG9mIHNvbWUgb3RoZXIgdHlwZSBjb3VsZCBpbmFkdmVydGFudGx5IGJlIHBhc3NlZCB0byB0aGUgbWV0aG9kLgogICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCBhcyB0aGUgZGVzY3JpcHRvciBmb3IgYW4gZW51bSBpcyBubyBsb25nZXIgYmFzZWQgb24KICAgICAgICAgICAgYW4gaW50LCBidXQgdGhlIGVudW0gdHlwZSBpbnN0ZWFkLiBBbm9ueW1vdXMgZW51bXMgYXJlIHN0aWxsIGhhbmRsZWQKICAgICAgICAgICAgYXMgaW50ZWdlcnMuCgogICAgICAgICAgICBUaGUgY29uc2VxdWVuY2UgZm9yIHNjcmlwdGluZyBsYW5ndWFnZSB1c2VycyBpbiBjb3JyZWN0IHVzYWdlIG9mIGVudW1zCiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbm90aWNlYWJsZS4gVGhlcmUgaXMgbm8gY2hhbmdlIGZvciBhbnkgb2YgdGhlIGxhbmd1YWdlcwogICAgICAgICAgICB3aGVyZSBlbnVtcyBhcmUgcGFzc2VkIGJ5IHZhbHVlIC0gbW9zdCBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aWxsCiAgICAgICAgICAgIHN0aWxsIGFjY2VwdCBhbiBpbnRlZ2VyIGZvciBhbiBlbnVtIHZhbHVlIGFuZCB0aGUgc3Ryb25nbHkgdHlwZWQKICAgICAgICAgICAgbGFuZ3VhZ2VzIHN0aWxsIHVzZSBlaXRoZXIgdHlwZXNhZmUgZW51bXMsIGludGVnZXJzIG9yIHByb3BlciBlbnVtcwogICAgICAgICAgICBkZXBlbmRpbmcgb24gd2hhdCB0aGUgdXNlciBjb25maWd1cmVzLiBGb3IgSmF2YSBhbmQgQyMgdXNlcnMgYSBjaGFuZ2UKICAgICAgICAgICAgaW4gdGhlIHR5cGV3cmFwcGVyIGNsYXNzIG5hbWUgaGFzIG9jY3VycmVkIChmb3IgZW51bSBwb2ludGVycywKICAgICAgICAgICAgcmVmZXJlbmNlcyBldGMpLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZW51bSBOdW1iZXJzIHsgb25lPTEsIHR3byB9OwogICAgICAgICAgICAgIGVudW0gTnVtYmVycyogbnVtYmVyKCk7CgogICAgICAgICAgICBJbiBKYXZhIGFuZCBDIyB0aGlzIG11c3Qgbm93IGJlIGNvZGVkIGFzCgogICAgICAgICAgICAgIFNXSUdUWVBFX3BfTnVtYmVycyBuID0gbW9kdWxlbmFtZS5udW1iZXIoKTsKCiAgICAgICAgICAgIHJhdGhlciB0aGFuCgogICAgICAgICAgICAgIFNXSUdUWVBFX3BfaW50IG4gPSBtb2R1bGVuYW1lLm51bWJlcigpOwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMS8yMDA0OiB3c2Z1bHRvbi9tbWF0dXMKICAgICAgICAgICAgQWRkZWQgbWlzc2luZyBkZXByZWNhdGVkIHdhcm5pbmcgZm9yICVuYW1lIGFuZCByZW1vdmUgcmVtYWluaW5nICVuYW1lCiAgICAgICAgICAgIHVzYWdlIGluIHRoZSBTV0lHIGxpYnJhcmllcy4KCjExLzIxLzA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEFkZGluZyB0aGUgUHlTd2lnT2JqZWN0IHRvIGJlIHVzZWQgZm9yIGNhcnJ5aW5nCgkgICAgICB0aGUgaW5zdGFuY2UgQy9DKysgcG9pbnRlcnMuIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mCgkgICAgICBzdHJpbmcgYW5kIFB5Q09iamVjdHMuCgoJICAgICAgVGhlIG5ldyBQeVN3aWdPYmplY3QgaXMgZXZlbiBzYWZlciB0aGFuIFB5Q09iamVjdCwgYW5kCgkgICAgICBtb3JlIGZyaWVuZGx5IHRoYW4gcGxhaW4gc3RyaW5nczoKCgkgICAgICBub3cgeW91IGNhbiBkbwoKCSAgICAgICAgcHJpbnQgYS50aGlzCgkJPFN3aWcgT2JqZWN0IGF0IF8wMDY5MTYwOF9wX0E+CgoJCXByaW50IHN0cihhLnRoaXMpCgkJXzAwNjkxNjA4X3BfQQoKCQlwcmludCBsb25nKGEudGhpcykKCQkxMzU2ODY0MDAKCgkJcHJpbnQgIiVzIDB4JXgiICUgKGEudGhpcywgYS50aGlzKQoJCV8wMDY5MTYwOF9wX0EgMHg4MTY2OTAwCgoJICAgICAgdGhlIGxhc3Qgb25lIGlzIHZlcnkgdXNlZnVsIHdoZW4gZGVidWdnaW5nIHRoZSBDL0MrKwoJICAgICAgc2lkZSwgc2luY2UgaXMgdGhlIHBvaW50ZXIgdmFsdWUgeW91IHdpbGwgdXN1YWxseSBnZXQKCSAgICAgIGZyb20gdGhlIGRlYnVnZ2VyLgoKCSAgICAgIEFsc28sIGlmIHlvdSBoYXZlIHNvbWUgb2xkIGNvZGUgdGhhdCB1c2VzIHRoZSBzdHJpbmcKCSAgICAgIHJlcHJlc2VudGF0aW9uICJfMDA2OTE2MDhfcF9BIiwgeW91IGNhbiB1c2UgaXQgbm93IGFnYWluCgkgICAgICB1c2luZyAnc3RyKHB0ciknLCBvciBieSBjYWxsaW5nICdzdHIgPSBQeU9iamVjdF9TdHIob2JqKScKCSAgICAgIGluIHRoZSBDL0MrKyBzaWRlLgogCgkgICAgICBUaGlzIGNoYW5nZSBpcyBtYWlubHkgZm9yIG5vc3RhbGdpYyBzd2lnIHVzZXJzIHRoYXQgbWlzcwoJICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgYnV0IGFsc28gYWxsb3dzIHRvIHNheSBhZ2FpbgoKCSAgICAgICAgaWYgYS50aGlzID09IGIudGhpczoKCQkgIHJldHVybiAiYSBpcyBiIgoKCSAgICAgIGFuZCB3ZWxsLCBzaW5jZSB0aGUgY2hhbmdlIHdlcmUgcmVhbGx5IHNpbXBsZSwgbWF5YmUgaW4KCSAgICAgIHRoZSBmdXR1cmUgd2Ugd2lsbCBiZSBhYmxlIHRvIGRvCiAgIAoJCW5leHQgPSBhLnRoaXMgKyAxCgoJICAgICAgb3IgYWRkIG5hdGl2ZSBweXRob24gaXRlcmF0aW9uIG92ZXIgbmF0aXZlIEMvQysrIGFycmF5cywKCSAgICAgIGllLCBubyBuZWVkIHRvIGNyZWF0ZS9jb3B5IG5ldyB0dXBsZXMgd2hlbiByZXR1cm5pbmcgYW5kCgkgICAgICBhcnJheSBvciB2ZWN0b3IuCgoJICAgICAgQWxzbywgYSBQeVN3aWdQYWNrZWQgb2JqZWN0IHdhcyBhZGRpbmcgdG8gY2FycnkgYSBtZW1iZXIKCSAgICAgIG1ldGhvZCBwb2ludGVyLCBidXQgdGhpcyBpcyBwcm9iYWJseSBhIHRlbXBvcmFsIHNvbHV0aW9uCgkgICAgICB1bnRpbCBhIG1vcmUgZ2VuZXJhbCBvYmplY3QgZm9yIG1ldGhvZHMgaXMgYWRkZWQuCgoJICAgICAgQmUgYXdhcmUgdGhhdCB0byBzaW1wbGlmeSBtYWludGFpbmluZyBhbmQgY29tcGF0aWJpbGl0eQoJICAgICAgd2l0aCBvdGhlciB0b29scywgdGhlIG9sZCBzdHJpbmcgYW5kIFB5Q09iamVjdHMKCSAgICAgIHJlcHJlc2VudGF0aW9uIGNvdWxkIGRpc2FwcGVhciB2ZXJ5IHNvb24sIGFuZCB0aGUKCSAgICAgIFNXSUdfQ09CSkVDVFNfVFlQRVMgb3IgU1dJR19OT19PQkpFQ1RfVFlQRVMgbWFjcm9zIHdpbGwKCSAgICAgIGhhdmUgbm8gZWZmZWN0IGF0IGNvbXBpbGF0aW9uIHRpbWUuIFN0aWxsLCB0aGUgdGhyZWUKCSAgICAgIG1lY2hhbmlzbXMgYXJlIHByZXNlbnQgaW4gdGhlIGNvZGUganVzdCBmb3IgdGVzdGluZywKCSAgICAgIGRlYnVnZ2luZyBhbmQgY29tcGFyaXNvbiBwdXJwb3Nlcy4KCSAgICAgIAoxMS8yMS8wNDogbW1hdHVzCgoJICAgIC0gW1B5dGhvbl0gQWRkaW5nIGJhY2sgc3VwcG9ydCBmb3IgdXNpbmcgdGhlIHN3aWcgcnVudGltZSBjb2RlCgkgICAgICBpbnNpZGUgdGhlIHVzZXIgY29kZS4gV2UganVzdCBhbGxvdyB0aGUgdXNlciB0byBpbmNsdWRlCgkgICAgICB0aGUgbWluaW1hbCBjb2RlIG5lZWRlZCB0byBpbXBsZW1lbnQgdGhlIHJ1bnRpbWUKCSAgICAgIG1lY2hhbmlzbSBzdGF0aWNhbGx5LCBqdXN0IGFzIGluIGRvbmUgaW4gdGhlIHN3aWcKCSAgICAgIG1vZHVsZXMuCgkgICAgICAKCSAgICAgIFRvIHVzZSB0aGUgc3dpZyBydW50aW1lIGNvZGUsIGZvciBleGFtcGxlIHdpdGggcHl0aG9uLAoJICAgICAgdGhlIHVzZXIgbmVlZHMgaW5jbHVkZSB0aGUgZm9sbG93aW5nOgogCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxQeXRob24uaD4gICAgICAgICAvLyBvciB1c2luZyB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxzd2lncnVuLnN3Zz4KICAgICAgICAgICAgICAgI2luY2x1ZGUgPHB5dGhvbi9weXJ1bi5zd2c+IC8vIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgI2luY2x1ZGUgPHJ1bnRpbWUuc3dnPgoKCSAgICAgIHRoZSBmaWxlcyBzd2lncnVuLnN3ZywgcHlydW4uc3dnIGFuZCBydW50aW1lLnN3ZyBjYW4gCgkgICAgICBiZSBjaGVja2VkIG91dCBieSB1c2luZyBzd2lnIC1jbywgb3IgdGhleSBjYW4gc2ltcGx5IAoJICAgICAgYmUgZm91bmQgYnkgYWRkaW5nIHRoZSBzd2lnIGxpYiBkaXJlY3RvcnkgdG8gdGhlCgkgICAgICBjb21waWxlciBpbmNsdWRlIGRpcmVjdG9yeSBsaXN0LCBmb3IgZXhhbXBsZQoKCSAgICAgICBTV0lHTElCPWBzd2lnIC1zd2lnbGliYAoJICAgICAgIGMrKyAtSSR7U1dJR0xJQn0gLi4KCgkgICAgICBvZiBiZXR0ZXIsIHVzaW5nIHRoZSBDUFBGTEFHUywgYnV0IHRoYXQgZGVwZW5kcyBvbiB5b3VyCgkgICAgICBlbnZpcm9ubWVudC4KCSAgICAgICAKCSAgICAgIFRoaXMgY2hhbmdlIGNhbiBiZSBwb3J0ZWQgdG8gdGhlIG90aGVyIGxhbmd1YWdlcyB0b28sCgkgICAgICB5b3UganVzdCBuZWVkIHRvIGlzb2xhdGUgdGhlIG5lZWRlZCBydW50aW1lIGNvZGUgaW4KCSAgICAgIGEgc2luZ2xlIGZpbGUgbGlrZSAncHlydW4uc3dnJywgYW5kIHByb3ZpZGUgdGhlIAoJICAgICAgU1dJR19SdW50aW1lX0dldFR5cGVMaXN0KCkgbWV0aG9kLiBMb29rIGF0IHRoZQoJICAgICAgTGliL3B5dGhvbi9weXJ1bi5zd2cgZmlsZSBhbmQgdGhlIEV4YW1wbGVzL3B5dGhvbi9zd2lncnVuCgkgICAgICBleGFtcGxlLgoKMTEvMTUvMDQ6IG1tYXR1cwoJICAgIC0gRml4IG1peGVkX3R5cGVzLmkgKyBnY2MtMy40LCBpZSwgYXJyYXlzICsgcmVmZXJlbmNlcyArCgkgICAgICB0eXBlZGVmcwoKCSAgICAtIEZpeCBtdWx0aWRpbSBhcnJheXMgKyB0eXBlZGVmcyxpZQoKCSAgICAgICB0eXBlZGVmIGNoYXIgY2hhcmFjdGVyWzFdOwoJICAgICAgIHR5cGVkZWYgY2hhcmFjdGVyIHdvcmRbNjRdOwoKCSAgICAtIFByb2Nlc3MgcHJvdGVjdGVkL3ByaXZhdGUgYmFzZXMgaW4gdGhlIHNhbWUgd2F5IGJlZm9yZQoJICAgICAgd2UgcHJvY2VzcyBwcm90ZWN0ZWQvcHJpdmF0ZSBtZW1iZXJzLCBpZSwgd2UgY2hlY2sKCSAgICAgIGZvciBjb25zdHJ1Y3RvcnMsIG9wZXJhdG9yIG5ldywgdmlydHVhbCBtZW1iZXJzLCBldGMuCiAgIAoJICAgIC0gRml4IFJ1YnkvSmF2YSB0byB3b3JrIChvciBpZ25vcmUpIG11bHRpLWluaGVyaXRhbmNlICsKICAgICAgICAgICAgICBkaXJlY3RvcnMuIEFsbG93IG90aGVyIGxhbmd1YWdlcyB0byBkZWZpbmUgaWYgaXQgaXMKICAgICAgICAgICAgICBzdXBwb3J0ZWQgb3Igbm90LgoJICAgIAoJICAgIC0gTm93IHlvdSBjYW4gcnVuCgogICAgICAgICAgICAgICAgU1dJR19GRUFUVVJFUz0iLWRpcmVjdG9ycyAtZGlycHJvdCIgCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLXJ1YnktdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1qYXZhLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stb2NhbWwtdGVzdC1zdWl0ZQoKCSAgICAgIGFuZCB5b3Ugd2lsbCBnZXQgb25seSAncmVhbCcgZXJyb3JzLiBydWJ5IGFuZCBweXRob24KCSAgICAgIGNvbXBpbGUgd2l0aCBubyBlcnJvcnMsIGphdmEgc2hvd3Mgc29tZSBwcm9ibGVtcy4JCgpWZXJzaW9uIDEuMy4yMyAoTm92ZW1iZXIgMTEsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM5ODI3NTMgZnJvbSBGYWJyaWNlIFNhbHZhaXJlOiBBZGRzIGRlcGVuZGVuY2llcyBnZW5lcmF0aW9uIGZvcgogICAgICAgICAgICBjb25zdHJ1Y3RpbmcgbWFrZWZpbGVzLiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgLU1GIC1NRCAtTU1EIHRvIHdvcmsKICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBvcHRpb25zIC1NIGFuZCAtTU0uIFRoZXNlIG9wdGlvbnMgYXJlIG5hbWVkIHRoZSBzYW1lCiAgICAgICAgICAgIGFuZCB3b3JrIHRoZSBzYW1lIGFzIGluIGdjYy4KCjExLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVpZ25vcmUvJXJlbmFtZSBjaGFuZ2VzIGZvciBtZXRob2RzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgdG8gbWlycm9yCiAgICAgICAgICAgICVmZWF0dXJlIGJlaGF2aW91ci4gU2VlIHByZXZpb3VzIGVudHJ5LgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgaW1wcm92ZW1lbnRzIGZvciBmaW5lIHR1bmluZyB3aGVuIHdyYXBwaW5nIG1ldGhvZHMgd2l0aAogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cy4gQW55ICVmZWF0dXJlIHRhcmdldGluZyBhIG1ldGhvZCB3aXRoIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgIHdpbGwgYXBwbHkgdG8gYWxsIHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBTV0lHIGdlbmVyYXRlcyBpZiB0aGUKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZS4gSWYgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGFyZQogICAgICAgICAgICBub3Qgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLCB0aGVuIHRoZSBmZWF0dXJlIHdpbGwgbWF0Y2ggdGhhdCBleGFjdAogICAgICAgICAgICB3cmFwcGVyIG1ldGhvZCBvbmx5IGFuZCBub3QgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IFNXSUcgZ2VuZXJhdGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwoKICAgICAgICAgICB3aWxsIGFwcGx5IHRoZSBmZWF0dXJlIHRvIGFsbCB0aHJlZSB3cmFwcGVyIG1ldGhvZHMsIHRoYXQgaXM6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKCk7CgogICAgICAgICAgIElmIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwoKICAgICAgICAgICB0aGVuIHRoZSBmZWF0dXJlIHdpbGwgb25seSBhcHBseSB0byB0aGlzIHdyYXBwZXIgbWV0aG9kOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CgogICAgICAgICAgIGFuZCBub3QgdGhlc2Ugd3JhcHBlciBtZXRob2RzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKCk7CgogICAgICAgICAgIFRoaXMgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBtYWtlICVmZWF0dXJlIG1vcmUgcG93ZXJmdWwgdG8gZWFzZSB0aGUgbWlncmF0aW9uCiAgICAgICAgICAgdG8gbmV3IGRlZmF1bHQgYXJndW1lbnRzIHdyYXBwaW5nIGFwcHJvYWNoLgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKICAgICAgICAgICBJZiB5b3UgcHJldmlvdXNseSBoYWQgYSAlZmVhdHVyZSBhbmQgZGlkbid0IHNwZWNpZnkgdGhlIGRlZmF1bHQgYXJndW1lbnRzLAogICAgICAgICAgIHlvdSB3aWxsIGhhdmUgdG8gYWRkIHRoZW0gaW4gbm93IG9yIHlvdSBjYW4gb2J0YWluIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIKICAgICAgICAgICBieSB1c2luZyAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIikuCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXBzIGZvciBzdGQ6OnZlY3RvciBhZGRlZCBpbnRvIHN0ZF92ZWN0b3IuaS4gVGhlIHByb3h5IGNsYXNzZXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGFyZSBtb2RlbGxlZCBvbiB0aGUgLk5FVCBBcnJheUxpc3QgY2xhc3MuIFRoaXMgaXNuJ3QgcXVpdGUKICAgICAgICAgICAgcmVhZHkgZm9yIGdlbmVyYWwgY29uc3VtcHRpb24geWV0LCBidXQgd2lsbCB3b3JrIHdpdGggdmVjdG9ycyBvZiBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgYW5kIHNvbWUgY2xhc3Nlcy4KCjEwLzMvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtHVUlMRV0gVGhlIC1zY20gaW50ZXJmYWNlIGlzIG5vdyB0aGUgZGVmYXVsdC4gIFRoZSBvbGQgR0ggaW50ZXJmYWNlIGNhbgoJICAgIHN0aWxsIGJlIGVuYWJsZWQgYnkgcGFzc2luZyAtZ2ggdG8gU1dJRy4KCjEwLzIvMjAwNDogbW1hdHVzCgoJICAgIC0gTW9yZSBmaXhlcyBmb3IgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLgoJICAgICAgQXMgYW4gZXh0cmEgYm9udXMsIHdlIGdldCAldGVtcGxhdGUgc3VwcG9ydCBmb3Igc3RhdGljL21lbWJlcnMgY2xhc3MKCSAgICAgIG1ldGhvZHMsIGllLCBub3cgeW91IGNhbiBzYXk6CgoJICAgICAgICBuYW1lc3BhY2Ugc3BhY2UgewogICAgICAgICAgICAgICAgIHN0cnVjdCBBCQkJICAgIAoJICAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBZPgkgICAgCgkgICAgICAgICAgIHN0YXRpYyB2b2lkIGZvb1QoWSB5KSB7IH0KCSAgICAgICAgIH07CQoJCX0JCQkgICAgCgkgICAgICAJICAgICAgCQkJICAgIAoJICAgICAgICBzdHJ1Y3QgQgkJCSAgICAKCSAgICAgICAgewkJCQkgICAgCgkgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFk+CQkgICAgCgkgICAgICAgICAgdm9pZCBiYXJUKFkgeSkge30gCgkgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGRvdWJsZT47CgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8aW50PjsKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxjaGFyPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGRvdWJsZT47CgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxpbnQ+OwoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8Y2hhcj47CgoJICAgICAgYW5kIGNhbGwKCgkgICAgICAgIEEuZm9vKDEpCgkJYiA9IEIoKQoJCWIuYmFyKDEpCgkgICAgICAKCSAgICAgIG5vdGUgdGhlIG1ldGhvZHMgYXJlIGVtaXR0ZWQgaW5zaWRlIHRoZSBjbGFzc2VzLAoJICAgICAgYW5kIGhlbmNlLCB0aGUgJXRlbXBsYXRlIG5hbWUgcmVmZXJzIHRvIHRoZSAnbWVtYmVyJwoJICAgICAgbWV0aG9kIG5hbWUsIG5vdCBhIGdsb2JhbCBuYW1lc3BhY2UgbmFtZS4KCjEwLzMxLzIwMDQ6IG1tYXR1cwoJICAgIC0gU29sdmUgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLCBhcyBpbgoKCSAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFyOwoJCSBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBzdHJ1Y3QgZm9vOjpCYXIgOiBGb28gewogICAgICAgICAgICAgICB9OwoKCSAgICAgICBzZWUgbmFtZXNwYWNlX2NsYXNzLmkgZm9yIG1vcmUgZXhhbXBsZXMuCgogICAgICAgICAgICAtIEZpeCAldGVtcGxhdGUgZGlyZWN0aXZlIHRvIHByb3Blcmx5IHVzZSBuYW1lc3BhY2VzLAogICAgICAgICAgICAgIGluY2x1ZGluZyB0aGUgY2FzZToKCgkJICAgbmFtZXNwYWNlIG9uZQoJCSAgIHsKCQkgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CgkJICAgICAgIHN0cnVjdCBQdHIge307CiAgICAgICAgICAgICAgICAgICB9CgoJCSAgIG5hbWVzcGFjZSBvbmUKCQkgICB7CQkgIAoJCSAgICAgICBzdHJ1Y3QgT2JqMSB7fTsKCQkgICAgICAgdHlwZWRlZiBQdHI8T2JqMT4gT2JqMV9wdHI7CiAgCQkgICAgICAgJXRlbXBsYXRlKE9iajFfcHRyKSBQdHI8T2JqMT47IAoJCSAgIH0JCQkJICAKCQkgICAJCQkJICAKCQkgICBuYW1lc3BhY2UgdHdvICAKCQkgICB7CgkJICAgICAgIHN0cnVjdCBPYmoyIHt9OwkKCQkgICAgICAgdHlwZWRlZiBvbmU6OlB0cjxPYmoyPiBPYmoyX3B0cjsKCQkgICAgICAgJXRlbXBsYXRlKE9iajJfcHRyKSBvbmU6OlB0cjxPYmoyPjsKCQkgICB9CgoJICAgICAgdGhpcyBpcyBkb25lIGJ5IHVzaW5nIHRoZSBuYW1lc3BhY2UgbmFtZSAnb25lJyB0byBjcmVhdGUKICAgICAgICAgICAgICBhIG5hbWVzcGFjZSBub2RlIHRvIGVtaXQgdGhlIHRlbXBsYXRlIGluc3RhbnRpYXRpb24sCiAgICAgICAgICAgICAganVzdCBhcyBiZWZvcmUsIGJ1dCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcmVzb2x2ZWQKICAgICAgICAgICAgICBhbmQgcXVhbGlmaWVkIGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZSAoJ29uZScgb3IgJ3R3bycpLgogICAgICAgICAgICAgIFRoaXMgaXMgc2FtZSB3YXkgdGhhdCB0eXBlZGVmIHdvcmtzLiAKCgkgICAgICBUaGlzIHJlc29sdmUgdGhlIHNtYXJ0X3BvaW50ZXJfbmFtZXNwYWNlMi5pIGNhc2UsIGFuZCBhdAogICAgICAgICAgICAgIHRoZSBzYW1lIHRpbWUsIHNldmVyYWwgb3RoZXIgb25lcyB3aGVyZSBiZWZvcmUgc3dpZyB3YXMKICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZQoKCSAgICAgICAgIkNhbid0IGluc3RhbnRpYXRlIHRlbXBsYXRlICd4eCcgaW5zaWRlIG5hbWVzcGFjZSAneXknIgoJICAgICAgCgkgICAgICBlcnJvciBtZXNzYWdlLiBJbiBmYWN0LCB0aGF0IGVycm9yIGRvZXNuJ3QgZXhpc3QKCSAgICAgIGFueW1vcmUuIFlvdSBjYW4gb25seSBnZXQgYW4gZXJyb3IgaWYgeW91IHVzZSBhIGJhZAoJICAgICAgbmFtZXNwYWNlIG5hbWUgb3Igc28uCgoxMC8zMC8yMDA0OiBtbWF0dXMKCSAgICAtIFtydWJ5XSBEaXJlY3RvcnMgZml4ZXM6CgkgICAgICAtIGVudW1zIGFuZCBzdGQ6OnN0cmluZ3MgYXJlIHdvcmtpbmcgbm93IChzZXZlcmFsCgkgICAgICAgIHJlcG9ydHMgaW4gYnVnIHRyYWNrIHN5c3RlbSkKCSAgICAgIC0gYWRkZWQgcGF0Y2ggMTAyNTg2MSBmb3IgZGlyZWN0b3IgKyBleGNlcHRpb25zCgkJCiAgICAgICAgICAgICAgKioqIEF0dGVudGlvbiAqKio6IHJ1Ynkgd2l0aCBkaXJlY3RvcnMgKyBwcm90ZWN0ZWQKICAgICAgICAgICAgICBtZW1iZXJzIHdvcmsgd2l0aCB2ZXJzaW9uIDEuNysuIE9sZGVyIHZlcnNpb25zIHNlZW1zIHRvCiAgICAgICAgICAgICAgaGF2ZSBhIGJyb2tlbiBzaWduYXR1cmUgZm9yJ3JiX3Byb3RlY3QnLgoJCQoJICAgICAgSWYgeW91IG5lZWQgdG8gdXNlIGFuIG9sZCB2ZXJzaW9uLCBsb29rIGF0CgoJICAgICAgaHR0cDovL2V4Y3J1Ynkuc291cmNlZm9yZ2UubmV0L2RvY3MvaHRtbC9ydWJ5X19oYWNrc184aHBwLXNvdXJjZS5odG1sCiAgCSAgICAgIGZvciB3b3JrYXJvdW5kcy4KCSAgICAgIAogICAgICAgICAgICAtIFtydWJ5XSBGaXggbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbSBpbiB0eXBlbWFwIChidWcgMTAzNzI1OSkKCgkgICAgLSBbdGNsXSBGaXggKGVudW1zfGNvbnN0YW50cykgKyBuYW1lc3BhY2Ugb3B0aW9uIAoJICAgICAgICAgICAgKHJlcG9ydGVkIGJ5IGphc29uLm0uc3VycHJpc2VAaW50ZWwuY29tKS4KCiAgICAgICAgICAgIC0gW3BlcmxdIEFkZCBwYXRjaCA5NjIxNjggZm9yIG11bHRpcGxlIGluaGVyZXRhbmNlCgkgICAgCgkgICAgLSBGaXggJ2RlZmluZWQnIGFzIHZhcmlhYmxlIG5hbWUuCgoxMC8yOS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBTZWcgZmF1bHQgZml4IGZvciBnbG9iYWwgc2NvcGUgb3BlcmF0b3IgdXNlZCBmb3IgZnJpZW5kIG1ldGhvZHM6CgogICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgZnJpZW5kIHZvaWQgOjpnbG9iYWxzY29wZSgpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCjEwLzI4LzIwMDQ6bW1hdHVzCgkgICAgLSBBZGRlZCBtb2R1bGUgYW5kIHN3aWcgb3B0aW9uICJ0ZW1wbGF0ZXJlZHVjZSIgdG8gZm9yY2Ugc3dpZwoJICAgICAgdG8gcmVkdWNlIGFueSB0eXBlIG5lZWRlZCB3aXRoIHRlbXBsYXRlcywgaWUsIGluIHRoZXNlIGNhc2VzCgogICAgICAgICAgICAgICAgJW1vZHVsZSgidGVtcGxhdGVyZWR1Y2UiKSB0ZXN0CgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBBIHsgfTsKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnQ7CgkgICAgICAgICV0ZW1wbGF0ZShBX0ludCkgQTxJbnQ+ICA9PT4gICV0ZW1wbGF0ZShBX0ludCkgQTxpbnQ+CgogICAgICAgICAgICAgICAgdHlwZWRlZiBCKiBCcDsKCSAgICAgICAgJXRlbXBsYXRlKEFfQnApIEE8QnA+ICA9PT4gICV0ZW1wbGF0ZShBX0JwKSBBPEIqPgoKICAgICAgICAgICAgICBzd2lnIHJlZHVjZXMgdGhlIHR5cGVzIEludCBhbmQgQnAgdG8gdGhlaXIgcHJpbWl0aXZlcwogICAgICAgICAgICAgIGludCBhbmQgQiouIFRoaXMgaXMgY2xvc2VyIHRvIHRoZSB1c3VhbCBjb21waWxlcgogICAgICAgICAgICAgIHJlc29sdXRpb24gbWVjaGFuaXNtLCBhbmQgaXQgaXMgcmVhbGx5IG5lZWRlZCBzb21ldGltZXMKICAgICAgICAgICAgICB3aGVuIHlvdSBtaXggdGVtcGxhdGVzICsgdHlwZWRlZnMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgICAgRG9uJ3QgdXNlIGl0IGlmIHlvdSBkb24ndCBoYXZlIGFueSBwcm9ibGVtIGFscmVhZHksCgkgICAgICBzaW5jZSB0aGUgdHlwZSByZWR1Y3Rpb24gY2FuIGludGVyZmVyZSB3aXRoIHNvbWUKCSAgICAgIHVzZXIgdHlwZW1hcHMsIHNwZWNpYWxseSBpZiB5b3UgZGVmaW5lZCBzb21ldGhpbmcgbGlrZQoKCQkgICB0eXBlZGVmIGludCBJbnQ7CgkJICAgJXR5cGVtYXAoaW4pIEludCAuLi47CgogICAgICAgICAgICAgIGluIHRoaXMgY2FzZSwgd2hlbiB5b3UgdXNlIHRoZSAidGVtcGxhdGVyZWR1Y2UiIG9wdGlvbiwKCSAgICAgIHN3aWcgd2lsbCBpZ25vcmUgdGhlIHVzZXIgdHlwZW1hcCwgc2luY2UgdGhlICJ0eXBlZGVmIGludCBJbnQiCgkgICAgICB3aWxsIHRha2UgcHJlY2VkZW5jZSwgYW5kIHRoZSB1c3VhbCAiaW50IiB0eXBlbWFwIHdpbGwgYmUKCSAgICAgIGFwcGxpZWQuIAoKCSAgICAgIE5vdGUgdGhhdCB0aGUgcHJldmlvdXMgY2FzZSBpcyBub3QgY29tbW9uLCBhbmQgc2hvdWxkIGJlCgkgICAgICBhdm9pZGVkLCBpZSwgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSBhIHR5cGVkZWYgYW5kIGEKCSAgICAgIHR5cGVtYXAgYXQgdGhlIHNhbWUgdGltZSwgc3BlY2lhbGx5IGlmIHlvdSBhcmUgZ29pbmcgdG8KCSAgICAgIHVzZSB0ZW1wbGF0ZXMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgIC0gRGlyZWN0b3JzOgoKCSAgICAgICAgdmlydHVhbCBkZXN0cnVjdG9yIGlzIGFsd2F5cyBlbWl0dGVkIG5vdywgdGhpcyBkb2Vzbid0CgkgICAgICAgIGNhdXNlIGFueSBoYXJtLCBhbmQgY291bGQgc29sdmUgc29tZSBuYXN0eSBhbmQKCSAgICAgICAgbXlzdGVyaW91cyBlcnJvcnMsIGxpa2UgdGhlIG9uZSBtZW50aW9uZWQgYnkgU2NvdHQuCgoJCWFsc28gdGhlIGRlc3RydWN0b3IgaXMgbm90IGluLWxpbmVkLCBzbywgdGhhdCBjYW4gc29sdmUKCQlzb21lIG90aGVyIG15c3RlcmlvdXMgZXJyb3JzIHdoZW4gbWl4aW5nIGRpcmVjdG9ycyArCgkJaW1wb3J0cyArIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyArIHNvbWUgc3BlY2lmaWMgY29tcGlsZXJzLgoJCQoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIHR5cGVtYXBzLmkgbGlicmFyeSBmaWxlIHdpdGggSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgYWRkZWQuCgoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp3c3RyaW5nIHR5cGVtYXAgZml4ZXMgaW4gc3RkX3N0cmluZy5pIGZyb20gUnVzc2VsbCBLZWl0aC1NYWdlZS4KCjEwLzI1LzIwMDQ6IG1tYXR1cyAKCgkgICAgLSBVc2luZyArIG5hbWVzcGFjZSBpcyB3b3JraW5nIG5vdyAodXNpbmdfbmFtZXNwYWNlLmkpLgoKCSAgICAtIERlcml2ZWQgKyBuZXN0ZWQgY2xhc3NlcyBpcyB3b3JraW5nIG5vdwoJICAgICAgKGRlcml2ZXJfbmVzdGVkLmkpLCBidXQgb2YgY291cnNlLCB3ZSBhcmUgc3RpbGwgd2FpdGluZwoJICAgICAgZm9yIHRoZSBuZXN0ZWQgY2xhc3Mgc3VwcG9ydC4KCSAgICAKCSAgICAtIERpcmVjdG9yczoKCSAgICAgIC0gdW5uYW1lZCBwYXJhbWV0ZXJzIHN1cHBvcnQsCgoJICAgICAgLSBwcm90ZWN0ZWQgY29uc3RydWN0b3Igc3VwcG9ydCAoYXV0b21hdGljIGFuZCB3aXRoCiAgICAgICAgICAgICAgICBkaXJwcm90IG1vZGUpLAoKCSAgICAgIC0gZGV0ZWN0aW9uIG9mIHJlYWxseSBuZWVkZWQgcHJvdGVjdGVkIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgKG1lbWJlcnMgYW5kIGNvbnN0cnVjdG9ycykgbm93IGlzIGRvbmUgYXV0b21hdGljYWxseS4KICAgICAgICAgICAgICAgIEV2ZW4gaWYgeW91IGRvbid0IHVzZSB0aGUgJ2RpcnByb3QnIG1vZGUsIHN3aWcgd2lsbAogICAgICAgICAgICAgICAgd3JhcCB3aGF0IGlzIG1pbmltYWxseSBuZWVkZWQgKGFuZCBwcm90ZWN0ZWQpIGZvciB0aGUKICAgICAgICAgICAgICAgIGNvZGUgdG8gY29tcGlsZS4KCQkKCQl3aGF0IGlzIHB1YmxpYywgYXMgdXN1YWwsIGlzIGFsd2F5cyB3cmFwcGVkLCBhbmQgaWYKCQl5b3UgdXNlIHRoZSAnZGlycG9ydCcKCQkKCgkgICAgLSBGaW5hbCBmaXhlcyBmb3IgdGhlIE9TUyB0byBjb21waWxlIHdpdGggU1dJRyAxLjMuMjMgKG15CgkgICAgICB2ZXJ5IHZlcnkgdWdseSBDKysgKyB0ZW1wbGF0ZXMgKyBldmVyeXRoaW5nIG1vdW50ZXJzIHdyYXApLgoKMTAvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1kbGxpbXBvcnQuIFRoaXMgZW5hYmxlcyBvbmUgdG8gc3BlY2lmeQogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgRExMIGZvciB0aGUgRGxsSW1wb3J0IGF0dHJpYnV0ZS4gTm9ybWFsbHkgdGhpcyBuYW1lCiAgICAgICAgICAgIGNvbWVzIGZyb20gdGhlIG1vZHVsZSBuYW1lLCBzbyBub3cgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhpczoKCiAgICAgICAgICAgICAgc3dpZyAtY3NoYXJwIC1kbGxpbXBvcnQgeHl6IGV4YW1wbGUuaQoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBmb3IgYWxsIHRoZSB3cmFwcGVkIFBJbnZva2UgbWV0aG9kczoKCiAgICAgICAgICAgICAgW0RsbEltcG9ydCgieHl6IiwgRW50cnlQb2ludD0iLi4uIildCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleHRlcm4gLi4uCgogICAgICAgICAgICBUaGUgd3JhcHBlcnMgZnJvbSBtYW55IGRpZmZlcmVudCBTV0lHIGludm9jYXRpb25zIGNhbiB0aHVzIGJlIGNvbXBpbGVkCiAgICAgICAgICAgIGludG8gb25lIERMTC4KCiAgICAgICAgICAgIEEgbmV3IHNwZWNpYWwgdmFyaWFibGUgJGRsbGltcG9ydCBjYW4gYWxzbyBiZSB1c2VkIGluIHR5cGVtYXBzLCBwcmFnbWFzLAogICAgICAgICAgICBmZWF0dXJlcyBldGMuIFRoaXMgd2lsbCBnZXQgdHJhbnNsYXRlZCBpbnRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgLWRsbGltcG9ydAogICAgICAgICAgICBpZiBzcGVjaWZpZWQsIG90aGVyd2lzZSB0aGUgbW9kdWxlIG5hbWUuCgoxMC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzEwNDk0OTYgZnJvbSBTY290dCBNaWNoZWwgZml4ZXMgZGlyZWN0b3JzIG1ldGhvZHMgd2l0aCAKICAgICAgICAgICAgZW51bXMgd2hlbiB3cmFwcGVkIHdpdGggdHlwZXNhZmUgb3IgcHJvcGVyIEphdmEgZW51bXMuCgoxMC8yMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGVmYXVsdCBhcmd1bWVudHMgaW4gZGlyZWN0b3IgY29uc3RydWN0b3JzIChQeXRob24sIFJ1YnksIE9jYW1sKS4KCjEwLzIxLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLWNwbHVzY2FzdCcgb3B0aW9uIHRvIGVuYWJsZSB0aGUgJ25ldycKCSAgICAgIEMrKyBjYXN0aW5nIG9wZXJhdG9ycywgc3VjaCBhcyAnc3RhdGljX2Nhc3QnLCBpbnNpZGUgdGhlCgkgICAgICB0eXBlbWFwcy4gQnkgZGVmYXVsdCBzd2lnIHVzZSB0aGUgb2xkIEMgY2FzdCBzdHlsZSwgZXZlbgoJICAgICAgd2hlbiBwYXJzaW5nIEMrKy4KCSAgICAgIAoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5ld192d20nIG9wdGlvbiB0byBlbmFibGUgdGhlIG5ldwogICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXIgbW9kZS4gTm93IHRoaXMgaXMgbWFpbmx5IGZvciB0ZXN0aW5nCiAgICAgICAgICAgICAgdGhhdCB0aGUgdHlwZW1hcHMgYXJlIHJlYWxseSBzYWZlIGZvciBhbnkgZnV0dXJlCiAgICAgICAgICAgICAgc29sdXRpb24sIGJ1dCB5b3UgY2FuIHVzZSBpdCBpZiB5b3UgaGF2ZSBhIHZlcnkgc3RyYW5nZQogICAgICAgICAgICAgIGVycm9yIHdpdGggZGVmYXVsdCBjb3NudHJ1Y3RvcnMgbWlzc2luZyArICVhcHBseSArCiAgICAgICAgICAgICAgJXR5cGVtYXAsIGFuZCBpZiBldmVyeXRoaW5nIGVsc2UgZmFpbHMgKHNlZQogICAgICAgICAgICAgIHZhbHV3cmFwcGVyX29wYXF1ZS5pIGZvciBhbHRlcm5hdGl2ZSBhbmQgY3VycmVudAogICAgICAgICAgICAgIHNvbHV0aW9ucykuIElmIHlvdSBhcmUgYSB1c2VyIHRoYXQgZG9uJ3Qga25vdyB3aGF0IGlzCiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgZG9uJ3QgZXZlbiB0cnkgaXQuCgoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5vaCcgb3B0aW9uIHRvIGJlIHVzZWQgd2l0aCBkaXJlY3RvcnMKCSAgICAgIGFuZCB3aGVuIHlvdSBwcmVmZXIgdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUKCSAgICAgIGRpcmVjdG9yIGhlYWRlciBmaWxlLiBJZiBub3QgdXNlZCwgc3dpZyB3aWxsIHdvcmsgYXMKCSAgICAgIHVzdWFsIGdlbmVyYXRpbmcgYm90aCB0aGUgd3JhcC5jeHggYW5kIHdyYXAuaCBmaWxlcy4gSWYKCSAgICAgIHlvdSB1c2UgaXQsIHN3aWcgd2lsbCBvbmx5IGdlbmVyYXRlIHdyYXAuY3h4LgoKMTAvMjEvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gSWYgeW91IGRlZmluZSBTV0lHX1RZUEVfVEFCTEUgd2hlbiBjb21waWxpbmcgYSB3cmFwcGVyIGZpbGUsCgkgICAgICB0aGUgcnVudGltZSB0eXBlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gdHlwZSB0YWJsZSBuYW1lLgoJICAgICAgVXNpbmcgdGhpcywgeW91IGNhbiBzZXBlcmF0ZSBkaWZmZXJlbnQgbW9kdWxlcyB0byBzaGFyZSB0aGVpcgoJICAgICAgb3duIHR5cGUgc3lzdGVtcy4gIC1EU1dJR19UWVBFX1RBQkxFPU15dGFibGUKCgkgICAgLSBbUHl0aG9uXSBJZiB5b3UgZGVmaW5lIFNXSUdfU1RBVElDX1JVTlRJTUUgdGhlbiB0aGUgdHlwZSBpbmZvcm1hdGlvbgoJICAgICAgd2lsbCBiZSBzdGF0aWMgdG8gdGhpcyB3cmFwcGVyLiAgTm90aGluZyB3aWxsIGJlIHNoYXJlZCB3aXRoIGFueQoJICAgICAgb3RoZXIgbW9kdWxlcwoKCSAgICAtIFtQeXRob25dIElmIHlvdSBkZWZpbmUgU1dJR19MSU5LX1JVTlRJTUUsIHRoZW4gaW5zdGVhZCBvZiB1c2luZwoJICAgICAgdGhlIG5ldyB3YXkgb2Ygc2hhcmluZyB0eXBlIGluZm9ybWF0aW9uLCB0aGUgd3JhcHBlciB3aWxsIGV4cGVjdAoJICAgICAgdG8gYmUgbGlua2VkIGFnYWluc3QgdGhlIExpYi9saW5rcnVudGltZS5jIGZpbGUuICBBbnkgbW9kdWxlcyBjb21waWxlZAoJICAgICAgd2l0aCBTV0lHX0xJTktfUlVOVElNRSBhbmQgbGlua2VkIGFnYWluc3QgbGlua3J1bnRpbWUuYyB3aWxsIGFsbAoJICAgICAgc2hhcmUgdHlwZSBpbmZvcm1hdGlvbi4KCjEwLzIwLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gSW5pdGlhbCBmaXggZm9yIHB5dGhvbi9pbXBvcnQgZXhhbXBsZS4gUGxlYXNlCgkgICAgICB1cGRhdGUgdGhlIE1ha2VmaWxlIChhdXRvY29uZiwgY29uZmlndXJlLCBldGMsIGV4cGVydCksCgkgICAgICBzaW5jZSBub3cgcHJvYmFibHkgaXMgb25seSB3b3JraW5nIHdpdGggZysrLCBpY2MgYW5kIGEKCSAgICAgIGZldyBvdGhlciBjb21waWxlcnMgdGhhdCBoYXZlIHRoZSAtc2hhcmVkIG9wdGlvbi4KCgkgICAgICBXZSBuZWVkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHNoYXJlZCBsaWJyYXJpZXMgZm9yIHRoZQoJICAgICAgdmlydHVhbCBkZXN0cnVjdG9ycy4gT2xkIGFuZCB1c3VhbGx5IGZvcmdvdHRlbiBDKysKCSAgICAgIHJlcXVpcmVtZW50LgoJICAgICAgCgkgICAgICBTYW1lIGZpeCBuZWVkIHRvIGJlIHVzZWQgaW4gcGVybCwgSSB0aGluay4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gRml4IGdlbmVyYXRpb24gb2YgaGVhZGVyIGZpbGUgZm9yIGRpcmVjdG9ycywKICAgICAgICAgICAgICBub3cgZGlyZWN0b3JzLnN3ZyBpcyBhbHNvIGluY2x1ZGVkLCBzbywgaXQgY2FuIGJlIHJlYWxseQoJICAgICAgdXNlZCBmcm9tIEMrKywgYW5kIGl0IHNvbHZlcyBzb21lIHByb2JsZW0gd2l0aCBjb21waWxlcgoJICAgICAgdGhhdCByZXF1aXJlIHRoYXQsIGV2ZW4gd2l0aCB0aGUgc2ltcGxlIHN3aWcgaW5jbHVzaW9uLiAgCgogICAgICAgICAgICAtIFtQeXRob25dIFJlb3JkZXJpbmcgdGhlIG1ldGhvZHMgYW5kIG1vdmluZyBzb21lIGJvZGllcwogICAgICAgICAgICAgIG91dHNpZGUgdGhlIGNsYXNzIGRlY2xhcmF0aW9uLiBUaGlzIGlzIG5lZWRlZCBkdWUgdG8KICAgICAgICAgICAgICBzb21lIGdjYy0yLjk2IGludGVybmFsIGNvbXBpbGVyIGVycm9ycy4gSXQgc2VlbXMgdGhlCiAgICAgICAgICAgICAgUFlUSE9OIGNsYXNzIGlzIGdldHRpbmcgdG9vIGxhcmdlIHRvIGJlZW4gZGVjbGFyZWQgYW5kCiAgICAgICAgICAgICAgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lLgoKCSAgICAtIEFkZCB0aGUgLW9oIG9wdGlvbiB0byBjaGFuZ2UgdGhlIG91dHB1dCBoZWFkZXIgZmlsZSBuYW1lCiAgICAgICAgICAgICAgaWYgbmVlZGVkOgoKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgLW8gdGVzdC5DQyAtb2ggdGVzdC5ISAoJICAgICAgCiAgICAgICAgICAgICAgdGhpcyBpcyBtYWlubHkgbmVlZGVkIHdoZW4gdXNpbmcgZGlyZWN0b3JzLCBhbmQgaWYgdGhlCiAgICAgICAgICAgICAgY3VycmVudCBkZWZhdWx0IGhlYWRlciBmaWxlIG5hbWUgaXMgbm90IGdvb2QgZm9yIHlvdSwKICAgICAgICAgICAgICB3aGljaCBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93OgkgICAgICAKCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pICAgICAgICAgICAgID0+IHRlc3Rfd3JhcC5oCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pIC1vIHRlc3QuQ0MgID0+IHRlc3QuaAoKCjEwLzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIDEpIENvbXBhY3QgZGVmYXVsdCBhcmd1bWVudHMgZmVhdHVyZSBhZGRlZC4gVGhpcyBmZWF0dXJlIGFsbG93cyBvbmUKICAgICAgICAgICAgICB0byB1c2UgdGhlIGRlZmF1bHQgYXJndW1lbnQgY29kZSBnZW5lcmF0aW9uIHRoYXQgd2FzIHVzZWQgaW4KICAgICAgICAgICAgICBTV0lHLTEuMy4yMiBhbmQgZWFybGllciB2ZXJzaW9ucy4gSXQgcHJvZHVjZXMgbW9yZSBjb21wYWN0IHdyYXBwZXJzCiAgICAgICAgICAgICAgYXMgb25seSBvbmUgd3JhcHBlciBtZXRob2QgaXMgZ2VuZXJhdGVkIGZvciBhbnkgbWV0aG9kIHdpdGggZGVmYXVsdAogICAgICAgICAgICAgIGFyZ3VtZW50cy4gU28gdGhlIGFkdmFudGFnZSBpcyBpdCBnZW5lcmF0ZXMgbGVzcyBjb2RlIGJ1dCBoYXMgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgbGltaXRhdGlvbnMsIGxpa2UgaXQgaXQgZG9lcyBub3Qgd29yayB3aXRoIGFsbCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBjYW5ub3QgYmUgdGFrZW4gYWR2YW50YWdlIG9mIGluIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICAgIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpLiBJdCBpcyBpbXBsZW1lbnRlZCB2aWEgdGhlIHVzdWFsICVmZWF0dXJlIG1lY2hhbmlzbToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIik7CgogICAgICAgICAgICAyKSBLZXl3b3JkIGFyZ3VtZW50cyAoa3dhcmdzKSBhcmUgd29ya2luZyBhZ2FpbiBmb3IgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICAgaW4gdGhlIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgaXQsIGllLCBQeXRob24gYW5kIFJ1YnkuIFRoZSBuZXcgZGVmYXVsdAogICAgICAgICAgICAgICBhcmd1bWVudCB3cmFwcGluZyBhcHByb2FjaCB1c2luZyBvdmVybG9hZGVkIG1ldGhvZHMgY2Fubm90IHN1cHBvcnQga3dhcmdzCiAgICAgICAgICAgICAgIHNvIHRoZSBjb21wYWN0IGRlZmF1bHQgYXJndW1lbnQgZmVhdHVyZSBpcyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbiB3aGVuCiAgICAgICAgICAgICAgIGt3YXJncyBhcmUgc3BlY2lmaWVkLCBieSAlZmVhdHVyZSgia3dhcmdzIikuCgogICAgICAgICAgICAzKSBDb21wYWN0IGRlZmF1bHQgYXJndW1lbnRzIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIHdoZW4gd3JhcHBpbmcKICAgICAgICAgICAgICAgQyAobm90IEMrKykgY29kZS4gVGhpcyBpcyB0byBzdXBwb3J0IHRoZSBiaXphcnJlIG5vdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgICBmb3IgQyBjb2RlLgoKMTAvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgT3ZlcmxvYWRlZCB0ZW1wbGF0ZWQgZnVuY3Rpb25zIGluIG5hbWVzcGFjZXMgYWxzbyB3b3JraW5nIG5vdy4KICAgICAgICAgICAgVGVtcGxhdGVkIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGluIG5hbWVzcGFjZXMgdG9vLgoKMTAvMTkvMjAwNDogbW1hdHVzCgoJICAgIC0gQWxsb3cgdG8gZGlzYWJsZSB0aGUgbmV3IFN3aWdWYWx1ZVdyYXBwZXIgbWVjaGFuaXNtLAoJICAgICAgaWYgeW91IGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBsYW5ndWFnZSBtYWluLgoKCQkgLyogVHVybiBvbiBzYWZlIHZhbHVlIHdyYXBwZXIgdXNlIG1vZGUgKi8KICAgICAgICAgICAgICAgICBTd2lnX3ZhbHVlX3dyYXBwZXJfbW9kZSgxKTsKCgkgICAgICAKCSAgICAgIE5vdyBpcyBvbmx5IGFjdGl2ZSBpbiBweXRob24uIEFsbCB0aGUgb3RoZXIgbGFuZ3VhZ2VzCgkgICAgICBhcmUgdXNpbmcgdGhlIG9sZCByZXNvbHV0aW9uLCBidXQgdGhleSAgY2FuIGFsc28gdXNlIHRoZQoJICAgICAgInZhbHVld3JhcHBlciIvIm5vdmFsdWV3cmFwcGVyIiBmZWF0dXJlcyB0byBmaXggc29tZQoJICAgICAgb2YgdGhlIG9sZCBicm9rZW4gY2FzZXMuIE5vdGUsIGhvd2V2ZXIsICB0aGF0IG5vdCBhbGwgCgkgICAgICB0aGUgYnJva2VuIGNhc2VzIGNhbiBiZSBzb2x2ZWQgaW4gdGhhdCB3YXkuCgoJICAgICAgVGhlIG5ldyBtZWNoYW5pc20gc2VlbXMgdG8gYmUgd29ya2luZyBmaW5lIGluIHBlcmwsIHJ1YnkKCSAgICAgIGFuZCB0Y2wsIGJ1dCBmYWlsaW5nIGluIHNvbWUgdHlwZW1hcHMgaW4gamF2YS4KCgkgICAgICBIZW5jZSwgaXMgdXB0byB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lciB0byB0ZXN0IGl0LCBhbmQKCSAgICAgIGRlY2lkZSB0byBlbmFibGUgaXQgb3Igbm90LgoKCSAgICAgIExvb2sgYXQgdGhlIHZhbHVld3JhcHBlcl9vcGFxdWUuaSBmb3IgZXhhbXBsZXMuCgoJICAgIC0gRml4IG1vcmUgU3dpZ1ZhbHVlV3JhcHBlciBjYXNlcyB3aGVuIHRoZSBuZXcgbWVjaGFuaXNtCgkgICAgICBpcyBhY3RpdmUuIE5vdyBpdCBhbHNvIGNoZWNrIGZvciBsb2NhbCB0eXBlbWFwCgkgICAgICB2YXJpYWJsZXMsIHNlZSB2YWx1ZXdyYXBwZXJfb3BhcXVlLmkgZm9yIGFuIGV4YW1wbGUgd2hlbgoJICAgICAgdGhpcyBpcyBuZWVkZWQuIEJ1dCBhZ2FpbiwgdGhpcyBleHRyYSBjaGVja2luZyB3aWxsIG9ubHkKCSAgICAgIGJlIGFjdGl2YXRlZCB3aGVuIHVzaW5nIHRoZSBuZXcgdmFsdWUgd3JhcHBlciBtb2RlLgoKCSAgICAtIFtQeXRob25dIEZpeCB2YXJpYWJsZSB3cmFwcGluZyBvZiBjbGFzc2VzIHdpdGggcHJpdmF0ZQoJICAgICAgYXNzaWduIG9wZXJhdG9ycy4gSXQgc2hvdWxkIGJlIGVhc3kgdG8gZml4IGluIGFsbCB0aGUgCgkgICAgICBvdGhlciBtb2R1bGVzLCBpbnN0ZWFkIG9mIGNoZWNraW5nCgoJICAgICAgICAgaWYgKCFHZXRhdHRyKG4sImltbXV0YWJsZSIpKSAuLi4KCQoJICAgICAgeW91IG5lZWQgdG8gdmVyaWZ5CgoJICAgICAgICAgaWYgKGlzX2Fzc2lnbmFibGUobikpIC4uLgoKCSAgICAgIExvb2sgYXQgdGhlIHByaXZhdGVfYXNzaWduLmkgZm9yIGFuIGV4YW1wbGUuCgoxMC8xOC8yMDA0OiBtbWF0dXMKCSAgICAtICVmZWF0dXJlcyAiZGlyZWN0b3IiLyJub2RpcmVjdG9yIiBub3cgd29yayBhcyBleHBlY3RlZC4KICAgICAgICAgICAgLSBHZW5lcmFsIGZpeGVzIGluICVmZWF0dXJlIHRvIHJlc29sdmUgZnVuY3Rpb24gZGVjbAoJICAgICAgcHJvcGVybHksCgkgICAgICAKCSAgICAgICAgJWZlYXR1cmUoImhlbGxvIikgZm9vKCk7CgkgICAgICAgIGNoYXIgZm9vKCkgLT4gIGYoKSAgICAvLyB3YXMgd29ya2luZwoJICAgICAgICBjaGFyICpmb28oKSAtPiBmKCkucCAgLy8gaXQgd2Fzbid0CiAKCiAgICAgICAgICAgIC0gVGVtcGxhdGUgKyBzcGVjaWFsaXphdGlvbiArIGRlZmF1bHQgdGVtcGxhdGUgYXJncyBub3cgaXMKCSAgICAgIHdvcmtpbmcsIChkb24ndCBjb25mdXNlIHdpdGggdGVtcGxhdGUgKyBkZWZhdWx0IGFyZwoJICAgICAgdmFsdWVzLCB0aGF0IHdhcyBzb2x2ZWQgYmVmb3JlKSwgbm93IHRoaXMgdWdseSBjYXNlIGlzCgkgICAgICB3b3JraW5nOgoKCSAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEEgPSBBbGxvYzxUPiA+CgkJc3RydWN0IFZlY3RvcgoJCXsKCQkgICBWZWN0b3IoVCBhKXt9CgkJfTsJCSAgIAoKCQl0ZW1wbGF0ZSA8PgoJCXN0cnVjdCBWZWN0b3I8ZG91YmxlPgoJCXsKCQkgIFZlY3Rvcigpe30KCQkgIGludCBmb28oKSB7IHJldHVybiAwOyB9CiAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgJXRlbXBsYXRlKFZfYykgVmVjdG9yPGNoYXIsIEFsbG9jPGNoYXI+ID47CgkgICAgICAgICV0ZW1wbGF0ZShWX2kpIFZlY3RvcjxpbnQ+OyAgICAvLyBwaWNrcyBWZWN0b3I8aW50LEFsbG9jPGludD4gPgoJICAgICAgICAldGVtcGxhdGUoVl9kKSBWZWN0b3I8ZG91YmxlPjsgLy8gcGlja3MgdGhlIHNwZWNpYWxpemF0aW9uCgkgICAgICAKICAgICAgICAgICAgICB0aGlzIGlzIG5lZWRlZCBmb3IgYXV0b21hdGljIFNUTCBzdXBwb3J0IChsYXRlciB3aWxsCiAgICAgICAgICAgICAgYmUpLgoKCSAgICAtIEZpeCB0aGUgdGVtcGxhdGUgKyB0eXBlZGVmIGVycm9ycyBpbiB0ZXN0LXN1aXRlLCB3aGljaAogICAgICAgICAgICAgIHByb2JhYmx5IHdpbGwgZml4IGFub3RoZXIgZ3JvdXAgb2Ygc3RyYW5nZSB0ZW1wbGF0ZSArCiAgICAgICAgICAgICAgbmFtZXNwYWNlcyArIHR5cGVkZWZzIGVycm9ycy4KCgkgICAgLSAld2FybmZpbHRlciBpcyB3b3JraW5nIGJldHRlciBub3csIHBhcnNlci55IHRyaWVzIHRvIHVzZQoJICAgICAgdGhlbSB3aGVuIG5lZWRlZC4KCgkgICAgLSAqKioqIE5ldyBkZWZhdWx0IHR5cGUgcmVzb2x1dGlvbiBtZXRob2QgKHN0eXBlLmMpICoqKioqIAoKCSAgICAgIEl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgbWl4ZWQgdHlwZXMsIHRoZW4gaXQgZ29lcwoJICAgICAgJ2JhY2t3YXJkJyBmaXJzdCBkZWxldGluZyB0aGUgcXVhbGlmaWVyLCB0aGVuIHRoZSBpbm5lcgoJICAgICAgdHlwZXMsIGZvciBleGFtcGxlOgogICAgCQkgCQkJCQkJCSAgCiAgICAJCSB0eXBlZGVmIEEgKkFwdHI7CQkJCSAgCiAgICAJCSBjb25zdCBBcHRyJjsJCQkJCQkKICAgIAkJIHIucShjb25zdCkuQXB0ciAgICAgICAtPiByLnEoY29uc3QpLnAuU1dJR1RZUEUJCQogICAgCQkgci5xKGNvbnN0KS5wLlNXSUdUWVBFIC0+IHIucC5TV0lHVFlQRQkJCQogICAgCQkgci5wLlNXSUdUWVBFICAgICAgICAgIC0+IHIuU1dJR1RZUEUJCQkKICAgIAkJIHIuU1dJR1RZUEUgICAgICAgICAgICAtPiBTV0lHVFlQRQkJCQoJCSAJCQkJCQkJCiAgICAJCSBlbnVtIEhlbGxvIHt9OwkJCQkJCQogICAgCQkgY29uc3QgSGVsbG8mIGhpOwkJCQkJCiAgICAJCSByLnEoY29uc3QpLkhlbGxvICAgICAgICAgIC0+IHIucShjb25zdCkuZW51bSBTV0lHVFlQRQkKICAgIAkJIHIucShjb25zdCkuZW51bSBTV0lHVFlQRSAgLT4gci5lbnVtIFNXSUdUWVBFCQkKICAgIAkJIHIuZW51bSBTV0lHVFlQRSAgICAgICAgICAgLT4gci5TV0lHVFlQRQkJCiAgICAJCSByLlNXSUdUWVBFICAgICAgICAgICAgICAgIC0+IFNXSUdUWVBFCQkJCgkJIAkJCQkJCQkKICAgIAkJIGludCBhWzJdWzRdOwkJCQkJCQogICAgCQkgYSgyKS5hKDQpLmludCAgICAgICAgICAgLT4gYShBTlkpLmEoQU5ZKS5TV0lHVFlQRQkKICAgIAkJIGEoQU5ZKS5hKEFOWSkuU1dJR1RZUEUgIC0+IGEoQU5ZKS5hKCkuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLmEoKS5TV0lHVFlQRSAgICAgLT4gYShBTlkpLnAuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLnAuU1dJR1RZUEUgICAgICAgLT4gYShBTlkpLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5TV0lHVFlQRSAgICAgICAgIC0+IGEoKS5TV0lHVFlQRQkJCiAgICAJCSBhKCkuU1dJR1RZUEUgICAgICAgICAgICAtPiBwLlNXSUdUWVBFCQkJCiAgICAJCSBwLlNXSUdUWVBFICAgICAgICAgICAgICAtPiBTV0lHVFlQRSAgICAgICAgICAgICAgICAgICAgCgoJICAgICAgYmVmb3JlIGl0IGFsd2F5cyBzdG9wcyBhZnRlciBmaW5kaW5nIHJlZi9wb2ludGVyL2VudW0vYXJyYXkvZXRjLgoJICAgICAgIAoJICAgICAgTm93LCB0aGVuLCB5b3UgY2FuIGRlZmluZSAodXNlIGFuZCBhcHBseSkgJ2hpZ2hlcicgdHlwZW1hcHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUqIGNvbnN0JiAgCgkgICAgICAgICV0eXBlbWFwKG91dCkgY2hhciBGSVhTSVpFW0FOWV0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSogY29uc3QmICAKCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGVudW0gU1dJR1RZUEUmCgkgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRVtBTlldW0FOWV0KCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGNoYXIgKCYpW0FOWV0KCSAgICAgICAKCSAgICAgIEl0IGlzIHBvc3NpYmxlIHdpdGggdGhpcyBjaGFuZ2UgdGhhdCBwcmV2aW91cyB0eXBlbWFwcwoJICAgICAgdGhhdCB3ZXJlIGRlZmluZWQgKGJ1dCBpZ25vcmVkKSwgbm93IHdpbGwgc3RhcnQgdG8gd29yay4KCgkgICAgICBBbHNvLCBpdCBpcyBuZWNlc3NhcnkgY2hlY2sgZm9yIHRoZSAnJXR5cGVtYXAodmFyaW4pIFNXSUdUWVBFW10nLAoJICAgICAgYmVmb3JlIGl0IHdhcyB1c3VhbGx5IG5vdCBkZWZpbmVkIChidXQgY2hhcltdIHdhcyksCgkgICAgICBhbmQgdGhhdCBjYW4gcHJvZHVjZSBzb21lIGluY29uc2lzdGVuY2llcy4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgICBUaGlzIGNoYW5nZSB3YXMgbmVlZGVkIGZvciBTVEwsIHNpbmNlIHN0ZDo6dmVjdG9yPGVudW0gSGVsbG8+IAoJICAgICAgc3RkOjp2ZWN0b3I8QSo+LCBldGMsIHdpbGwgYWx3YXlzIGdlbmVyYXRlIG1ldGhvZHMgdGhhdAoJICAgICAgbWl4IGNvbnN0IHJlZmVyZW5jZXMgd2l0aCB0aGUgdmVjdG9yIHR5cGUuCgoJICAgICAgTm93IHRoYXQgaXMgd29ya2luZywgYWxsIHRoZSBzdGQ6OmNvbnRhaW5lcjxUKj4KCSAgICAgIHNwZWNpYWxpemF0aW9uIHdpbGwgbm90IGJlIG5lZWRlZCBhbnltb3JlLCB3ZWxsLCBpbgoJICAgICAgdGhlb3J5LiAKCgkgICAgICBJbiB0aGUgcHJhY3RpY2UsIGV2ZXJ5dGhpbiBpcyB3b3JraW5nIGFzIGJlZm9yZSB1bnRpbAoJICAgICAgdGhlIHByb3BlciBtaXhlZCB0eXBlcyBhcmUgZGVmaW5lZCBhbmQgdGhlIGxpYnJhcmllcwoJICAgICAgc2ltcGxpZmllZCB0byB1c2UgdGhlbS4KCgkgICAgLSBDaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIGV4dGVybiAiamF2YSIvImZvcnRyYW4iLyJldGMiLCAKCSAgICAgIG5vdyBzd2lnIHByb2R1Y2VzIGEgd2FybmluZywgYW5kIHVzZSBleHRlcm4gIkMiIGluc3RlYWQuCgkgICAgICBUaGUgd2FybmluZyBjYW4gYWxzbyBiZSBkaXNhYmxlIHdpdGggdGhlICItdyAzMTMiIGZsYWcuCgkgICAgICAoV0FSTl9QQVJTRV9VTkRFRklORURfRVhURVJOKS4KCgkgICAgLSBTd2lnVmFsdWVXcmFwcGVyIGlzIG5vdyBtb3JlIHNlbGVjdGl2ZSAobGFuZy5jeHgpLgoKICAgICAgICAgICAgW1BlcmwvVGNsXQoJICAgIC0gRml4IHNvbWUgdHlwZW1hcHMgKHBlcmwvdGNsKSB0byB3b3JrIHByb3Blcmx5IHdpdGgKCSAgICAgIFN3aWdWYWx1ZVdyYXBwZXIuIFRoaXMgd2FzIG5vdCBhIHByb2JsZW0gd2l0aAoJICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgYnV0IHdpdGggdGhlIHR5cGVtYXBzIHRoYXQgbm93IGFyZQoJICAgICAgc2FmZSB0byB1c2Ugd2l0aCAlYXBwbHkuCgoJICAgIFtQeXRob25dCgogICAgICAgICAgICAtIEZpeCAlY2FsbGJhY2svJXB5dGhvbmNhbGxiYWNrIHdvcmsgbm93IGFzIGJlZm9yZSBhZnRlcgoJICAgICAgdGhlIGRlZiBhcmdzIGNoYW5nZXMuIEFsc28sICVjYWxsYmFjayBub3cgaXMgYW4gYWxpYXMKCSAgICAgIGZvciAlcHl0aG9uY2FsbGJhY2ssIHNvLCB0aGV5IGRvIHRoZSBzYW1lLgoKCSAgICBbUHl0aG9uL1J1YnldCgkgICAgLSAlY2FsbGJhY2sgaXMgbW9yZSB1c2FibGUgYW5kIHVuaWZvcm06CgogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKSBmb28oKTsgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKTsgICAgICAgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygxKSBmb28oKTsgICAgICAgIC8vIG9ubHkgaW4gcHl0aG9uLgoKMTAvMTcvMjAwNDogYXJ0eQoJICAgIFtPQ0FNTF0KCSAgICAtIFR3ZWFrIHRvIGVudW0gdHlwaW5nIGZvciBzb3VuZG5lc3MgaW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlCgkgICAgICBtb2R1bGVzLgoJICAgIC0gZ2xvYmFsIGZ1bmN0aW9ucyBhcmUgbm93IHVuYW1iaWd1b3VzIGluIG11bHRpcGxlIGxvYWRlZCBtb2R1bGVzLgoJICAgIC0gRml4ZWQgdGVzdCBjYXNlIGNvZGUgdG8gYnVpbGQgbXVsdGltb2R1bGUgdGVzdCBjYXNlcyBjb3JyZWN0bHkuCgkgICAgLSBUaGVyZSBpcyBubyB3YXkgdG8gc2hhcmUgb3ZlcmxvYWQgcmVzb2x1dGlvbiBhY3Jvc3MgbW9kdWxlcwoJICAgICAgYmVjYXVzZSBvZiBzb3VuZG5lc3MgaXNzdWVzLiAgSWYgdGhlIHVzZXIgd2FudHMgdG8gY2FsbCBzb21lCgkgICAgICBmdW5jdGlvbiBmb28gZnJvbSBhbiBhcmJpdHJhcnkgbW9kdWxlIGJhciwgdGhleSB3aWxsIGhhdmUgdG8KCSAgICAgIHVzZSBCYXIuX2ZvbyB0byBjYWxsIGl0IGNvcnJlY3RseS4gIExhdGVyIEkgd2lsbCBmaXggdGhlIAoJICAgICAgY2FtbHA0IG1vZHVsZSB0byBkbyBzb21ldGhpbmcgY2xldmVyIGluIHRoaXMgY2FzZS4gIAogICAgICAgICAgICAtIFByb21pZGVkIHBlcmZvcm1hbmNlIG92ZXJoYXVsIG9mIGNsYXNzIG1lY2hhbmlzbS4KCSAgICAtIFJlbW92ZWQgc3ltYm9sIGhhY2sgZm9yIG9jYW1sLTMuMDcgYW5kIGJlbG93IHdoaWNoIGlzIG5vdCBuZWVkZWQKCSAgICAgIGZvciBvY2FtbC0zLjA4IGFuZCBhYm92ZS4KCjEwLzE2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ0hJQ0tFTl0KCSAgICAtIENvbXBsZXRseSBjaGFuZ2UgaG93IGNoaWNrZW4uY3h4IGhhbmRsZXMgQ0xPUyBhbmQgZ2VuZXJpYyBjb2RlLgoJICAgICAgY2hpY2tlbiBubyBsb25nZXIgZXhwb3J0cyAtY2xvcy5zY20gYW5kIC1nZW5lcmljLnNjbS4gIFRoZSBjbG9zCgkgICAgICBjb2RlIGlzIGV4cG9ydGVkIGRpcmVjdGx5IGludG8gdGhlIG1vZHVsZS5zY20gZmlsZSBpZiAtcHJveHkgaXMgcGFzc2VkLgoJICAgIC0gVGhlIGNvZGUgbm93IGFsd2F5cyBleHBvcnRzIGEgdW5pdC4gIFJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUgaXMgbm93CgkgICAgICBtYWpvcmx5IGJyb2tlbiwgYW5kIG5lZWRzIHRvIGJlIGZpeGVkLgoJICAgIC0gQ0xPUyBub3cgZ2VuZXJhdGVzIHZpcnR1YWwgc2xvdHMgZm9yIG1lbWJlciB2YXJpYWJsZXMgc2ltaWxhciB0byBob3cKCSAgICAgIEdPT1BTIHN1cHBvcnQgd29ya3MgaW4gdGhlIGd1aWxlIG1vZHVsZS4KCSAgICAtIGNoaWNrZW4gbm8gbG9uZ2VyIHByZWZpeGVzIHN5bWJvbHMgYnkgdGhlIG1vZHVsZSBuYW1lLCBhbmQgbm8gbG9uZ2VyCgkgICAgICBmb3JjZXMgYWxsIG5hbWVzIHRvIGxvd2VyIGNhc2UuICBJdCBub3cgaGFzIC11c2VjbGFzc3ByZWZpeCBhbmQgLWNsb3NwcmVmaXgKCSAgICAgIHNpbWlsYXIgdG8gaG93IGd1aWxlIGhhbmRsZXMgR09PUFMgbmFtZXMuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUZW1wbGF0ZWQgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgd29ya2luZyB3aXRoIG5ldyBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHdyYXBwaW5nIGFwcHJvYWNoLiBUaGUgbmV3IGFwcHJvYWNoIG5vIGxvbmdlciBmYWlscyB3aXRoIHRoZSBmb2xsb3dpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudCBwYXR0ZXJuIChwcmV2aW91c2x5IGZhaWxlZCB3aXRoIHNvbWUgcHJpbWl0aXZlIHR5cGVzLCBsaWtlIAogICAgICAgICAgICB1bnNpZ25lZCBwcmltaXRpdmUgdHlwZXMpOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgZm9vKGNvbnN0IFQmIHUgPSBUKCkpOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShmb28pIGZvbzx1bnNpZ25lZCBpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWxpZXMgb24gdGhlIHRlbXBsYXRlZCBmdW5jdGlvbiBvdmVybG9hZGluZyBzdXBwb3J0IGp1c3QgYWRkZWQsIHNvIGFsbAogICAgICAgICAgICB0aGUgY29tYmluYXRpb25zIG9mIG92ZXJsb2FkaW5nIGJ5IHRlbXBsYXRlIHBhcmFtZXRlcnMgYW5kIG5vcm1hbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgIGFzIHdlbGwgYXMgb3ZlcmxvYWRpbmcgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgd29ya3MuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgbGFyZ2UgcmFuZ2Ugb2YgdGVtcGxhdGVkIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHRoYXQgQysrCiAgICAgICAgICAgIHN1cHBvcnRzLgoKICAgICAgICAgICAgLSBPdmVybG9hZGVkIHRlbXBsYXRlZCBmdW5jdGlvbnMsIGVnCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQsIGNvbnN0IFQgJnIpOwoKICAgICAgICAgICAgLSBGaXhlcyB3aGVyZSB0aGUgdGVtcGxhdGVkIHR5cGUgaXMgbm90IHVzZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCBlZwoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHh5eigpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCB4eXo8ZG91YmxlPigpOwoKICAgICAgICAgICAgLSBGaXhlcyBmb3Igb3ZlcmxvYWRpbmcgb2YgcGxhaW4gZnVuY3Rpb25zIGJ5IGEgdGVtcGxhdGVkIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKCiAgICAgICAgICAgIC0gT3ZlcmxvYWRpbmcgYnkgdGVtcGxhdGVkIHBhcmFtZXRlcnMgZml4ZWQ6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZm9vKFQgdCkge30KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiB2b2lkIGZvbyhUIHQsIFUgdSkge30KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvbykgZm9vPGRvdWJsZSwgZG91YmxlPjsKCiAgICAgICAgICAgIC0gQWxsIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgYWxzbyB3b3JraW5nIGluY2x1ZGluZyBzcGVjaWFsaXphdGlvbnMsIGVnOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgYWJjPGRvdWJsZT4oZG91YmxlIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCBhYmMoaW50IHQpOwoKMTAvMTYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gUmVtb3ZlIHRoZSBhYmlsaXR5IHRvIHNoYXJlIHR5cGUgaW5mb3JtYXRpb24gYnkgdXNpbmcgYyBsaW5raW5nLgogICAgICAgICAgICAgIEFsbCB0eXBlIHNoYXJpbmcgaGFwcGVucyB0aHJvdWdoIGEgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgICAgICArIFJlbW92ZSBTV0lHX05PSU1QT1JULCBTV0lHX1JVTlRJTUUsIGFuZCByZWxhdGVkIGRlZmluZXMuCiAgICAgICAgICAgICAgICArIERlcHJlY2F0ZSAtcnVudGltZSwgLW5vcnVudGltZSBjb21tYW5kIGxpbmUgb3B0aW9ucwogICAgICAgICAgICAgICAgKyBVcGRhdGUgdGVzdC1zdWl0ZSBjb21tb24ubWsgdG8gY29ycmVjdGx5IGJ1aWxkIG11bHRpY3BwdGVzdAogICAgICAgICAgICAgICAgKyBSZW1vdmUgcmVmZXJlbmNlIHRvIHByZWNvbW1vbi5zd2cKICAgICAgICAgICAgICAgICsgVXBkYXRlIHRoZSBndWlsZV9naCBpbnRlcmZhY2UgdG8gc2hhcmUgZGF0YSBieSBhIGdsb2JhbCB2YXIgaW5zdGVhZAogICAgICAgICAgICAgICAgICBvZiBjIGxpbmthZ2UuCgogICAgICAgICAgICAtIFJlbW92ZSBBZHZhbmNlZC5odG1sLCBzaW5jZSBldmVyeXRoaW5nIGluIGl0IGlzIG5vdyBvYnNvbGV0ZQoKMTAvMDkvMjAwNDogbW1hdHVzCgkgICAgLSBTcGxpdCB0aGUgcHl0aG9uIHN0ZC9TVEwgQysrIGxpYnJhcnkgZmlsZXMsIG5vdwoJICAgICAgYWxsIHRoZSBsYW5ndWFnZSBpbmRlcGVuZGVudCBkZWZpbml0aW9ucyBhcmUgdW5kZXIKCSAgICAgIHRoZSBkaXJlY3RvcnkKCSAgICAgIAoJCUxpYi9zdGQKCgkgICAgICBhbmQgaGVuY2UsIGNhbiBiZSB1c2VkIGZyb20gb3RoZXIgbGFuZ3VhZ2VzLgoKCSAgICAtIEFkZCBtb3JlIGRvY3VtZW50YXRpb24gdG8gdGhlIFB5dGhvbiBTVEwsIGFuZAoJICAgICAgY2xlYW4gdW5uZWNlc3NhcnkgY29kZS4KCgkgICAgLSBBZGQgaW5pdGlhbCBDOTkgY29tcGxleCBzdXBwb3J0LCBhbmQgc29tZSBmaXhlcwoJICAgICAgZm9yIGxvbmcgZG91YmxlLgoKMTAvMDgvMjAwNDogbW1hdHVzCgkgICAgLSBGaXggdGhlIFN3aWdWYWx1ZVdyYXBwZXIgZm9yIG9wYXF1ZSB0eXBlcywgbm93IGl0IGlzIAoJICAgICAgYXBwbGllZCBmb3Igb3BhcXVlIHRlbXBsYXRlcyBhbmQgY2xhc3NlcywgZm9yIHdoaWNoIHdlCgkgICAgICBkb24ndCBrbm93IGlmIHRoZXJlIGlzIG9yIG5vdCBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGllCgogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsgCiAgICAgICAgICAgICAgICAgICBBKGludCk7CiAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgIFN0aWxsLCBpZiB5b3Uga25vdyB0aGF0IHlvdSBjbGFzcyBoYXMgYSBkZWZhdWx0CiAgICAgICAgICAgICAgY29uc3RydWN0b3IsIGFuZCBmb3Igc29tZSB2ZXJ5IHZlcnkgcGFydGljdWxhciByZWFzb24KICAgICAgICAgICAgICB5b3Ugd2FudCB0byBhdm9pZCB0aGUgU3dpZ1ZhbHVlV3JhcHBlciwgYW5kIHlvdSBkb24ndAogICAgICAgICAgICAgIHdhbnQgb3IgY2FuJ3QgZXhwb3NlIHRoZSBjbGFzcyB0byBzd2lnLCBub3cgeW91IGNhbgogICAgICAgICAgICAgIHNheQoKICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm92YWx1ZXdyYXBwZXIiKSBBOyAgICAKICAgICAgICAgICAgICAgICBjbGFzcyBBOwogICAgICAgICAgICAgICAKICAgICAgICAgICAgICBvciB0aGUgb3RoZXIgd2F5IGFyb3VuZCwgaWYgdGhlIGNsYXNzIGhhcyBhIGRlZmF1bHQKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgYnV0IHlvdSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgd3JhcHBlciwgeW91CiAgICAgICAgICAgICAgY2FuIHNheQoKICAgICAgICAgICAgICAgICAlZmVhdHVyZSgidmFsdWV3cmFwcGVyIikgQTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7IAogICAgICAgICAgICAgICAgICAgQSgpOwoJCSAgIC4uLi4KICAgICAgICAgICAgICAgICB9OyAgIAogICAgICAKCSAgICAtIEZpeCBmb3IgY2hhciA+IDEyOCwgaWUKCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHRpbGRlX2EgPSAnXDM0MSc7CgogICAgICAgICAgICAtIEFkZCBwYXRjaCAxMDQxODU4IGZvciAkbGV4dHlwZSwgd2hpY2ggY2FycmllcyB0aGUgCiAgICAgICAgICAgICAgbGl0ZXJhbCB0eXBlIG9mIGEgc3ltYm9sLiBTZWUgbGV4dHlwZS5pIGluIHRoZQogICAgICAgICAgICAgIHRlc3Qtc3VpdGUgZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAoKMTAvMDcvMjAwNDogd3NmdWx0b24KCSAgICB7UnVieSwgSmF2YV0gRml4IGRpcmVjdG9yICsgJ2VtcHR5JyB0aHJvd3MKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICBBKCkgdGhyb3coKTsKCQkgICAgICB2aXJ0dWFsIH5BKCkgdGhyb3coKTsKCQkgICAgICBpbnQgZm9vKCkgdGhyb3coKTsKCQkgICAgfTsKCgoxMC8wNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW1RDTF0KICAgICAgICAgICAgLSBGaXggYnVnIHJlcG9ydGVkIGJ5IFdpbGxpYW0gQS4gSG9mZm1hbiBwcm9wYWdhdGluZyBjbGllbnRkYXRhCiAgICAgICAgICAgIGJldHdlZW4gbW9kdWxlcy4gIEFkZGVkIGNsaWVudGRhdGFfcHJvcC5tdWx0aWNwcHRlc3QgdG8gY2hlY2sgZm9yCiAgICAgICAgICAgIHRoaXMgYnVnLiAgVGhlIGZpeCBpbnZvbHZlZCB0aGUgZm9sbG93aW5nIGNoYW5nZXM6CiAgICAgICAgICAgICAgICArIFN3aWdUeXBlX2NsaWVudGRhdGFfY29sbGVjdCBkb2VzIG5vdCBuZWVkIHRvIGNoZWNrCiAgICAgICAgICAgICAgICB0eXBlcyBpbiByX3Jlc29sdmVkIGJlY2F1c2Ugd2Ugb25seSB3YW50IHRvIHByb3BhZ2F0ZSBjbGllbnRkYXRhCiAgICAgICAgICAgICAgICB0byB0eXBlZGVmZWQgY2xhc3NlcywgYW5kIHJfbWFuZ2xlZCBhbHJlYWR5IHRha2VzIGNhcmUgb2YgdHlwZWRlZnMuCgogICAgICAgICAgICAgICAgKyBTV0lHX1R5cGVSZWdpc3RlciBub3cgY29waWVzIHRoZSBjbGllbnRkYXRhIGZpZWxkIGNvcnJlY3RseQoKICAgICAgICAgICAgICAgICsgTW92ZSBTV0lHX0d1aWxlX1Byb3BhZ2F0ZUNsaWVudERhdGEgZnVuY3Rpb24gZnJvbSBndWlsZSBtb2R1bGUKICAgICAgICAgICAgICAgIGludG8gY29tbW9uLnN3ZywgYmVjYXVzZSB3ZSBuZWVkIHRvIGNhbGwgaXQgZnJvbSBib3RoIGd1aWxlIGFuZCB0Y2wuCgogICAgICAgICAgICAgICAgKyBBZGQgYmFzZV9uYW1lcyB0byBzd2lnX2NsYXNzIHRvIGRlbGF5IHRoZSBsb29rdXAgb2YgYmFzZXMuICBTV0lHCiAgICAgICAgICAgICAgICBub3cgZXhwb3J0cyB0aGUgYmFzZSBuYW1lcyBhbmQgb25seSB3aGVuIHRoZSBiYXNlIHN3aWdfY2xhc3MgaXMKICAgICAgICAgICAgICAgIG5lZWRlZCBpcyBTV0lHX1R5cGVRdWVyeShuYW1lKS0+Y2xpZW50ZGF0YSBsb29rZWQgdXAuCgogICAgICAgICAgICAtIGNvbnZlcnNpb25fbnNfdGVtcGxhdGUgdGVzdHN1aXRlIHRlc3Qgd2FzIGZhaWxpbmcgYmVjYXVzZQogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3YXMgbm90IGNhbGN1bGF0ZWQKICAgICAgICAgICAgY29ycmVjdGx5IGZvciBzdHJ1Y3RzLiAgRml4ZWQuCgoxMC8wNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGVmYXVsdCBhcmd1bWVudHMgdXNlZCBpbiBkaXJlY3RvcnMgLSBpbiB2aXJ0dWFsCiAgICAgICAgICAgIG1ldGhvZHMgYW5kIGRpcmVjdG9yIGNvbnN0cnVjdG9ycy4KCjEwLzA2LzIwMDQ6IG1tYXR1cwoJICAgIEZpeCB0aGUgX19jcGx1c3BsdXMgbWFjcm8sIGFuZCBidWcgMTA0MTE3MC4KCSAgICBOb3cgaXQgaXMgd29ya2luZyBhcyBzdXBwb3NlZCwgaWUsIHlvdSBjYW4gc2FmZWx5IHVzZQoKCSAgICAgICNpZmRlZiBfX2NwbHVzcGx1cwoJICAgICAgLi4uCgkgICAgCgkgICAgYWxsIG92ZXIgc3dpZywgaW5jbHVkaW5nIGluc2lkZSAlZGVmaW5lcyBhbmQgJXsgJX0gYm9kaWVzLgoKCSAgICAKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICBUaGUgb2xkIHRyaWNrIG9mIHVzaW5nCgoJICAgICAgI2lmIF9fY3BsdXNwbHVzCgoJICAgIGRvZXNuJ3Qgd29yayBhbnkgbW9yZS4gU28sIGlmIHlvdSBoYXZlIHlvdXIgb3duIHR5cGVtYXBzCgkgICAgdXNpbmcgdGhhdCBzeW50YXgsIHlvdSB3aWxsIG5lZWQgdG8gbWlncmF0ZSB0aGVtIHRvIHVzZQoJICAgICIjaWZkZWYgX19jcGx1c3BsdXMiLgoKMTAvMDUvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gUmVvcmdhbml6ZSBob3cgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBhbmQgc2hhcmVkCgkgICAgYmV0d2VlbiBtb2R1bGVzLiAgRm9yIGNoaWNrZW4gYW5kIG16c2NoZW1lLCBJIHJlbW92ZWQKCSAgICB0aGUgYWJpbGl0eSB0byB1c2UgcnVudGltZSBsaWJyYXJpZXMsIHdoaWxlIHBlcmwsIHRjbCwgcHl0aG9uLCBhbmQKCSAgICBydWJ5IGRlZmF1bHQgdG8gdXNpbmcgdGhlIG5ldyBtZXRob2QgYnV0IGNhbiBnbyBiYWNrIHRvIHRoZSBvbGQKCSAgICBtZXRob2QgYnkgZGVjbGFyaW5nIFNXSUdfQUxMT1dfUlVOVElNRS4KCgkgICAgLSBsaW5lIDU4MiBpbiBtenNjaGVtZS5jeHggd2FzIGdlbmVyYXRpbmcgYSBzZWdmYXVsdCBvbiAKCSAgICBpbXBvcnRzLm11bHRpY3BwdGVzdCwgc28gSSBmaXhlZCBpdC4KCjEwLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciAlZXh0ZW5kIGFuZCBvdmVybG9hZGVkIHN0YXRpYyBtZXRob2RzIHdpdGggZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMuCgoxMC8wNS8yMDA0OiBtbWF0dXMKCSAgICAtIFtweXRob25dIEZpeCBkaXJlY3RvciArIG1ldGhvZCB3aXRoICdlbXB0eScgdGhyb3csIGllCgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgdmlydHVhbCBpbnQgZm9vKCkgdGhyb3coKTsKCQkgICAgfTsKCQkgICAgCgkgICAgICBvdGhlciBsYW5ndWFnZXMgc2hvdWxkIGFsc28gZWFzeSB0byBmaXgsIGxvb2sgZm9yCgkgICAgICBHZXRhdHRyKG4sInRocm93IikgaW4gcHl0aG9uLmN4eC4KCgkgICAgLSBGaXggZGlyZWN0b3IgKyBkZXN0cnVjdG9yIHdpdGggJ2VtcHR5JyB0aHJvdwoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIHZpcnR1YWwgfkEoKSB0aHJvdygpOwoJCSAgICB9OwoKCSAgICAtIE5vdyBTV0lHX0ZFQVRVUkVTIHBhcnNlIGFsbCBhbmQgdGhlIHNhbWUgIG9wdGlvbnMgeW91CiAgICAgICAgICAgICAgY2FuIHBhc3MgdG8gc3dpZyBpbiB0aGUgY29tbWFuZCBsaW5lLgoJICAgICAgCgkgICAgLSBOZXcgY29tbWFuZCBsaW5lIGZsYWc6IC1mZWF0dXJlcyA8bGlzdD4sIGFzIGluCgoJICAgICAgICBzd2lnIC1mZWF0dXJlcyBhdXRvZG9jPTMsZGlyZWN0b3IKCgkgICAgICBpZSwgYW55IGdsb2JhbCBmZWF0dXJlIGNhbiBiZSBpbml0aWFsaXplZCBmcm9tIHRoZQoJICAgICAgY29tbWFuZCBsaW5lLiBUaGlzIGlzIG1haW5seSBmb3IgdGVzdGluZywgYnV0IHVzZXJzCgkgICAgICBjYW4gYWxzbyB0YWtlIGFkdmFudGFnZSBvZiBpdC4KCjEwLzA0LzIwMDQ6IG1tYXR1cwoJICAgIC0gUHJvcGVybHkgcXVhbGlmeSB0eXBlIGluIHN5bnRheCBhcyAnbG9uZygyKScgb3IgJ0ZvbygpJywKCSAgICAgIHRoaXMgc29sdmUgb2xkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3MsIGFuZCBwcm9iYWJseQoJICAgICAgb3RoZXIgcHJvYmxlbXMgYXJvdW5kLiBIb3dldmVyLCB0aGUgZGVmYXVsdCBhcmcgcHJvYmxlbQoJICAgICAgd2FzIGFsc28gYWxyZWFkeSBzb2x2ZWQgYnkgV2lsbGlhbSAoc2VlIGJlbGxvdykuCgoJICAgIC0gRml4IGZlYXR1cmVfc2V0IGFuZCBmZWF0dXJlX2dldCBtZXRob2RzLiBCZWZvcmUKCSAgICAgIHRoZXkgbG9vayBmcm9tIHBhcnRpY3VsYXIgdG8gZ2VuZXJhbCBhbmQga2VlcCB0aGUgZmlyc3QKCSAgICAgIGZlYXR1cmUgZm91bmQuIFRoaXMgZGlkbid0IHdvcmsgd2VsbCB3aXRoIHRlbXBsYXRlcy4KCSAgICAgIE5vdyB0aGUgbWV0aG9kcyBsb29rIGZyb20gZ2VuZXJhbCB0byBwYXJ0aWN1bGFyLCBhbmQKCSAgICAgIG92ZXJyaWRlIGFueSBmb3VuZCBmZWF0dXJlLgoKICAgICAgICAgICAgLSBQcmV2aW91c2x5IGEgZmVhdHVyZSBjb3VsZCBub3QgYmUgYXBwbGllZCB0byBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgICBvciBkZXN0cnVjdG9ycyB0aGF0IHdlcmVuJ3QgZXhwbGljaXRseSBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIpIEZvbygpICIuLi4iCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSB+Rm9vKCkgIi4uLiIKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC8vIGltcGxpY2l0IEZvbygpIGFuZCB+Rm9vKCkKICAgICAgICAgICAgICAgIH07CgoJICAgIC0gRml4IG1pc3NpbmcgZmVhdHVyZXMgZm9yIGRlZmF1bHQgY29uc3QvZGVzdCwgYnkgcmVhbGx5CgkgICAgICAnY3JlYXRpbmcnIHRoZSBtZXRob2RzIGFuZCBhcHBseWluZyB0aGUgZmVhdHVyZXMuCgoJICAgIC0gRml4IHJldHVybl9jb25zdF92YWx1ZS5pIGNhc2UgYnkgYWRkaW5nIFN3aWdWYWx1ZVdyYXBwZXI8Y29uc3QgVD4KCSAgICAgIHNwZWNpYWxpemF0aW9uLgoKCSAgICAtIEZpeCAlZXh0ZW5kICsgb3ZlcmxvYWQsIGluY2x1ZGluZyBvdmVybG9hZGluZyBhY3R1YWwKICAgICAgICAgICAgICBjbGFzcyBtZXRob2RzLiAKCgkgICAgLSBBZGRpbmcgbW9yZSBjYXNlcyBpbiByZWxhdGVkIGZpbGVzIGluIHRoZSB0ZXN0LXN1aXRlLiAgCgoxMC8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSB3YXkgZGVmYXVsdCBhcmd1bWVudHMgYXJlIHdyYXBwZWQuIFByZXZpb3VzbHkgYSBzaW5nbGUKICAgICAgICAgICAgbWV0aG9kIHdhcyBnZW5lcmF0ZWQgZm9yIGVhY2ggbWV0aG9kIHRoYXQgaGFkIGRlZmF1bHQgYXJndW1lbnRzLiBJZgogICAgICAgICAgICBhIG1ldGhvZCBoYWQgNSBhcmd1bWVudHMsIHNheSwgb2Ygd2hpY2ggMSBoYWQgYSBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHRoZW4gdGhlIGNhbGwgdG8gdGhlIHdyYXBwZWQgbWV0aG9kIHdvdWxkIHBhc3MgNSBhcmd1bWVudHMuIFRoZSBkZWZhdWx0CiAgICAgICAgICAgIHZhbHVlIHdhcyBjb3BpZWQgaW50byB0aGUgd3JhcHBlciBtZXRob2QgYW5kIHVzZWQgaWYgdGhlIHNjcmlwdGluZwogICAgICAgICAgICBsYW5ndWFnZSBwYXNzZWQganVzdCA0IGFyZ3VtZW50cy4gSG93ZXZlciwgdGhpcyB3YXMgZmxhd2VkIGFzIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50IHNvbWV0aW1lcyBkb2VzIG5vdCBoYXZlIGdsb2JhbCBhY2Nlc3MsIGZvciBleGFtcGxlCiAgICAgICAgICAgIFNXSUcgd291bGQgZ2VuZXJhdGUgY29kZSB0aGF0IGNvdWxkbid0IGNvbXBpbGUgd2hlbiB3cmFwcGluZzoKCiAgICAgICAgICAgICAgY2xhc3MgVHJpY2t5IHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsID0gcHJpdmF0ZXZhbHVlKTsKICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCB2YWwgPSBUcmlja3k6OmdldERlZmF1bHQoKSk7CiAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZW51bSB7IHByaXZhdGV2YWx1ZSA9IDIwMCB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbHNvIGJ1Z3MgaW4gcmVzb2x2aW5nIHN5bWJvbHMgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAocHJvYmFibHkgZml4YWJsZSB0aG91Z2gpOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgY2xhc3MgS2xhc3MgewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIEtsYXNzIGNvbnN0cnVjdG9yY2FsbChjb25zdCBLbGFzcyYgayA9IEtsYXNzKCkpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBhcHByb2FjaCBhbHNvIGRvZXMgbm90IHdvcmsgZm9yIHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzIChDIyBhbmQgSmF2YSkKICAgICAgICAgICAgYXMgdGhlc2UgbGFuZ3VhZ2VzIGRvIG5vdCBhbGxvdyBtZXRob2RzIHRvIGhhdmUgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICAgICAgICAgQWx0aG91Z2ggQyMgaGFzIGEgbWVjaGFuaXNtIHRvIHBhc3MgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoZXkKICAgICAgICAgICAgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBhcmUgbW9yZSBsaWtlIHZhcmFyZ3MuCgogICAgICAgICAgICBUaGUgbmV3IGFwcHJvYWNoIHNvbHZlcyB0aGUgYWJvdmUgcHJvYmxlbXMgYW5kIHdyYXBzIG1ldGhvZHMgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyBhcyBpZiB0aGUgbWV0aG9kIHdhcyBvdmVybG9hZGVkLiBTbyBTV0lHIHdpbGwgbm93IHRyZWF0CgogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhcyBpZiBpdCBoYWQgcGFyc2VkOgoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgIHZvaWQgZm9vKCk7CgogICAgICAgICAgICBUaGUgY29kZSBnZW5lcmF0ZWQgaXMgdGhlbiBleGFjdGx5IHRoZSBzYW1lIGFzIGlmIFNXSUcgaGFkIHBhcnNlZCB0aGUgdHdvCiAgICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kcy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgY291bnQgdGhlIGFyZ3VtZW50cyBwYXNzZWQgYW5kIGNhbGwKICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCwganVzdCBsaWtlIG92ZXJsb2FkZWQgbWV0aG9kcy4gQyMgYW5kIEphdmEgYXJlIG5vdyBhYmxlCiAgICAgICAgICAgIHRvIHByb3Blcmx5IHdyYXAgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGJ5IGdlbmVyYXRpbmcgZXh0cmEgbWV0aG9kcywKICAgICAgICAgICAgYWdhaW4gYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZCwgc28gZm9yOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcz0iaGVsbG8iLCBkb3VibGUgZD0xMC4wLCBpbnQgaT0wKTsKCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJveHkgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQsIGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzKTsKICAgICAgICAgICAgICB2b2lkIGJhcigpOwoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBjb21lcyB3aXRoIGEgY291cGxlIG9mIG1pbm9yIGtub2NrIG9uIGVmZmVjdHMuCgogICAgICAgICAgICAxKSBTV0lHIHN1cHBvcnQgZm9yIGRlZmF1bHQgYXJndW1lbnRzIGZvciBDIChub3QgQysrKSBjb2RlIG5vIGxvbmdlciB3b3Jrcy4KICAgICAgICAgICAgUHJldmlvdXNseSB5b3UgY291bGQgaGF2ZSB0aGlzIGludGVyZmFjZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhbmQgY2FsbCB0aGUgd3JhcHBlZCBtZXRob2QgZnJvbSBhIHNjcmlwdGluZyBsYW5ndWFnZSBhbmQgcGFzcyBubyBhcmd1bWVudHMKICAgICAgICAgICAgd2hlcmV1cG9uIHRoZSBkZWZhdWx0IG9mIDAgd2FzIHVzZWQuIFlvdSBjYW4gZ2V0IHRoZSBzYW1lIGJlaGF2aW91ciBmb3IgQwogICAgICAgICAgICBjb2RlIGJ5IHVzaW5nIHRoZSAiZGVmYXVsdCIgdHlwZW1hcDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoZGVmYXVsdCkgaW50IHZhbCAiJDEgPSAwOyI7CiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwoKICAgICAgICAgICAgb3IgeW91IGNvdWxkIG9mIGNvdXJzZSBjb21waWxlIHlvdXIgY29kZSBhcyBDKysgaWYgeW91IHdhbnQgQysrIGZlYXR1cmVzIDopIDoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIEEgY291cGxlIG9mIFNXSUcncyBsaWJyYXJpZXMgdXNlZCB0aGlzIEMgZXh0ZW5zaW9uIGFuZCB0aGVzZSBoYXZlIGJlZW4gbW9kaWZpZWQKICAgICAgICAgICAgdG8gdXNlIHRoZSAiZGVmYXVsdCIgdHlwZW1hcC4gVGhlICJkZWZhdWx0IiB0eXBlbWFwIGlzIHRodXMgdW5jaGFuZ2VkIChhbmQgc3RpbGwKICAgICAgICAgICAgaXMgbm90IGFuZCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkIGJ5IEMjIGFuZCBKYXZhLCBhbmQgaXMgbGlrZWx5IHRvIHJlbWFpbiBzbykuCgoKICAgICAgICAgICAgMikgQWxsIGZlYXR1cmVzICglZmVhdHVyZSwgJXJlbmFtZSwgJWlnbm9yZSBldGMpIG5vIGxvbmdlciB3b3JrIGFzIGlmIHRoZSBtZXRob2QKICAgICAgICAgICAgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBpcyBqdXN0IG9uZSBtZXRob2QuIEZvciBleGFtcGxlLCBwcmV2aW91c2x5CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CgogICAgICAgICAgICB3b3VsZCBoYXZlIGlnbm9yZWQgdGhlIG1ldGhvZCBjb21wbGV0ZWx5LiBOb3cgaXQgd2lsbCBvbmx5IGlnbm9yZSBmb28oaW50KSBidXQKICAgICAgICAgICAgbm90IHRoZSBleHRyYSBmb28oKSBtZXRob2QuIEluc3RlYWQgdXNlOgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbzsKCiAgICAgICAgICAgIHRvIGlnbm9yZSB0aGVtIGFsbC4gb3IKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICAlaWdub3JlIGZvbygpOwoKICAgICAgICAgICAgVGhpcyBvZiBjb3Vyc2UgYWxsb3dzIG9uZSB0byBmaW5lIHR1bmUgdGhlIHdyYXBwaW5nLCBmb3IgZXhhbXBsZSBvbmUgY291bGQgdXNlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGZvb2ludCkgZm9vKGludCk7CiAgICAgICAgICAgICAgJXJlbmFtZShmb29kZWZhdWx0cykgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFuZCBjYWxsIHRoZW0gZnJvbSBhbnkgbGFuZ3VhZ2UgbGlrZSBzbzoKCiAgICAgICAgICAgICAgZm9vaW50KDIwMCkKICAgICAgICAgICAgICBmb29kZWZhdWx0cygpCgogICAgICAgICAgICBvciBmb3IgZXhhbXBsZSBpZ25vcmUgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kLCBzbyB0aGUgZGVmYXVsdHMgY2Fubm90IGJlIHVzZWQ6CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEwLzIvMjAwNDogbW1hdHVzCgkgICBbUHl0aG9uXQoJICAgLSBNb3JlIGNsZWFuaW5nIHVwIGFuZCB1bmlmb3JtYXRpb24gb24gdGhlIFB5dGhvbiBMaWIKCgkgICAtIEFkZGVkIFJvYmluJ3MgZG9jc3RyaW5nIHBhdGNoLCBwbHVzIHNvbWUgZml4ZXMsIHBsdXMKCSAgICAgc29tZSBleHRlbnNpb25zLCBzZWUgYXV0b2RvYy5pIGV4YW1wbGUgaW4gdGhlIHRlc3Qtc3VpdGUsCgkgICAgIGFuZCB0cnkgdXNpbmcgJWZlYXR1cmUoImF1dG9kb2MiLCJleHRlbmRlZCIpLgoJICAgIAoJICAgICBUaGlzIHBhdGNoIGlzIG5vdCBhIGNvbXBsZXRlIHNvbHV0aW9uIGZvciB0aGUKCSAgICAgZG9jdW1lbnRhdGlvbiBwcm9ibGVtLCBqdXN0IGVub3VnaCB0byBpbmZvcm0gcHl0aG9uIGFib3V0CgkgICAgIHRoZSBwYXJhbWV0ZXIgbGlzdC4KCgkgICAgIFRoZSBleHBlY3RlZCBzd2lnIGRvY3VtZW50YXRpb24gc3VwcG9ydCBpcyBmYXIgZmFyIGF3YXkgeWV0LgoJICAgICAKCjEwLzEvMjAwNDogbW1hdHVzCgkgICAtIEZpeCB0aGUgJWNhbGxiYWNrIGZlYXR1cmUgKG9ubHkgdXNlZCBpbiBydWJ5IGFuZCBweXRob24gZXhhbXBsZXMsCgkgICAgIGJ5IG5vdywgYnV0IGl0IHNob3VsZCBiZSBnZW5lcmljKSwgbm93IG1lbWJlciBjYWxsYmFja3MKCSAgICAgYXJlIHdvcmtpbmcgYWdhaW4KCSAgICAgCgkgICAtIEZpeCB3cmFwcGluZyBvZiBmdW5jdGlvbnMgcG9pbnRlcnMgbGlrZQoKCQkgc3RkOjpvc3RyZWFtJiBzdGQ6OmVuZGwoc3RkOjpvc3RyZWFtJik7CgoJICAgICBpZSwgdGhlIG9uZXMgdGhhdCByZXR1cm4gcmVmZXJlbmNlcyBvciBlbnVtcy4KCSAKCSAgIFtQeXRob25dIEFkZCB0aGUgJXB5dGhvbmNhbGxiYWNrIGRpcmVjdGl2ZSwgd2hpY2ggaXMgCgkgICBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mICVjYWxsYmFjaywgaWUsCgoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgZm9vOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFyOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFybTsKCgkgICAgIGludCBmb28oaW50IGEpIHsKCSAgICAgICAgIHJldHVybiBhOwoJICAgICB9CiAgCgkgICAgIHN0cnVjdCBBIAoJICAgICB7CgkgICAgICAgc3RhdGljIGludCBiYXIoaW50IGEpOwoJICAgICAgIGludCBiYXJtKGludCBhKTsKCgkgICAgIH07CgogICAgICAgICAgICAgaW50IGZvb2JhcihpbnQgYSwgaW50ICgqcGYpKGludCBhKSk7CgoJICAgaW4gcHl0aG9uIHlvdSBjYW4gdXNlCgogICAgICAgICAgICAgZm9vKDIpCgkgICAgIGZvb2JhcigyLGZvbykKICAgICAgICAgICAgIEEuYmFyKDIpCgkgICAgIGZvb2JhcigyLEEuYmFyKQogICAgICAgICAgCiAgICAgICAgICAgaWUsIG5vIGFkZGl0aW9uYWwgcG9pbnRlciBlbGVtZW50cyBhcmUgY3JlYXRlZCwgYW5kCgkgICB0aGUgb3JpZ2luYWwgJ2ZvbycgYW5kICdBLmJhcicgY2FuIGJlIHVzZWQgYXMgcGFyYW1ldGVycy4KCgkgICBJbiB0aGUgY2FzZSBvZiBtZW1iZXIgZnVjbnRpb24gaG93ZXZlciwgc3RpbGwgeW91IG5lZWQKCSAgIHRvIHVzZSB0aGUgc3BlY2lhbCB2YXJpYWJsZSBDbGFzczo6PGZuY19uYW1lPl9jYl9wdHIsIGllOgoKIAkgICAgIGZvb2Jhcm0oMywgYSwgQS5iYXJtX2NiX3B0cikKCSAgIAoJICAgd2Ugd2lsbCB0cnkgdG8gZml4IHRoaXMgc2l0dWF0aW9uIGFsc28sIGJ1dCBsYXRlci4gIAoKCSAgIFtQeXRob25dIEFkZCBtb3JlIGVsZW1lbnRzIGZyb20gdGhlIFNUTCBsaWJyYXJ5LCBub3cKCSAgIHlvdSBjYW4gdXNlCgoJICAgICBpbXBvcnQgc3RkCgkgICAgIHN0ZC5jb3V0IDw8ICJoZWxsbyAiIDw8IDEyMyA8PCBzdGQuZW5kbAoKCSAgIFtQeXRob25dIEZpeCBpbi9vdXQgcmV0dXJuIG1lY2hhbmlzbSwgbm93IHN3aWcgd2lsbCBiZWhhdmUKCSAgIGFzIDEuMy4yMSBidXQgdXNpbmcgYSBweXRob24gbGlzdCB3aGVuIG5lZWRlZC4gVGhlIHByb2JsZW0KCSAgIGlzIHRoYXQgdGhlIHR5cGVzIHN0ZDo6cGFpcixzdGQ6OnZlY3RvcixldGMsIHVzZSB0dXBsZXMsCgkgICBhbmQgdGhleSBpbnRlcmZlciB3aXRoIHRoZSBwcmV2aW91cyBpbm91dCB0dXBsZSB0eXBlLgoKCSAgIEJ5IHVzaW5nIGxpc3RzIHdlIHNvbHZlIHRoZSBjb25mbGljdHMsIHN3aWcgYWN0cyBhcyBiZWZvcmUsCgkgICBidXQgcmV0dXJucyBhIGxpc3Qgd2hlbiBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciBhcmUgdXNpbmcKCSAgIHRoZSBPVVQgdHlwZW1hcC4gU2VlIHRoZSBuZXcgaW5vdXQuaSBleGFtcGxlIGluIHRoZQoJICAgdGVzdC1zdWl0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJCSAgIAogICAgICAgICAgIFtQeXRob25dIE11Y2ggYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciBiYWQgYXJndW1lbnRzLCBub3cKCSAgIHlvdSBhbHdheXMgZ2V0IHRoZSBhcmd1bWVudCBudW1iZXIgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgoKMDkvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBCaWxsIENsYXJrZSAtCiAgICAgICAgICAgIDEpIFdhcm5pbmcgZW1pdHRlZCB3aGVuIC1pbXBvcnRhbGwgYW5kIC1pbmNsdWRlYWxsIGlzIHVzZWQgdG9nZXRoZXIsCiAgICAgICAgICAgICAgIHdpdGggLWluY2x1ZGVhbGwgdGFraW5nIHByZWNlZGVuY2UuCiAgICAgICAgICAgIDIpIEVuc3VyZSBTV0lHSU1QT1JURUQgaXMgYWx3YXlzIGRlZmluZWQgd2hlbiBhIGZpbGUgaXMgYmVpbmcKICAgICAgICAgICAgICAgaW1wb3J0ZWQgd2l0aCAlaW1wb3J0LiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgU1dJR0lNUE9SVCwKICAgICAgICAgICAgICAgd2hpY2ggZ2V0cyBkZWZpbmVkIGluIGFsbCBnZW5lcmF0ZWQgd3JhcHBlciBmaWxlcy4KCjA5LzI2LzIwMDQ6IG1tYXR1cwoKCSAgICAtIGFkZCAlZmVhdHVyZSgiZXhjZXB0aW9uY2xhc3MiKSB0byBpZGVudGlmeSBhIGNsYXNzIHVzZWQKCSAgICAgIGFzIGV4Y2VwdGlvbi4gQmVmb3JlIHN3aWcgaWRlbnRpZmllZCBhbmQgbWFya2VkIGEgY2xhc3MKCSAgICAgIHVzaW5nIHRoZSAiY3BsdXM6ZXhjZXB0aW9uY2xhc3MiIGF0dHJpYnV0ZS4gSG93ZXZlciwgdGhlCgkgICAgICBjbGFzcyBuZWVkZWQgdG8gYXBwZWFyIG9uIGFuIHRocm93KCkgc3RhdGVtZW50LiAgTm93CgkgICAgICBzd2lnIGtlZXBzIHRyeWluZyB0byBpZGVudGlmeSB0aGUgZXhjZXB0aW9uIGNsYXNzZXMsIGFzCgkgICAgICBiZWZvcmUsIGJ1dCBpdCBhbHNvIGFsbG93cyB0aGUgdXNlciB0byBtYXJrIGEgY2xhc3MgYnkKCSAgICAgIHVzaW5nIHRoZSAlZmVhdHVyZSBleHBsaWNpdGx5LiAobW9zdGx5IHJlbGV2YW50IGZvcgoJICAgICAgcHl0aG9uIGFuZCBjaGlja2VuKQoKCSAgICBbUHl0aG9uXQoKCSAgICAtIGZpeCAtbW9kZXJuIG9wdGlvbiArIGV4Y2VwdGlvbnMsIHdoaWNoIG1peCBvbGQgY2xhc3MKCSAgICAgIHN0eWxlIHdpdGggdGhlIG5ldyBvbmUuIFNvLCB3ZSBhbHdheXMgbmVlZCB0byBlbWl0CgkgICAgICB0aGUgIm5vbm1vZGVybiIgcHl0aG9uIGNvZGUuCgoJICAgIC0gYWRkIHRoZSAicHl0aG9uOm5vbmR5bmFtaWMiIGZlYXR1cmUgYW5kIGl0cyBoYW5kbGVyCgoJICAgICAgbm93IGlmIHlvdSBoYXZlCgkgICAgICAKCSAgICAgICVweXRob25ub25keW5hbWljIEE7CgkgICAgICAKCSAgICAgIHN0cnVjdCBBIHsKCSAgICAgICBpbnQgYTsKCSAgICAgICBpbnQgYjsKCSAgICAgIH07CgoJICAgICAgdGhlbiwgaW4gdGhlIHB5dGhvbiBzaWRlCgkgICAgICAKCSAgICAgIGFhID0gQSgpCgkgICAgICAKCSAgICAgIGFhLmEgPSAxICMgb2sKCSAgICAgIGFhLmIgPSAyICMgb2sKCSAgICAgIGFhLmMgPSAzICMgZXJyb3IsIHRoZSBjbGFzcyBjYW4gbm90IGJlIGV4dGVuZGVkIGR5bmFtaWNhbGx5LgoKCSAgICAKCSAgICBTaW5jZSB0aGlzIGlzIGEgZmVhdHVyZSwgeW91IGNhbiB1c2UKCgkgICAgICAlcHl0aG9ubm9uZHluYW1pYzsKCiAgICAgICAgICAgIG9yIAoKCSAgICAgICVweXRob25keW5hbWljOyBbIE5vdGU6ICVweXRob25keW5hbWljIHNpbmNlIGRlcHJlY2F0ZWQgXQogICAKCSAgICB0byBmb3JjZSBhbGwgdGhlIHdyYXBwZWQgY2xhc3NlcyB0byBiZSAibm9uZHluYW1pYyIgb25lcy4KCgkgICAgVGhlIGRlZmF1bHQsIGFzIGluIHJlZ3VsYXIgcHl0aG9uLCBpcyB0aGF0IGFsbCB0aGUgd3JhcHBlZAoJICAgIGNsYXNzZXMgYXJlIGR5bmFtaWNzLiBTbywgY2FyZWZ1bCB3aXRoIHlvdXIgc3BlbGxpbmcuCgowOS8xNC8yMDA0OiBtbWF0dXMgCgkgICAgLSBTdXBwb3J0IHRoZSAtSS0gb3B0aW9uLgoKCSAgICAtIERpZmZlcmVudGlhdGUgYmV0d2VlbiAlaW5jbHVkZSA8ZmlsZT4gYW5kICVpbmNsdWRlICJmaWxlIi4KCSAgICAgIFRoaXMgZml4IHNldmVyYWwgY29ybmVyIGNhc2VzLgoKCSAgICAKCSAgICBbUHl0aG9uXSBTZXZlcmFsIHBhdGNoZXM6CgoJICAgIC0gTm9ybWFsaXplIHRoZSBMaWIgZmlsZSBuYW1lczogCgkJKi5zd2cgaW50ZXJuYWwgZmlsZXMsIAoJCSouaSAgIHVzZXIgZmlsZXMuCgoJICAgIC0gRml4IENoYXJbQU5ZXSB0eXBlbWFwcywgc28gdGhleSBhbHNvIGRlbGV0ZSBhbnkgZXh0cmEgJ1wwJyBjaGFycywKCSAgICAgIG5vdyB0aGV5IGJlaGF2ZSBhcyBiZWZvcmUgKDEuMy4yMSkuIFN0aWxsLCB5b3UgY2FuIHVzZQoJICAgICAgdGhlIFNXSUdfUFJFU0VSVkVfQ0FSUkFZX1NJWkUgbWFjcm8gaWYgeW91IG5lZWQgdG8KCSAgICAgIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBzaXplIChzZWUgcHlzdHJiYXNlLnN3ZykuCgoJICAgIC0gQWRkIHRoZSBDaGFyIEZJWFNJWkVbQU5ZXSB0eXBlbWFwcywgdG8gcHJlc2VydmUgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgQyBhcnJheSBzaXplcyAoc2VlIGFib3ZlKS4gVGhvdWdoLCB5b3UgY2FuJ3QKICAgICAgICAgICAgICB1c2UgdGhlbSB5ZXQgc2luY2UgJWFwcGx5IGFuZCBhcnJheXMgYXJlIG5vdCB3b3JraW5nCiAgICAgICAgICAgICAgdG9nZXRoZXIuCgogICAgICAgICAgICAtIEFkZCBweWZyYWdtZW50cy5zd2csIG5vdyB0aGUgdXNlciBjYW4gYWRkIGZyYWdtZW50cwoJICAgICAgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb25lcy4KCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gQmlsbCBDbGFya2Ugd2hpY2ggZml4ZXMgc3B1cmlvdXMgcHJlcHJvY2Vzc29yIGJ1ZyB3aGljaAogICAgICAgICAgICBzaG93cyBvbiBTb2xhcmlzIGFuZCBnY2MsIGVnOgogICAgICAgICAgICAgICAgV2FybmluZygyMDIpOiBDb3VsZCBub3QgZXZhbHVhdGUgJyFkZWZpbmVkKFNXSUdKQVZBKSAmJgogICAgICAgICAgICAgICAgIShkZWZpbmVkKFNXSUdDU0hBUlApJwogICAgICAgICAgICBBbHNvIGZpeGVzIGEgYnVnIHdoZXJlICcjaWYgImEiID09ICJiIiA9PSAxJyB3b3VsZG4ndCBoYXZlIHdvcmtlZCAKCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlc3RvcmVkIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIGZvciB0aGUgdGVzdC1zdWl0ZS4gUGF0Y2ggZnJvbQogICAgICAgICAgICBCaWxsIENsYXJrZS4KCjA5LzA2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBtaXNzaW5nIHJ1bnRpbWUuZHNwIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlcyBmb3IgdGhlCiAgICAgICAgICAgIGltcG9ydCBleGFtcGxlcyB0byB3b3JrLgoKClZlcnNpb24gMS4zLjIyIChTZXB0ZW1iZXIgNCwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDkvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHN3aWcubTQgbWFjcm8gZm9yIHVzZSB3aXRoIHRoZSBBdXRvY29uZi9BdXRvbWFrZS9MaWJ0b29sIGhhcwogICAgICAgICAgICBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vIGxvbmdlciBpbnN0YWxsZWQuIFBsZWFzZSB1c2UgdGhlIG5ldyBhbmQgYmV0dGVyCiAgICAgICAgICAgIG1haW50YWluZWQgdmVyc2lvbiBkZXJpdmVkIGZyb20gc3dpZy5tNCBpbiB0aGUgQXV0b2NvbmYgbWFjcm8gYXJjaGl2ZS4KICAgICAgICAgICAgU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfcGtnX3N3aWcuaHRtbCBhbmQKICAgICAgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY19weXRob25fZGV2ZWwuaHRtbC4KCjA5LzAxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBsaWVkIHBhdGNoICMxMDE5NjY5IGZyb20gQ2hyaXN0b3BoIEZsYW1tLiBBZGRzIHN1cHBvcnQKICAgICAgICAgICAgZm9yICVmZWF0dXJlKCJzaGFkb3ciKSBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgd29ya3MgaW4gUHl0aG9uLiBUaGlzCiAgICAgICAgICAgIGVuYWJsZXMgb25lIHRvIG92ZXJyaWRlIHRoZSBnZW5lcmF0ZWQgc2hhZG93L3Byb3h5IG1ldGhvZHMsIGluY2x1ZGluZwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgLyogTGV0J3MgbWFrZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNsYXNzIFNxdWFyZSBtb3JlIHZlcmJvc2UgKi8KCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpIFNxdWFyZShkb3VibGUgdykKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgc3ViIG5ldyB7CiAgICAgICAgICAgICAgICAgIG15ICRwa2cgPSBzaGlmdDsKICAgICAgICAgICAgICAgICAgbXkgJHNlbGYgPSBleGFtcGxlYzo6bmV3X1NxdWFyZShAXyk7CiAgICAgICAgICAgICAgICAgIHByaW50IFNUREVSUiAiQ29uc3RydWN0ZWQgYW4gQHtbcmVmKCRzZWxmKV19XG4iOwogICAgICAgICAgICAgICAgICBibGVzcyAkc2VsZiwgJHBrZyBpZiBkZWZpbmVkKCRzZWxmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICBjbGFzcyBTcXVhcmUgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIFNxdWFyZShkb3VibGUgdyk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKMDgvMzEvMjAwNDogbW1hdHVzIAoJICAgIFtQeXRob25dIEluY29tcGF0aWJpbGl0eSByZXBvcnRlZCBieSBCaWxsIENsYXJrZSAobGxpYkBjb21wdXRlci5vcmcpOgoJICAgIAoJICAgIElmIHlvdSBhcmUgdXNpbmcgU3VuIFN0dWRpbyA4IChhbmQgcG9zc2libHkgZWFybGllcgoJICAgIHZlcnNpb25zKSB0byBjb21waWxlIHRoZSBvdXRwdXQgcHJvZHVjZWQgYnkgc3dpZwoJICAgIDEuMy4yMnJjMSwgYW5kIHlvdSBhcmUgdXNpbmcgQysrIGFuZCBTVEwgdGVtcGxhdGVzIHRoZW4KCSAgICB5b3UgbmVlZCB0byB1c2UgZWl0aGVyICItcnVudGltZSIgb3IgIi1ub3J1bnRpbWUiLiAgSWYgeW91CgkgICAgdXNlIG5laXRoZXIgb2YgdGhlc2Ugb3B0aW9ucyB0aGVuIHlvdSB3aWxsIHByb2JhYmx5IGdldAoJICAgIGNvbXBpbGVyIGVycm9ycyB3aGVuIHRyeWluZyB0byBjb21waWxlIHRoZSB3cmFwcGVyIGZpbGU7CgkgICAgdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBsaWtlIHRoaXM6IFRoZSBuYW1lCgkgICAgU1dJR19QeXRob25fQ29udmVydFB0clsuLi5dIGlzIHVudXNhYmxlIGluIHN0YXRpYwoJICAgIHN3aWdweTo6dHJhaXRzX2FzcHRyWy4uLl0gIElmIHlvdSBnZXQgdGhpcyBlcnJvciBtZXNzYWdlLAoJICAgIHlvdSBuZWVkIHRvIHJlZ2VuZXJhdGUgeW91ciB3cmFwcGVyIGZpbGUgdXNpbmcgJ3N3aWcKCSAgICAtcnVudGltZScgb3IgJ3N3aWcgLW5vcnVudGltZScuCgoJICAgIFlvdSBzaG91bGRuJ3QgZ2V0IHRoaXMgcHJvYmxlbSB3aXRoIFN1biBTdHVkaW8gOS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJICAgIAowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbGllZCAjOTMyMzMzIGZyb20gSWtlZ2FtaSBUc3V0b211LiBGaXhlcyBsb25nIGxvbmcgKk9VVFBVVAogICAgICAgICAgICBhbmQgdW5zaWduZWQgbG9uZyBsb25nICpPVVRQVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaS4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGxpZWQgcGF0Y2ggIzg1NzM0NCBmcm9tIEFydCBZZXJrZXMuIFdvcmthcm91bmQgZm9yIGF1dG9jb25mIGJ1ZyB3aGVuCiAgICAgICAgICAgIHJ1bm5pbmcgJ21ha2UgaW5zdGFsbCcuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGFydCBvZiBwYXRjaCAjOTgyNzUzIGFwcGxpZWQuIFRoaXMgaW1wbGVtZW50cyBhICVwZXJsY29kZSBkaXJlY3RpdmUuCiAgICAgICAgICAgIEl0IGFsbG93cyBvbmUgdG8gYWRkIFBlcmwgY29kZSB0byB0aGUgZ2VuZXJhdGVkIC5wbSBmaWxlLiBXb3JrcyB0aGUgc2FtZSAKICAgICAgICAgICAgYXMgJXB5dGhvbmNvZGUuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyB2aXJ0dWFsIG1ldGhvZHMgd2l0aCBleGNlcHRpb24KICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgdGhhdCB3ZXJlIG5vdCBzaW1wbGUgdHlwZXMuIFByZXZpb3VzbHkgY29kZSB3YXMgZ2VuZXJhdGVkIHRoYXQKICAgICAgICAgICAgZGlkbid0IGNvbXBpbGUsIGZvciBleGFtcGxlIHdoZW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHdhcyBhIHBvaW50ZXIuCgowOC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXAgZml4IGZvciBtZXRob2RzIHRoYXQgcmV0dXJuIGNoYXIgKi4gVGhlIENMUiB3b3VsZCBpbmNvcnJlY3RseQogICAgICAgICAgICBkZWxldGUgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGNoYXIgKi4gQWxzbyBhcHBsaWVkIHRoZSBzYW1lIGNvcnJlY3Rpb24gdG8KICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkgdHlwZW1hcHMuCgowOC8yNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgLWZtaWNyb3NvZnQgZXJyb3Ivd2FybmluZyBtZXNzYWdlIGRpc3BsYXk6IAogICAgICAgICAgICAtIEVuZCBvZiBmaWxlIChFT0YpIHdhcm5pbmcgbWVzc2FnZXMgbm90IGRpc3BsYXlpbmcgaW4gY29ycmVjdCBmb3JtYXQKICAgICAgICAgICAgLSBTb21lIG1lc3NhZ2VzIGNvbnRhaW5pbmcgYSBmaWxlIHBhdGggd2VyZSBkaXNwbGF5aW5nIGEgZG91YmxlIGJhY2tzbGFzaAogICAgICAgICAgICAgIGluc3RlYWQgb2YgYSBzaW5nbGUgYmFja3NsYXNoCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBsaWVkIHBhdGNoICMxMDExNjA0IHN1Ym1pdHRlZCBieSBDaGFybGVzIFNjaHdpZXRlcnMuIEZpeCBmb3IgNjQgYml0IHRjbAogICAgICAgICAgICBpbnRlcnByZXRlcnMuCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGJ1ZyAjODc1NTgzIC0gZW51bSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBwcmV2aW91c2x5IGdhdmUgYSBzeW50YXggZXJyb3IuCgowOC8yMy8yMDA0OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIFVzZSB0eXBlbWFwcyAiZmZpdHlwZSIgYW5kICJsaXNwdHlwZSIgdG8gZGV0ZXJtaW5lIHRoZSBGRkkgdHlwZQoJICAgIHNwZWNpZmllcnMgZnJvbSB0aGUgQyB0eXBlLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSwgZm9yIGluc3RhbmNlLCB0byBjb250cm9sCgkgICAgd2hldGhlciBhIEMgImNoYXIiIGFyZ3VtZW50IHRha2VzIGEgTGlzcCBjaGFyYWN0ZXIgb3IgYSBMaXNwIGludGVnZXIgdmFsdWUuCgkgICAgVGhlIGRlZmF1bHQgKHRha2luZyBMaXNwIGNoYXJhY3RlcnMpIGlzIGRvbmUgYnkgdGhlc2UgYnVpbHQtaW4gdHlwZW1hcHM6CgkgICAgICAldHlwZW1hcChmZml0eXBlKSBjaGFyICI6Y2hhciI7ICV0eXBlbWFwKGxpc3B0eXBlKSBjaGFyICJjaGFyYWN0ZXIiOwoJICAgIElmIGNoYXIgbWVhbnMgYW4gaW50ZWdlciBpbnN0ZWFkLCB1c2UgdGhlc2UgdHlwZW1hcHM6CgkgICAgICAldHlwZW1hcChmZml0eXBlKSBjaGFyICI6Y2hhciI7ICV0eXBlbWFwKGxpc3B0eXBlKSBjaGFyICJpbnRlZ2VyIjsKCjA4LzIyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFzIGRpc2N1c3NlZCBpbiBidWcgIzc3MjQ1MywgdGhlIFNXSUcgbGlicmFyeSBkaXJlY3RvcnkgaXMgbm93IGluc3RhbGxlZAogICAgICAgICAgICBpbnRvIGEgZGlmZmVyZW50IGRlZmF1bHQgZGlyZWN0b3J5LiBUaGUgbGlicmFyeSB1c2VkIHRvIGJlIGluc3RhbGxlZCB0bwogICAgICAgICAgICAvdXNyL2xvY2FsL2xpYi9zd2lnMS4zLiBJdCBpcyBub3cgaW4gdGhlIG1vcmUgdXN1YWwgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50CiAgICAgICAgICAgIGRpcmVjdG9yeSBhbmQgSSBoYXZlIGFkZGl0aW9uYWxseSB1c2VkIGEgdmVyc2lvbiBzcGVjaWZpYyBzdWJkaXJlY3RvcnkgYXMKICAgICAgICAgICAgdGhlIGxpYnJhcnkgd2lsbCByYXJlbHkgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIFNXSUcuIFRoaXMgcmVsZWFzZQogICAgICAgICAgICB3aWxsIHRodXMgdXNlIC91c3IvbG9jYWwvc2hhcmUvc3dpZy8xLjMuMjIgYnkgZGVmYXVsdCwgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIHRhaWxvcmVkIGFzIGJlZm9yZSB1c2luZyAnLi9jb25maWd1cmUgLS1zd2lnbGliZGlyJy4KCjA4LzE3LzIwMDQ6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIEFkZCBzdXBwb3J0IHRvIGNyZWF0ZSBuYXRpdmUgTXpTY2hlbWUgc3RydWN0dXJlcyBmcm9tIEMgc3RydWN0dXJlcy4KCSAgICBUbyBjb252ZXJ0IGEgQyBzdHJ1Y3R1cmUgdG8gYW4gTXpTY2hlbWUgc3RydWN0dXJlLCB1c2UgdGhlIG5ldyBydW50aW1lIG1hY3JvCgkgICAgU1dJR19OZXdTdHJ1Y3RGcm9tUHRyIGluIGEgdHlwZW1hcC4gIFBhdGNoIGZyb20gRG1pdHJpeSBaYXZpbi4gCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjODM3NzE1IGZyb20gQmVuIFJlc2VyIHRvIGNvcnJlY3RseSBkZXRlY3QgUHl0aG9uIGxpYiBkaXJlY3RvcnkKICAgICAgICAgICAgb24gNjQgYml0IHN5c3RlbXMuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgYW5kIEphdmFdIFByZXZlbnQgbWVtb3J5IGxlYWtzIGluIHRoZSBjYXNlIG9mIGVhcmx5IHJldHVybgogICAgICAgICAgICBmcm9tIHdyYXBwZXIgbWV0aG9kcyB1c2luZyBjb25zdCBzdGQ6OnN0cmluZyAmIHBhcmFtZXRlcnMuIE1vZGlmaWVkCiAgICAgICAgICAgIE1hcmsgVHJhdWR0IHBhdGNoICM5NTE1NjUuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBCdWcgIzk0Mzc4MyB3aXRoIHBhdGNoIGZpeGVzIHBocCBjaGFyICogb3V0IHR5cGVtYXAgTlVMTCB2YWx1ZXMuCgowOC8wMy8yMDA0OiBBaG1vbiBEYW5jeSAgPGRhbmN5QGRhbmN5PgoKICAgICAgICAgICAgW2FsbGVncm9jbF0gQWRkaXRpb25hbCBjYXNlIG1vZGUgZml4ZXMuICBBbHNvLCBtYWtlIHN1cmUKCSAgICBmb3JlaWduIHR5cGVzIGFyZSBleHBvcnRlZC4KCjA3LzI0LzIwMDQ6IG1rb2VwcGUgCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIFNXSUcgbW9kdWxlcyBub3cgZXhjaGFuZ2UgdGhlaXIgcG9pbnRlciB0eXBlCgkgICAgaW5mb3JtYXRpb24gdmlhIHRoZSBHdWlsZSBpbnRlcnByZXRlci4gIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYnVpbGQgYQoJICAgIHJ1bnRpbWUgbGlicmFyeSBvciB0byB1c2UgLW5vcnVudGltZSBhbmQgLXJ1bnRpbWUgZXRjLgoJICAgIAoJICAgIFRoZSBtb2R1bGUgKFN3aWcgc3dpZ3J1bikgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gdGhlIGNoYW5nZSBvZiAwNS8xNy8yMDA0IGlzCgkgICAgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgYnVpbHQuICBJZiB5b3UgbmVlZCBpdCwgcnVuIFNXSUcgb24gdGhlIGludGVyZmFjZSBmaWxlCgkgICAgc3dpZ3J1bi5pLiAKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQnVnICM5MTc2MDEgTWFwcGluZyBDKysgYm9vbCBmaXggZnJvbSBNYXJrIFRyYXVkdAoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUlBNIGZpeGVzIGZvciBsYXRlc3QgQ1ZTIHZlcnNpb24gaW5jbHVkaW5nIHJlbW92YWwgb2YgcnVudGltZQogICAgICAgICAgICBsaWJyYXJ5LgoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzkwODk1NSBmcm9tIFJvYmVydCBIIERlIFZyaWVzLgogICAgICAgICAgICBSUE0gZmlsZSBnZW5lcmF0aW9uIGZpeCBmb3IgRmVkb3JlIENvcmUgMSBhbmQgUmVkaGF0IEFTMi4xLgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzg2NDY4OSBmcm9tIFJvYmluIER1bm46CgogICAgICAgICAgICBUaGlzIHBhdGNoIGNvcnJlY3RzIHR3byBwcm9ibGVtcyBpbiB0aGUgWE1MIG91dHB1dCBvZiBTV0lHOgogICAgICAgICAgICAgCiAgICAgICAgICAgICAgMS4gVGhlcmUgd2VyZSBvZnRlbiBleHRyYSAnLz5cbicgaW4gdGhlIG91dHB1dC4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAyLiB2YWx1ZSBhdHRyaWJ1dGVzIHdlcmUgb3V0cHV0IHdpdGggJ1xuJyBpbiB0aGVtIGJ1dAogICAgICAgICAgICAgIHNpbmNlIHRoYXQgaXMgbm90IHRlY2huaWNhbGx5IGxlZ2FsIG1vc3QgKGFsbD8pIFhNTAogICAgICAgICAgICAgIHBhcnNlcnMgd2lsbCBzdHJpcCB0aGVtIG91dC4gUmVwbGFjaW5nIHRoZSAnXG4nIHdpdGgKICAgICAgICAgICAgICB0aGUgJyYjMTA7JyBlbnRpdHkgcmVmZXJlbmNlIHNvbHZlcyB0aGlzIGFzIHRoYXQgaXMKICAgICAgICAgICAgICBsZWdhbCBhbmQgWE1MIHBhcnNlcnMgd2lsbCBjb252ZXJ0IGl0IHRvIGEgJ1xuJyB3aGVuCiAgICAgICAgICAgICAgcmVhZGluZyB0aGUgdmFsdWVzIGJhY2sgaW4uCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgVGhpcyBwYXRjaCBhbHNvIGFkZHMgYSBuZXcgZ2xvYmFsIGNvbW1hbmQgbGluZSBvcHRpb24KICAgICAgICAgICAgICB0aGF0IHdpbGwgYWxsb3cgdGhlIHBhcnNlIHRyZWUgdG8gYmUgd3JpdHRlbiBvdXQgaW4gWE1MCiAgICAgICAgICAgICAgKmFmdGVyKiBzb21lIG90aGVyIGxhbmd1YWdlIG1vZHVsZSBoYXMgYmVlbiBydW4sIGluCiAgICAgICAgICAgICAgb3JkZXIgdG8gYmUgYWJsZSB0byBnZXQgZXh0cmEgaW5mbyB0aGF0IHRoZSBsYW5ndWFnZQogICAgICAgICAgICAgIG1vZHVsZSBwdXRzIGluIHRoZSB0cmVlLiBJbiB0aGlzIHdheSB0aGUgWE1MIGlzIGEKICAgICAgICAgICAgICBwb3N0LXByb2Nlc3NlZCB2ZXJzaW9uIG9mIHRoZSB0cmVlIHJhdGhlciB0aGFuIGEKICAgICAgICAgICAgICBwcmUtcHJvY2Vzc2VkIHZlcnNpb24uIAogCiAgICAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbiBpcyAtZHVtcF94bWwgb3IgLXhtbG91dCA8ZmlsZT4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB0byBmaXggdHlwZXNhZmUgZW51bXMgYW5kIHByb3BlciBlbnVtcwogICAgICAgICAgICB3aXRoIGRpcmVjdG9ycy4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEhUTUwgZG9jdW1lbnRhdGlvbiAobWFrZWNoYXAucHkpIGZpbGUgZ2VuZXJhdG9yIG1pc3NpbmcgZW5kIG9mIGxpbmUKICAgICAgICAgICAgcGF0Y2ggIzkwODk1MSBmcm9tIFJvYmVydCBkZSBWcmllcy4KCjA3LzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBkZXByZWNhdGVkIHJ1bnRpbWUgbGlicmFyeSBidWlsZCBoYXMgYmVlbiByZW1vdmVkLiBUaGlzIGFsc28gcmVtb3ZlcwogICAgICAgICAgICB0aGUgZGVwZW5kZW5jeSBvbiBMaWJ0b29sLiBMaWJ0b29sIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBidWlsZCBTV0lHLgogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCAtbGRmbGFncyBTV0lHIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYWxzbyBiZWVuIHJlbW92ZWQuCgogICAgICAgICAgICBUaGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgdGVzdGNhc2VzIHRoYXQgdXNlZCB0aGUgcnVudGltZSBsaWJyYXJ5IGhhdmUKICAgICAgICAgICAgYmVlbiB1cGRhdGVkIHRvIHVzZSB0aGUgcmVwbGFjZW1lbnQgYXBwcm9hY2ggdG8gdXNpbmcgU1dJRyBhY3Jvc3MgCiAgICAgICAgICAgIG11bHRpcGxlIG1vZHVsZXMsIHRoYXQgaXMgdGhleSB1c2UgdGhlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGNvbW1hbmRsaW5lCiAgICAgICAgICAgIG9wdGlvbnMsIHNlZSBNb2R1bGVzLmh0bWwuIEVmZmVjdGl2ZWx5IHRoZXkgYnVpbGQgdGhlaXIgb3duIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyaWVzIHVzaW5nIC1ydW50aW1lLiBUaGUgZXhhbXBsZXMgYXJlIGltcG9ydCBhbmQgaW1wb3J0X3RlbXBsYXRlLgogICAgICAgICAgICBUaGUgdGVzdCBjYXNlcyBhcmUgaW4gdGhlIGltcG9ydHMgYW5kIHRlbXBsYXRlX3R5cGVkZWZfaW1wb3J0IGRpcmVjdG9yaWVzLgoKICAgICAgICAgICAgQW55b25lIHdobyB3YW50cyB0aGUgb3JpZ2luYWwgcnVudGltZSBsaWJyYXJpZXMgY2FuIGVpdGhlciBydW4gdGhlIHRlc3Qtc3VpdGUKICAgICAgICAgICAgb3IgYnVpbGQgdGhlIGV4YW1wbGVzIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYXJlZCBvYmplY3QvRExMIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIHdpdGggdGhlIC1ydW50aW1lIGNvbW1hbmRsaW5lIG9wdGlvbi4gRm9yIGV4YW1wbGUgbGliaW1wb3J0c19ydW50aW1lLnNvCiAgICAgICAgICAgIChQeXRob24gY2FsbHMgaXQgbGliX2ltcG9ydHNfcnVudGltZS5zbykgaXMgZ2VuZXJhdGVkIGFmdGVyIHJ1bm5pbmcgdGhlIAogICAgICAgICAgICAnbWFrZSBpbXBvcnRzLm11bHRpY3BwdGVzdCcgdGVzdGNhc2UgaW4gdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvPGxhbmc+CiAgICAgICAgICAgIGRpcmVjdG9yeS4gT3IgdXNlIGxpYnJ1bnRpbWUuc28gLyBydW50aW1lLmRsbCBhZnRlciBidWlsZGluZyB0aGUgaW1wb3J0CiAgICAgICAgICAgIGV4YW1wbGVzIGluIEV4YW1wbGVzLzxsYW5nPi9pbXBvcnQuCgowNy8wNy8yMDA0OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIENvbnZlcnQgY2hhcmFjdGVyIGFuZCBzdHJpbmcgbGl0ZXJhbHMgaW4gY29uc3RhbnRzIHRvIAoJICAgIENMIHN5bnRheC4gIEZpeCBGRjpERUYtRk9SRUlHTi1DQUxMIGZvciBtaXhlZC1jYXNlIEMgZnVuY3Rpb25zLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE5ldyBmZWF0dXJlIGZvciBKYXZhIGV4Y2VwdGlvbnMgd2l0aCBmb3JtYXQgJWphdmFleGNlcHRpb24oZXhjZXB0aW9uY2xhc3NlcykuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBhIHNsaWdodCBlbmhhbmNlbWVudCB0byAlZXhjZXB0aW9uIGFuZCB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZSAKICAgICAgICAgICAgYWRkaXRpb24gb2YgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgaW50byBhIHRocm93cyBjbGF1c2UuCiAgICAgICAgICAgIFRoZSAnZXhjZXB0aW9uY2xhc3NlcycgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzIHdoaWNoIHdpbGwgYmUKICAgICAgICAgICAgYWRkZWQgdG8gdGhlIGFzc29jaWF0ZWQgcHJveHkgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZS4gVGhlICdleGNlcHRpb25jbGFzc2VzJwogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIGxpa2UgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIGluIHRoZSAndGhyb3dzJyBhdHRyaWJ1dGUgaW4gdGhlCiAgICAgICAgICAgIHR5cGVtYXBzLiBUaGlzIGZlYXR1cmUgc2hvdWxkIGJlIHVzZWQgZm9yIGNvcnJlY3RseSBoYW5kbGluZyBjaGVja2VkIGV4Y2VwdGlvbnMKICAgICAgICAgICAgdGhyb3duIGZyb20gSk5JIGNvZGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlamF2YWV4Y2VwdGlvbigiamF2YS5sYW5nLkV4Y2VwdGlvbiIpIHRocm93RXhjZXB0aW9uICV7CiAgICAgICAgICAgICAgICAuLi4gY29udmVydCBhIHN0ZDo6bG9naWNfZXJyb3IgaW50byBhIGphdmEubGFuZy5FeGNlcHRpb24gdXNpbmcgSk5JIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICAgICAgICAgICAgICB2b2lkIHRocm93RXhjZXB0aW9uKCkgewogICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiTG9naWMgZXJyb3IhIik7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBhIG1ldGhvZCB3aXRoIGEgdGhyb3dzIGNsYXVzZSBpbiB0aGUgbW9kdWxlIGNsYXNzOgoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7IC4uLiB9CgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyAlY3Njb25zdHZhbHVlKHZhbHVlKSBmZWF0dXJlIGRpcmVjdGl2ZSBmb3IgdXNlIHdpdGggY29uc3RhbnRzIGFuZAogICAgICAgICAgICBlbnVtcy4gVGhpcyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgJWphdmFjb25zdHZhbHVlLiBGb3IgQyMsIHRoaXMgZGlyZWN0aXZlCiAgICAgICAgICAgIGlzIHRoZSBvbmx5IHdheSB0aGF0IG9uZSBjYW4gZml4IHdyYXBwaW5nIG9mIEMvQysrIGVudW1zIHdpdGggcHJvcGVyIEMjCiAgICAgICAgICAgIGVudW1zIGlmIHRoZSBlbnVtIGl0ZW0ncyBpbml0aWFsaXNlciBjYW5ub3QgY29tcGlsZSBhcyBDIyBjb2RlLiBUaGlzIGlzCiAgICAgICAgICAgIGJlY2F1c2UgSmF2YSBlbnVtcyBjYW4gdXNlIGEgY2FsbCBpbnRvIEMgY29kZSB0byBpbml0aWFsaXNlIHRoZSBlbnVtIGl0ZW0sCiAgICAgICAgICAgIHdoZXJlYXMgaW4gQyMsIHRoZSBlbnVtIHZhbHVlIG11c3QgYmUgYSBjb21waWxlIHRpbWUgY29uc3RhbnQuIFRoYXQgaXMsCiAgICAgICAgICAgIHVzaW5nICVjc2NvbnN0KDApIGNhbm5vdCBiZSB1c2VkIGluIEMjIHRvIGluaXRpYWxpc2UgdGhlIEMjIGVudW0gaXRlbSB2aWEKICAgICAgICAgICAgYSBQSU5WT0tFIGNhbGwuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTmV3ICVqYXZhY29uc3R2YWx1ZSh2YWx1ZSkgZmVhdHVyZSBkaXJlY3RpdmUgZm9yIHVzZSB3aXRoIGNvbnN0YW50cyBhbmQKICAgICAgICAgICAgZW51bXMuIFNvbWV0aW1lcyB0aGUgdXNlIG9mICVqYXZhY29uc3QoMSkgd2lsbCBwcm9kdWNlIGNvZGUgdGhhdCB3b24ndCBjb21waWxlCiAgICAgICAgICAgIHVuZGVyIEphdmEuIElmIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IGlzIHJlcXVpcmVkLCAlamF2YWNvbnN0KDApIGlzIG5vdCBhbgogICAgICAgICAgICBvcHRpb24uIFRoZSAlamF2YWNvbnN0dmFsdWUgZGlyZWN0aXZlIGFjaGlldmVzIHRoaXMgZ29hbCBhbmQgdGhlIHZhbHVlIHNwZWNpZmllZAogICAgICAgICAgICBpcyBnZW5lcmF0ZWQgYXMgSmF2YSBjb2RlIHRvIGluaXRpYWxpc2UgdGhlIGNvbnN0YW50LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSk7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKDEwMDApIEJJRzsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoIm5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcihcIjIwMDBcIikiKSBMQVJHRTsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoMTApIGJhcjsKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgY29uc3QgaW50IGJhciA9IDEwOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICAgI2RlZmluZSBCSUcgMTAwMExMCiAgICAgICAgICAgICAgICAjZGVmaW5lIExBUkdFIDIwMDBVTEwKICAgICAgICAgICAgICAgIGVudW0gRm9vIHsgQkFSID0gOjpiYXIgfTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgR2VuZXJhdGVzOgoKICAgICAgICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIGV4YW1wbGVDb25zdGFudHMgewogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IDEwMDA7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIExBUkdFID0gbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKCIyMDAwIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBGb28gQkFSID0gbmV3IEZvbygiQkFSIiwgMTApOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgUHJldmlvdXNseSwgbm9uZSBvZiBCSUcsIExBUkdFIG9yIEJBUiB3b3VsZCBoYXZlIHByb2R1Y2VkIGNvbXBpbGFibGUgY29kZQogICAgICAgICAgICB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBlbmhhbmNlbWVudHMuIEZlYXR1cmVzIGNhbiBub3cgdGFrZSBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKICAgICAgICAgICAgaW4gYWRkaXRpb24gdG8gdGhlIGZlYXR1cmUgbmFtZSBhbmQgZmVhdHVyZSB2YWx1ZS4gVGhlIGF0dHJpYnV0ZXMgYXJlIG9wdGlvbmFsIAogICAgICAgICAgICBhbmQgYXJlIG11Y2ggdGhlIHNhbWUgYXMgdGhlIHR5cGVtYXAgYXR0cmlidXRlcy4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgc3BlY2lmaWVzIHR3byBvcHRpb25hbCBhdHRyaWJ1dGVzLCBhdHRyaWIxIGFuZCBhdHRyaWIyOgoKICAgICAgICAgICAgICVmZWF0dXJlKGZlYXR1cmVuYW1lLCBhdHRyaWIxPSJhdHRyaWJ2YWwxIiwgYXR0cmliMj0iYXR0cmlidmFsMiIpIG5hbWUgInZhbCI7CiAgICAgICAgICAgICAlZmVhdHVyZShmZWF0dXJlbmFtZSwgdmFsLCBhdHRyaWIxPSJhdHRyaWJ2YWwxIiwgYXR0cmliMj0iYXR0cmlidmFsMiIpIG5hbWU7CgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBpbXByb3ZlbWVudHMgZm9yIHRoZSBzeW50YXggdGhhdCB0YWtlcyB0aGUgZmVhdHVyZSB2YWx1ZSB3aXRoaW4gdGhlCiAgICAgICAgICAgICVmZWF0dXJlKCkgYnJhY2tldHMuIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbm8gbG9uZ2VyIHJlc3RyaWN0ZWQgdG8gYmVpbmcganVzdAogICAgICAgICAgICBhIHN0cmluZy4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyLiBGb3IgZXhhbXBsZSwgdGhpcyBpcyBub3cgYWNjZXB0YWJsZQogICAgICAgICAgICBzeW50YXg6CiAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIiwyMC4wKTsKICAgICAgICAgICAgd2hlcmVhcyBwcmV2aW91c2x5IGl0IHdvdWxkIGhhdmUgdG8gaGF2ZSBiZWVuOgogICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIsIjIwLjAiKTsKICAgICAgICAgICAgVXNlZnVsIGZvciBmZWF0dXJlcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICAjZGVmaW5lICVzb21lZmVhdHVyZSh2YWx1ZSkgICAgICAlZmVhdHVyZSgic29tZWZlYXR1cmUiLHZhbHVlKQogICAgICAgICAgICBUaGVzZSB3aWxsIG5vdyB3b3JrIGFjY2VwdGluZyBlaXRoZXIgYSBzdHJpbmcgb3IgYSBudW1iZXI6CiAgICAgICAgICAgICAgJXNvbWVmZWF0dXJlKCJGcmVkIik7CiAgICAgICAgICAgICAgJXNvbWVmZWF0dXJlKDQpOwoKMDYvMDYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuLCBHdWlsZV0KICAgICAgICAgICAgIC0gQ3JlYXRlZCB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9zY2hlbWVydW5tZSBkaXJlY3RvcnksIHdoaWNoIGhvbGRzIGFsbCB0aGUKCSAgICAgICBydW5tZSBzY3JpcHRzIGZvciBndWlsZSBhbmQgY2hpY2tlbiAoYW5kIHBvc3NpYmx5IG16c2NoZW1lLi4uKS4gIFRoZSBndWlsZQoJICAgICAgIGFuZCBjaGlja2VuIF9ydW5tZSBmaWxlcyB0aGVuIChsb2FkICIuLi9zY2hlbWVydW5tZS9mb28uc2NtIikuCiAgICAgICAgICAgICAtIEluIGNoaWNrZW4gbW9kdWxlLCBmaXggYSBmZXcgYnVncyBpbnZsb2x2aW5nIGR5bmFtaWMgY2FzdHMuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCB0byBmaXggd3JhcHBpbmcgb2YgdGVtcGxhdGVkIG1ldGhvZHMuIElTTyBjb21wbGlhbnQgY29tcGlsZXJzLCBsaWtlCiAgICAgICAgICAgIENvbWVhdSBhbmQgR0NDLTMuNC4wLCBkb24ndCBsaWtlIHRoZSB0ZW1wbGF0ZSBzcGVjaWZpZXIgdGhhdCBTV0lHIHdhcyBnZW5lcmF0aW5nCiAgICAgICAgICAgIHdoZW4gY2FsbGluZyB0aGUgbWV0aG9kLiBUaGlzIGZpeCBtYXkgYnJlYWsgc29tZSBub24gc3RhbmRhcmQgY29tcGxpYW50IGNvbXBpbGVycywKICAgICAgICAgICAgZm9yIGV4YW1wbGUsIFN1biB3b3Jrc2hvcCBjb21waWxlcnMgcHJpb3IgdG8gdmVyc2lvbiA2LjIucDIuIFBhdGNoIHN1Ym1pdHRlZAogICAgICAgICAgICBieSBCaWxsIENsYXJrZS4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gVW5kb2N1bWVudGVkIHNwZWNpYWwgdmFyaWFibGUgJGltY2xhc3NuYW1lIHJlbW92ZWQuCiAgICAgICAgICAgIE5ldyBzcGVjaWFsIHZhcmlhYmxlICRtb2R1bGUgaXMgcmVwbGFjZWQgYnkgdGhlIG1vZHVsZSBuYW1lLCBhcyBzcGVjaWZpZWQKICAgICAgICAgICAgYnkgJW1vZHVsZSBvciAtbW9kdWxlIGNvbW1hbmRsaW5lIG9wdGlvbi4gJGltY2xhc3NuYW1lIGNhbiBiZSBjcmVhdGVkIGZyb20gJG1vZHVsZS4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU2FtZSBhcyBmb3IgSmF2YSBiZWxvdy4gVGhlIG5ldyB0eXBlbWFwcyBhcmUgbmFtZWQgZGlmZmVyZW50bHksIG5hbWVseSwKICAgICAgICAgICAgY3Nib2R5IGFuZCBjc2JvZHlfZGVyaXZlZC4gVGhlIGRlcHJlY2F0ZWQgdHlwZW1hcHMgYXJlIGNzZ2V0Y3B0ciBhbmQKICAgICAgICAgICAgY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gVHlwZW1hcCBjaGFuZ2VzIGZvciB0aGUgSmF2YSBwcm94eSAvIHR5cGV3cmFwcGVyIGFuZCBlbnVtIGNsYXNzZXMuIEEgbmV3CiAgICAgICAgICAgIHR5cGVtYXAgY2FsbGVkIGphdmFib2R5IGNvbnRhaW5zIHRoZSBlc3NlbnRpYWwgc3VwcG9ydCBjb2RlIGZvciBnZW5lcmF0aW9uIGludG8gdGhlIGJvZHkKICAgICAgICAgICAgb2YgdGhlc2UgY2xhc3Nlcy4gVGhlcmUgaXMgYWxzbyBhIG5ldyBqYXZhYm9keV9kZXJpdmVkIHR5cGVtYXAgd2hpY2ggaXMgdXNlZCBpbnN0ZWFkIGZvcgogICAgICAgICAgICB3cmFwcGVkIGNsYXNzZXMgdGhhdCBoYXZlIGEgd3JhcHBlZCBiYXNlIGNsYXNzLiBUaGUgY29kZSBpcyBiYXNpY2FsbHksIHRoZSBnZXRDUHRyKCkKICAgICAgICAgICAgbWV0aG9kIGFuZCBzd2lnQ1B0ciBhbmQgc3dpZ0NNZW1Pd24gbWVtYmVyIHZhcmlhYmxlcy4gVGhlc2UgdXNlZCB0byBiZSBoYXJkIGNvZGVkCiAgICAgICAgICAgIHdpdGggbm8gd2F5IHRvIG1vZGlmeSB0aGUgY29kZS4gVGhlIGludHJvZHVjdGlvbiBvZiB0aGlzIHR5cGVtYXAgbWFrZXMgaXQgcG9zc2libGUgZm9yCiAgICAgICAgICAgIHRoZSB1c2VyIHRvIHRhaWxvciBuZWFybHkgZXZlcnkgYXNwZWN0IG9mIHRoZSBjb2RlIGdlbmVyYXRpb24uCiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gbm93IGlzIHRoZSBjb2RlIGZvciBkaXJlY3RvciBjbGFzc2VzLgoKICAgICAgICAgICAgVGhlIGphdmFnZXRjcHRyIGFuZCBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMgdHlwZW1hcHMgYXJlIGRlcHJlY2F0ZWQgYW5kIGFyZQogICAgICAgICAgICBubyBsb25nZXIgdXNlZCBhcyB0aGUgY29kZSB0aGF0IHRoZXNlIGdlbmVyYXRlZCBjYW4gYmUgcHV0IGluIHRoZSBtb3JlIGZsZXhpYmxlCiAgICAgICAgICAgIGphdmFib2R5IGFuZCBqYXZhYm9keV9kZXJpdmVkIHR5cGVtYXBzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsIG1heSBoZWxwIHlvdSB1cGdyYWRlIGlmIHlvdSBoYXZlIHVzZWQKICAgICAgICAgICAgdGhlIGphdmFnZXRjcHRyIHR5cGVtYXA6CgogICAgICAgICAgICAgICAgLyogVXRpbGl0eSBtYWNybyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBKYXZhIGJvZHkgY29kZSBtZXRob2QgYXR0cmlidXRlcyAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBDVE9SX0FUVFJJQiwgR0VUQ1BUUl9BVFRSSUIpCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYm9keSkgVFlQRU5BTUUgJXsKICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHN3aWdDUHRyOwogICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzd2lnQ01lbU93bjsKCiAgICAgICAgICAgICAgICAgIENUT1JfQVRUUklCICRqYXZhY2xhc3NuYW1lKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NNZW1Pd24gPSBjTWVtb3J5T3duOwogICAgICAgICAgICAgICAgICAgIHN3aWdDUHRyID0gY1B0cjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgR0VUQ1BUUl9BVFRSSUIgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iaiA9PSBudWxsKSA/IDAgOiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJvZHlfZGVyaXZlZCkgVFlQRU5BTUUgJXsKICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHN3aWdDUHRyOwoKICAgICAgICAgICAgICAgICAgQ1RPUl9BVFRSSUIgJGphdmFjbGFzc25hbWUobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcigkbW9kdWxlSk5JLlNXSUckamF2YWNsYXNzbmFtZVVwY2FzdChjUHRyKSwgY01lbW9yeU93bik7CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NQdHIgPSBjUHRyOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBHRVRDUFRSX0FUVFJJQiBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqID09IG51bGwpID8gMCA6IG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgICAgICAvKiBUaGUgZGVmYXVsdCBpcyBwcm90ZWN0ZWQgZ2V0Q1B0ciwgcHJvdGVjdGVkIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFNXSUdUWVBFLCBwcm90ZWN0ZWQsIHByb3RlY3RlZCkKCiAgICAgICAgICAgICAgICAvKiBQdWJsaWMgZ2V0Q1B0ciBtZXRob2QsIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBQVUJMSUNfR0VUQ1BUUihUWVBFTkFNRSkKICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIHByb3RlY3RlZCwgcHVibGljKQogICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgICAgIC8qIFB1YmxpYyBnZXRDUHRyIG1ldGhvZCwgcHVibGljIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFBVQkxJQ19CT0RZTUVUSE9EUyhUWVBFTkFNRSkKICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIHB1YmxpYywgcHVibGljKQogICAgICAgICAgICAgICAgJWVuZGRlZgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgY29udGVudHMgb2YgdGhlIGNsYXNzIG1vZGlmaWVyIHR5cGVtYXBzIGFuZCBwcmFnbWFzIGhhdmUgY2hhbmdlZC4KICAgICAgICAgICAgVGhleSBtdXN0IG5vdyBpbmNsdWRlIHRoZSBjbGFzcyB0eXBlLiBQcmV2aW91c2x5ICdjbGFzcycgd2FzIGhhcmQgY29kZWQuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGVuYWJsZXMgZmxleGliaWxpdHkgaW50byB3aGF0IHR5cGUgb2YgY2xhc3MgaXMgZ2VuZXJhdGVkLAogICAgICAgICAgICBmb3IgZXhhbXBsZSB0aGUgcHJveHkgY2xhc3MgY291bGQgYmUgYW4gaW50ZXJmYWNlIGluc3RlYWQgb2YgYSBjbGFzcy4KCiAgICAgICAgICAgIEZvciBKYXZhIHRoaXMgYWZmZWN0cyB0aGUgamF2YWNsYXNzbW9kaWZpZXJzIHR5cGVtYXAgYW5kIHRoZSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFuZCBtb2R1bGVjbGFzc21vZGlmaWVycyBwcmFnbWFzLgoKICAgICAgICAgICAgRm9yIEMjIHRoaXMgYWZmZWN0cyB0aGUgY3NjbGFzc21vZGlmaWVycyB0eXBlbWFwIGFuZCB0aGUgaW1jbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFuZCBtb2R1bGVjbGFzc21vZGlmaWVycyBwcmFnbWFzLgoKICAgICAgICAgICAgVW5sZXNzIHlvdSBoYXZlIG92ZXJyaWRkZW4gdGhlIGRlZmF1bHQgdmVyc2lvbnMgb2YgdGhlc2UgdHlwZW1hcHMgb3IgcHJhZ21hcywgeW91CiAgICAgICAgICAgIHNob3VsZG4ndCBiZSBhZmZlY3RlZC4gSG93ZXZlciwgaWYgeW91IGhhdmUsIHVwZ3JhZGluZyBpcyBlYXN5LCBmb3IgZXhhbXBsZQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgRm9vICJwdWJsaWMgZmluYWwiCgogICAgICAgICAgICBtdXN0IG5vdyBiZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28ge307CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIEZvbyAicHVibGljIGZpbmFsIGNsYXNzIgoKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzMxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyB0aGF0IGFyZSByZWZlcmVuY2VzLiBQcm9ibGVtIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIE9yZW4gTWlsbGVyLiBBbHNvIGltcHJvdmVzIHRoZSBnZW5lcmF0ZWQgZXhjZXB0aW9uIGRlY2xhcmF0aW9ucyBpbiB0aGUKICAgICAgICAgICAgY2F0Y2ggaGFuZGxlciBmb3IgcG9pbnRlcnMgLSBhIHBvaW50ZXIgaXMgdXNlZCBpbnN0ZWFkIG9mIGEgcmVmZXJlbmNlIHRvCiAgICAgICAgICAgIGEgcG9pbnRlci4gQWRkZWQgZGVmYXVsdCB0aHJvd3MgdHlwZW1hcHMgZm9yIFNXSUdUWVBFICYsIFNXSUdUWVBFICogYW5kCiAgICAgICAgICAgIFNXSUdUWVBFW0FOWV0gKEphdmEgYW5kIEMjKS4KCjA1LzMxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU29tZSBtaW5vciB0eXBlc2FmZSBlbnVtIGltcHJvdmVtZW50cywgaW5jbHVkaW5nIHN0b3JpbmcgdGhlIG5hbWUgb2YKICAgICAgICAgICAgdGhlIGVudW0gaXRlbS4gVGhlIHRvU3JpbmcoKSAvIFRvU3RyaW5nKCkgbWV0aG9kcyBhcmUgb3ZlcnJpZGRlbiB0byByZXR1cm4gdGhpcyBuYW1lLgoKMDUvMzAvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSAKCSAgICAgLSBVcGRhdGUgaG93IGV4YW1wbGVzIGFuZCB0aGUgdGVzdCBzdWl0ZSBhcmUgYnVpbHQuCgkgICAgIC0gU3ltYm9sIG5hbWVzIGFyZSBubyBsb25nZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UKCSAgICAgLSBBZGRlZCB1bmlvbl9ydW5tZS5zcywgd2hpY2ggd2FzIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSB0aGUgZ3VpbGUgbW9kdWxlCgowNS8yNi8yMDA0OiBsYmFsbGFiaW8gKEx1aWdpIEJhbGxhYmlvKQogICAgICAgICAgICBDb21taXR0ZWQgb24gYmVoYWxmIG9mIE1hcmNlbG8gKHdobyBzdGlsbCBoYXMgcHJvYmxlbXMgd2l0aCAKCSAgICB0aGUgU291cmNlRm9yZ2UgQ1ZTLikKCgkgICAgQWRkZWQgUHl0aG9uIHR5cGVtYXBzIGZvciBGSUxFKiB3aXRoIChQeXRob24tb25seSkgdGVzdC4KCjUvMjQvMjAwNDogIGRhbmN5CgoJKiBBbGxlZ3JvIENMIG1vZHVsZTogIE5vdyB1c2luZyBzb21lIG1hY3JvcyAoZGVmaW5lZCBpbgoJTGliL2FsbGVncm9jbC9hbGxlZ3JvY2wuc3dnKSwgc3dpZy1kZWZjb25zdGFudCBhbmQgc3dpZy1kZWZ1biwgZm9yCglkZWZpbmluZyBjb25zdGFudHMgYW5kIGZvcmVpZ24gZnVuY3Rpb25zLiAgVGhpcyBtYWtlcyB0aGUKCWdlbmVyYXRlZCBmaWxlIGEgYml0IG5lYXRlci4gICAgCgoJTm93IHN0cmlwcyBhIGxheWVyIG9mIHBhcmVudGhlc2lzIGZyb20gY29uc3RhbnRzLgoKCVVzZXMgKCogOnZvaWQpIGluc3RlYWQgb2YgOmZvcmVpZ24tYWRkcmVzcyBub3cuCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBVbm5hbWVkIGVudW0gZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm93IHN1cHBvcnRlZCBpbiBhZGRpdGlvbgogICAgICAgICAgICB0byB0aGUgcmVjZW50bHkgYWRkZWQgc3VwcG9ydCBmb3IgdW5uYW1lZCBlbnVtIG1lbWJlciB2YXJpYWJsZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICBlbnVtIHsgZW51bTEsIGVudW0yIH0gTWVtYmVySW5zdGFuY2U7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZW51bSB7IGVudW0zLCBlbnVtNCB9IEdsb2JhbEluc3RhbmNlOwoKICAgICAgICAgICAgVGhlIGludCB0eXBlbWFwcyBhcmUgdXNlZCBmb3Igd3JhcHBpbmcgdGhlIGdldC9zZXQgYWNjZXNzb3IgbWV0aG9kcy4KICAgICAgICAgICAgSWYgdGhlIHNpemVvZiBhbiBlbnVtIGlzIG5vdCB0aGUgc2FtZSBzaXplIGFzIGFuIGludCB0aGVuIHNldHRpbmcgdGhlCiAgICAgICAgICAgIHZhcmlhYmxlIHdpbGwgc2lsZW50bHkgZG8gbm90aGluZyBhcyB0aGUgY2FzdHMgY2Fubm90IGJlIGVhc2lseSBhbmQgcG9ydGFibHkKICAgICAgICAgICAgZ2VuZXJhdGVkLiBJZiB5b3UgbmVlZCB0byBzb2x2ZSB0aGlzIGhpZ2hseSBvYnNjdXJlIHNpdHVhdGlvbiwgd3JpdGUKICAgICAgICAgICAgdGhlIGFzc2lnbm1lbnQgdXNpbmcgdGhlICVleGNlcHRpb24gZmVhdHVyZS4KCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQyMgZW51bSB3cmFwcGluZyBtb2RzLiBTaW1pbGFyIHRvIHRoZSBKYXZhIG1vZHVsZSwgZW51bXMgY2FuIGJlIHdyYXBwZWQgdXNpbmcKICAgICAgICAgICAgb25lIG9mIDMgYXBwcm9hY2hlczoKCiAgICAgICAgICAgIDEpIFByb3BlciBDIyBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXMuc3dnIgogICAgICAgICAgICAyKSBUeXBlc2FmZSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGVzYWZlLnN3ZyIKICAgICAgICAgICAgMykgU2ltcGxlIGNvbnN0YW50IGludGVnZXJzIChvcmlnaW5hbCBhcHByb2FjaCkgLSB1c2UgJWluY2x1ZGUgImVudW1zaW1wbGUuc3dnIgoKICAgICAgICAgICAgU2VlIGVhY2ggb2YgdGhlc2UgZmlsZXMgZm9yIGZ1cnRoZXIgZGV0YWlscy4gRWFjaCBvZiB0aGVzZSBmaWxlcyB1c2UgdHlwZW1hcHMKICAgICAgICAgICAgYW5kIGEgbmV3IGZlYXR1cmUgdG8gY29udHJvbCB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoZSBmZWF0dXJlIGlzOgoKICAgICAgICAgICAgICAgICVjc2VudW0od3JhcGFwcHJvYWNoKTsKCiAgICAgICAgICAgIHdoZXJlIHdyYXBhcHByb2FjaCBzaG91bGQgYmUgb25lIG9mOiAicHJvcGVyIiwgInR5cGVzYWZlIiwgInR5cGV1bnNhZmUiIG9yICJzaW1wbGUiLgogICAgICAgICAgICBbTm8gaW1wbGVtZW50YXRpb24gZGVlbWVkIG5lY2Vzc2FyeSBmb3IgdHlwZSB1bnNhZmUgZW51bXNdLgoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgYXBwcm9hY2ggaXMgcHJvcGVyIEMjIGVudW1zLiBBbm9ueW1vdXMgZW51bXMgYXJlIGFsd2F5cyB3cmFwcGVkIGJ5CiAgICAgICAgICAgIGNvbnN0YW50IGludGVnZXJzLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSmF2YSBlbnVtIHN1cHBvcnQgYWRkZWQuIFRoZXJlIGFyZSBub3cgNCB3YXlzIGluIHdoaWNoIGVudW1zIGNhbiBiZSB3cmFwcGVkOgoKICAgICAgICAgICAgMSkgUHJvcGVyIEphdmEgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW1zLnN3ZyIKICAgICAgICAgICAgMikgVHlwZXNhZmUgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW10eXBlc2FmZS5zd2ciCiAgICAgICAgICAgIDMpIFR5cGUgdW5zYWZlIGVudW1zIChjb25zdGFudCBpbnRlZ2VycykgLSB1c2UgJWluY2x1ZGUgImVudW10eXBldW5zYWZlLnN3ZyIKICAgICAgICAgICAgNCkgU2ltcGxlIGNvbnN0YW50IGludGVnZXJzIChvcmlnaW5hbCBhcHByb2FjaCkgLSB1c2UgJWluY2x1ZGUgImVudW1zaW1wbGUuc3dnIgoKICAgICAgICAgICAgU2VlIGVhY2ggb2YgdGhlc2UgZmlsZXMgZm9yIGZ1cnRoZXIgZGV0YWlscy4gRWFjaCBvZiB0aGVzZSBmaWxlcyB1c2UgdHlwZW1hcHMKICAgICAgICAgICAgYW5kIGEgbmV3IGZlYXR1cmUgdG8gY29udHJvbCB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoZSBmZWF0dXJlIGlzOgoKICAgICAgICAgICAgICAgICVqYXZhZW51bSh3cmFwYXBwcm9hY2gpOwoKICAgICAgICAgICAgd2hlcmUgd3JhcGFwcHJvYWNoIHNob3VsZCBiZSBvbmUgb2Y6ICJwcm9wZXIiLCAidHlwZXNhZmUiLCAidHlwZXVuc2FmZSIgb3IgInNpbXBsZSIuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHR5cGVtYXBzIHdpbGwgaGFuZGxlIGVudW1zIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBzcGVjaWZpZWQgaW5pdGlhbAogICAgICAgICAgICB2YWx1ZXMsIGZvciBleGFtcGxlIHRlbiBpcyBzcGVjaWZpZWQ6CgogICAgICAgICAgICAgICAgZW51bSBOdW1iZXJzIHsgemVybywgdGVuKDEwKSB9OwoKICAgICAgICAgICAgSG93ZXZlciwgdGhlIGFtb3VudCBvZiBnZW5lcmF0ZWQgSmF2YSBjb2RlIGNhbiBiZSBjdXQgZG93biwgYnkgbW9kaWZ5aW5nIHRoZXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGlmIG5vbmUgb2YgdGhlIGVudW1zIGhhdmUgaW5pdGlhbCB2YWx1ZXMgKHByb3BlciBKYXZhIGVudW1zIGFuZCB0eXBlc2FmZSBlbnVtcyBhcHByb2FjaCkuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGUgZGVmYXVsdCBhcHByb2FjaCBpcyB0eXBlc2FmZSBlbnVtcy4gQW5vbnltb3VzIGVudW1zIGFyZSBhbHdheXMgd3JhcHBlZCBieQogICAgICAgICAgICBjb25zdGFudCBpbnRlZ2Vycy4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8xMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBidWcgdXNpbmcgJXJlbmFtZSBvbiBlbnVtIGl0ZW1zIGFuZCB3aGVuIHVzaW5nCiAgICAgICAgICAgICVqYXZhY29uc3QoMSkgLyAlY3Njb25zdCgxKQogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB1c2VkIHRvIGdlbmVyYXRlIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoT2JqKSBPYmplY3Q7CiAgICAgICAgICAgICAgICBlbnVtIEdyYW1tYXIgeyBTdWJqZWN0LCBPYmplY3QgfTsKCjA0LzI4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTWlub3IgZml4ZXMgd2hlbiB1c2luZyBjb21iaW5hdGlvbnMgb2YgdGhlIAogICAgICAgICAgICBqYXZhaW50ZXJmYWNlcywgamF2YWJhc2UsIGNzaW50ZXJmYWNlcyBhbmQgY3NiYXNlIHR5cGVtYXBzLgoKMDUvMTgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEpWTSBsaW5rIGZhaWx1cmUgb24gc29tZSBzeXN0ZW1zIGZpeGVkIHdoZW4gdXNpbmcgc3RkX3ZlY3Rvci5pLgogICAgICAgICAgICBBbHNvIGFkZHMgZGVmYXVsdCB2ZWN0b3IgY29uc3RydWN0b3IgZm9yIHVzZSBmcm9tIEphdmEuCgowNS8xNy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgoJICAgIFtHdWlsZV0gTmV3IHJ1bnRpbWUgZnVuY3Rpb25zIFNXSUdfUG9pbnRlckFkZHJlc3MsCgkgICAgU1dJR19Qb2ludGVyVHlwZSwgU1dJR19Jc1BvaW50ZXJPZlR5cGUsIFNXSUdfSXNQb2ludGVyLgoKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgd3JhcCBzZXZlcmFsIFNXSUcgcnVudGltZSBmdW5jdGlvbnMKCSAgICBhbmQgZXhwb3J0IHRoZW0gaW50byB0aGUgbW9kdWxlIChTd2lnIHN3aWdydW4pLiAgVGhlCgkgICAgcnVudGltZSBtb2R1bGUgaXMgbm93IGJ1aWx0IHdpdGggIm1vZHVsZSIgbGlua2FnZS4KCgkgICAgW0d1aWxlXSBHT09QUyBwcm94eSBvYmplY3RzIG5vdyBhbHNvIHByaW50IHRoZSBwb2ludGVyCgkgICAgYWRkcmVzcyBvZiB0aGUgQyBvYmplY3QuCgowNS8xNC8yMDA0OiBseWxlCiAgICAgICAgICAgIEFkZGVkIEtvdSdzIHBhdGNoIGZvciB0aGUgUnVieSAlaW1wb3J0IGRpcmVjdGl2ZSBzbyB0aGF0IG1vZHVsZXMKICAgICAgICAgICAgd2l0aCAibmVzdGVkIiBuYW1lcyBhcmUgaGFuZGxlZCBwcm9wZXJseS4gQ29uc2lkZXIgYW4gaW50ZXJmYWNlCiAgICAgICAgICAgIGZpbGUgZm9vLmkgdGhhdCBoYXMgdGhpcyAlbW9kdWxlIGRlY2xhcmF0aW9uIGF0IGl0cyB0b3A6CgogICAgICAgICAgICAgICAgJW1vZHVsZSAibWlzYzo6dGV4dDo6Zm9vIgoKICAgICAgICAgICAgTm93IGNvbnNpZGVyIGFub3RoZXIgaW50ZXJmYWNlIGZpbGUgc3BhbS5pIHRoYXQgaW1wb3J0cyBmb28uaToKCiAgICAgICAgICAgICAgICAlaW1wb3J0IGZvby5pCiAgICAgICAgICAgIAogICAgICAgICAgICBCZWZvcmUgdGhpcyBwYXRjaCwgdGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBjb2RlIGJlaW5nCiAgICAgICAgICAgIGdlbmVyYXRlZCBmb3Igc3BhbV93cmFwLmM6CgogICAgICAgICAgICAgICAgcmJfcmVxdWlyZSgibWlzYzo6dGV4dDo6Zm9vIik7CgogICAgICAgICAgICBXaXRoIHRoaXMgcGF0Y2gsIGhvd2V2ZXIsIHlvdSdsbCBnZXQgdGhlIGNvcnJlY3QgcGF0aCBuYW1lCiAgICAgICAgICAgIGZvciB0aGUgY2FsbCB0byByYl9yZXF1aXJlKCksIGUuZy4KCiAgICAgICAgICAgICAgICByYl9yZXF1aXJlKCJtaXNjL3RleHQvZm9vIik7CgogICAgICAgICAgICBTZWUgU291cmNlRm9yZ2UgQnVnICM5MjgyOTkuCgowNS8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmb3IgZW1pdHRpbmcgZGlyZWN0b3JzIHdoZW4gJWZlYXR1cmUoImRpcmVjdG9yIikgc3BlY2lmaWVkCiAgICAgICAgICAgIGZvciBhIGNsYXNzIHdpdGggbm8gdmlydHVhbCBtZXRob2RzLCBidXQgZG9lcyBoYXZlIGEgdmlydHVhbCBkZXN0cnVjdG9yLgogICAgICAgICAgICBTdWJtaXR0ZWQgYnkgS2V2aW4gU21pdGguCgowNS8wNi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgTmV3IFNXSUcgcnVudGltZSBmdW5jdGlvbiBTV0lHX1R5cGVQcmV0dHlOYW1lLCB3aGljaCAKCSAgICByZXR1cm5zIGFuIHVubWFuZ2xlZCB0eXBlIG5hbWUgZm9yIGEgc3dpZ190eXBlX2luZm8KCSAgICBvYmplY3QuIAoKCSAgICBbR3VpbGVdOiBVc2UgaXQgZm9yIHByaW50aW5nIHBvaW50ZXIgb2JqZWN0cy4KCjA1LzAzLzIwMDQ6ICBkYW5jeSAoQWhtb24gRGFuY3kpCgoJKiBMaWIvYWxsZWdyb2NsL2FsbGVncm9jbC5zd2c6ICBVcGRhdGVkIGNvbW1lbnRzIGFib3V0IGlkZW50aWZlcgoJY29udmVyc2lvbi4gIAoKCSogU291cmNlcy9Nb2R1bGVzL2FsbGVncm9jbC5jeHg6ICBSZWdpc3RlciAvZGV2L251bGwgZm9yICJoZWFkZXIiCgl0YXJnZXQuICAgQWxzbywgZGlzcmVnYXJkICJjb25zdCIgcXVhbGlmaWVycyBkdXJpbmcgdHlwZQoJY29udmVyc2lvbi4gIAoKCQowNS8wMi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0gRml4IGJ1ZyA3ODI0NjguCgkgICAgVG8gZml4IHRoaXMgYnVnLCB0aGUgcnVudGltZSBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiwgYW5kCgkgICAgcG9pbnRlcnMgYXJlIG5vdyByZXByZXNlbnRlZCBhcyBhIENfU1dJR19QT0lOVEVSX1RZUEUuCgoJICAgIENoaWNrZW4gdmVyc2lvbiA+IDEuNDAgaXMgbm93IHJlcXVpcmVkIQoKCSAgICAqIFR5cGVtYXAgaW5jb21wYXRpYmlsaXR5OiAgdHlwZW1hcHMgbm8gbG9uZ2VyIHVzZSBjaGlja2VuX3dvcmRzLgoJICAgICAgSWYgYSB0eXBlbWFwIG5lZWRzIHNvbWUgc3BhY2UsIGl0IHNob3VsZCBqdXN0IGNhbGwgQ19hbGxvYwoKCSAgICAqIGFyZ291dCB0eXBlbWFwcyBubyBsb25nZXIgdXNlIHRoZSAvKiBpZiBPTkUgKi8gY29uc3RydWN0IHRvCgkgICAgICBidWlsZCBhbiBvdXRwdXQgbGlzdC4gIEEgU1dJR19BUFBFTkRfVkFMVUUgbWFjcm8sIGV4YWN0bHkgbGlrZQoJICAgICAgZ3VpbGUgYW5kIG16c2NoZW1lIGlzIG5vdyB1c2VkLgoKMDQvMjUvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gdGhlIGdlbmVyYXRlZCBHT09QUyBjb2RlLCBkb24ndCBjcmVhdGUgbWV0aG9kcwoJICAgIHRoYXQgd291bGQgbm90IHNwZWNpYWxpemUgYW55IGFyZ3VtZW50czsgc2ltcGx5IHJlLWV4cG9ydAoJICAgIHRoZSBwcmltaXRpdmUgZnVuY3Rpb25zLiAgKFRoaXMgaXMgYSBwZXJmb3JtYW5jZQoJICAgIG9wdGltaXphdGlvbiB3aGljaCByZWR1Y2VzIGxvYWQgdGltZSBhbmQgZXhlY3V0aW9uIHRpbWUuKQoKCSAgICBbR3VpbGVdIEluIC1naCBtb2RlLCBmaXggdGhlICJ0b28gbWFueSBpbml0aWFsaXplcnMiIGVycm9yCgkgICAgd2hpY2ggd2FzIGNhdXNlZCBieSBhbiBpbmNvbXBhdGlibGUgc3dpZ190eXBlX2luZm8gbGF5b3V0LgoKCSAgICBbR3VpbGVdIFRoZSB0eXBlbWFwIGZvciBGSUxFICogaW4gcG9ydHMuaSBub3cgYWxzbyBhY2NlcHRzCgkgICAgYSByZWd1bGFyIEZJTEUgKiBwb2ludGVyIG9iamVjdC4gIEFsc28gYSBidWcgd2l0aCBTY2hlbWUKCSAgICBmaWxlIHBvcnRzIHRoYXQgYXJlIG9wZW4gZm9yIGlucHV0IGFuZCBvdXRwdXQgaGFzIGJlZW4KCSAgICBmaXhlZC4gCgowNC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBDaGFuZ2UgZW50cnkgMDMvMjEvMjAwNCByZXZva2VkLiBUaGUgY2hhbmdlIGludHJvZHVjZWQgYW5vdGhlcgogICAgICAgICAgICBpbmNvbnNpc3RlbmN5IChyZWZlcmVuY2UgdHlwZW1hcHMgYmVpbmdzIHVzZWQgaW5zdGVhZCBvZgogICAgICAgICAgICBwb2ludGVyIHR5cGVtYXBzIGZvciBtZW1iZXIgdmFyaWFibGVzIGFzIHdlbGwgYXMgc3RhdGljCiAgICAgICAgICAgIG1lbWJlciB2YXJpYWJsZXMgYW5kIGdsb2JhbCB2YXJpYWJsZXMgZm9yIHNvbWUgbGFuZ3VhZ2VzLAogICAgICAgICAgICBidXQgb25seSBmb3IgQysrIGFuZCBub3QgQykuIFRoaXMgd291bGQgYnJlYWsgdXNlcidzIGN1cnJlbnQKICAgICAgICAgICAgdHlwZW1hcHMgYW5kIGludHJvZHVjZSBmdXJ0aGVyIGluY29uc2lzdGVuY2llcy4gQWx0ZXJuYXRpdmUKICAgICAgICAgICAgc29sdXRpb24gcmVxdWlyZWQgYW5kIGJlaW5nIGRpc2N1c3NlZC4KCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgQWRkZWQgdGhlIC1kaXJlY3RvcnMgZmxhZy4gVGhpcyBlbmFibGVzIHRoZSBkaXJlY3RvcgoJICAgIG1vZGUgZm9yIHRoZSBpbnRlcmZhY2UgYW5kIGFsbCB0aGUgY2xhc3NlcyB0aGF0CgkgICAgZG9uJ3Qgc2V0IHRoZSAiZmVhdHVyZTpub2RpcmVjdG9yIiBleHBsaWNpdGx5LgoKCSAgICBZb3UgY2FuIHVzZSB0aGlzIGluIHlvdXIgbW9kdWxlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUKCSAgICBkaXJlY3RvciBmZWF0dXJlIGluIGFsbCB5b3VyIGNsYXNzZXMsIGJ1dCBpdCBpcyBtb3N0CgkgICAgaW50ZW5kZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMsIGxpa2U6CgoJICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoJICAgICAgbWFrZSBjaGVjay1ydWJ5LXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCSAgICAgIG1ha2UgY2hlY2stamF2YS10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgoJICAgIFRoZXNlIGNvbW1hbmRzIHdpbGwgcnVuIHRoZSBlbnRpcmUgdGVzdC1zdWl0ZSB1c2luZwoJICAgIGRpcmVjdG9ycywgYW5kIG5vdCBvbmx5IHRoZSBzcGVjaWZpYyAnZGlyZWN0b3JzXyonCgkgICAgY2FzZXMuIFRoaXMgc2hvdWxkIGJlIGRvbmUgZnJvbSB0aW1lIHRvIHRpbWUuCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIFtweXRob25dIEFkZGVkIHN1cHBvcnQgZm9yIHN0ZDo6d3N0cmluZyBhbmQgd2NoYXJfdCwKCSAgICBmb3IgY29tcGlsZXIgYW5kIHB5dGhvbiB2ZXJzaW9ucyB0aGF0IHN1cHBvcnQgdGhlbS4KCSAgICAKCSAgICBXaGVuIG5lZWRlZCwgdXNlIAoKCSAgICAgJWlubGN1ZGUgc3RkX3N0cmluZy5pICAgICAgLy8gJ2NoYXInIHN0cmluZ3MKCSAgICAgJWlubGN1ZGUgc3RkX3dzdHJpbmcuaSAgICAgLy8gJ3djaGFyX3QnIHN0cmluZ3MKCSAgICAKCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgW3B5dGhvbl0gRml4IHRoZSBkZWZhdWx0IGJlaGF2aW91ciAoc2VnLiBmYXVsdCkgd2hlbiBhbgoJICAgIGlucGxhY2Ugb3BlcmF0b3IgKCs9LC09LC4uLikgd2FzIHdyYXBwZWQsIGFzIHJlcG9ydGVkIGJ5CgkgICAgTHVjcml6IChsdWNyaXpAc2l0aWxhbmRpYS5pdCksIHdoZW4gdGhlIG1vc3QgY29tbW9uCgkgICAgZm9ybSB3YXMgdXNlZDoKCiAgICAgICAgICAgICAgICAgICBBJiAgQTo6b3BlcmF0b3IrPShpbnQgaSkgeyAuLi47IHJldHVybiAqdGhpczsgfQogICAgICAgICAgICAgICAgICBeXl5eICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eCgkgICAgCgoJICAgIGllLCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgYW5kIGl0cyBjb250YWlucyB0aGUgc2FtZSAndGhpcycKCSAgICB2YWx1ZSB0aGFuIHRoZSBpbnB1dCBvYmplY3QsIHdoaWNoIGlzIGRlbGV0ZWQgYWZ0ZXIgdGhlCgkgICAgb3BlcmF0aW9uICJhICs9IGIiLCBsZWF2aW5nIHRoZSByZXN1bHQgd2l0aCBubyByZWFsCgkgICAgb2JqZWN0LCBidXQgYSBzZWcuIGZhdWx0LgoKCSAgICBUbyBmaXggaXQsIHdlIG5lZWRlZCB0byBpbnRyb2R1Y2UgYSBuZXcgZmVhdHVyZSBhbmQgdXNlIGFuCgkgICAgb2xkIG9uZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJzZWxmOmRpc293biIpIEE6Om9wZXJhdG9yKz07CiAgICAgICAgICAgICAgICVmZWF0dXJlKCJuZXciKSBBOjpvcGVyYXRvcis9OwoJICAgIAoJICAgIGhlcmUsICJzZWxmOmRpc293biIgZGlzYWJsZSB0aGUgb3duZXJzaGlwIG9mIHRoZSAnc2VsZicKCSAgICBvciBpbnB1dCBvYmplY3QsIGFuZCB0aGUgIm5ldyIgZmVhdHVyZSB0cmFuc2ZlcnMgdGhlCgkgICAgb3duZXJzaGlwIHRvIHRoZSByZXN1bHQgb2JqZWN0LgoJICAgIAoJICAgIFRoZSBmZWF0dXJlL3NvbHV0aW9uIGNvdWxkIGFsc28gYmUgdXNlZCBpbiBvdGhlciBsYW5ndWFnZXMKCSAgICB0aGF0IHVzZSBnYyBhbmQgaW1wbGVtZW50IHRoZSBpbnBsYWNlIG9wZXJhdG9ycywgb3Igb3RoZXIKCSAgICBvcGVyYXRvcnMsIGluIGEgc2ltaWxhciB3YXkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUHl0aG9uIE1PRFVMRSAqKioKCgkgICAgSWYgeW91IGFscmVhZHkgYXJlIHVzaW5nIHRoZSBpbnBsYWNlIG9wZXJhdG9ycyBpbiBweXRob24sCgkgICAgYW5kIHlvdSBpbXBsZW1lbnRlZCBzb21lIGtpbmQgb2Ygd29ya2Fyb3VuZCB0byB0aGUgcHJvYmxlbQoJICAgIGZpeGVkIGhlcmUsIGl0IGlzIHBvc3NpYmxlIHlvdSBjb3VsZCBlbmQgd2l0aCAnZnJlZScKCSAgICBvYmplY3RzIHRoYXQgbmV2ZXIgZ2V0IGRlbGV0ZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIGFuZAoJICAgIHlvdSB3YW50IHRvIGRpc2FibGUgdGhlIGN1cnJlbnQgZml4LCB1c2U6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgic2VsZjpkaXNvd24iLCIiKSBBOjpvcGVyYXRvcis9OwogICAgICAgICAgICAgICAlZmVhdHVyZSgibmV3IiwiIikgQTo6b3BlcmF0b3IrPTsKCgowNC8wNy8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBDKysgZW51bXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkIGJ5IGludGVnZXJzLCB0aGV5IGFyZSBub3cgd3JhcHBlZCBieSAKICAgICAgICAgICAgQyMgZW51bXMuIEZvciBFeGFtcGxlLCBnaXZlbiBDKys6CgogICAgICAgICAgICAgICAgZW51bSBBbkVudW0geyBmb28sIGJhciB9OwogICAgICAgICAgICAgICAgdHlwZWRlZiBBbkVudW0gQW5FbnVtZXJhdGlvbjsKICAgICAgICAgICAgICAgIHZvaWQgc29tZXRoaW5nKEFuRW51bSBlLCBBbkVudW1lcmF0aW9uIGYpOwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgcHVibGljIGVudW0gQW5FbnVtIHsKICAgICAgICAgICAgICAgICAgZm9vLAogICAgICAgICAgICAgICAgICBiYXIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb21ldGhpbmcoQW5FbnVtIGUsIEFuRW51bSBmKSB7Li4ufQoKICAgICAgICAgICAgTm90ZSB0aGF0IGEgZ2xvYmFsIGVudW0gbGlrZSBBbkVudW0gYWJvdmUgaXMgZ2VuZXJhdGVkIGludG8gaXRzIG93bgogICAgICAgICAgICBmaWxlIGNhbGxlZCBBbkVudW0uY3MuIEVudW1zIGRlZmluZWQgd2l0aGluIGEgQysrIGNsYXNzIGFyZSBkZWZpbmVkCiAgICAgICAgICAgIHdpdGhpbiB0aGUgQyMgcHJveHkgY2xhc3MuIFNvbWUgb2YgdGhlIHR5cGVtYXBzIGZvciBtb2RpZnlpbmcgQyMgcHJveHkKICAgICAgICAgICAgY2xhc3NlcyBhbHNvIHdvcmsgZm9yIGVudW1zLiBGb3IgZXhhbXBsZSBnbG9iYWwgZW51bXMgY2FuIHVzZQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzaW1wb3J0cykgdG8gYWRkIGluIGV4dHJhIHVzaW5nIHN0YXRlbWVudHMuCgogICAgICAgICAgICBHbG9iYWwgZW51bXMgYW5kIGNsYXNzIGVudW1zIGNhbiB1c2UKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2NsYXNzbW9kaWZpZXJzKSB0byBtYWtlIHRoZSBlbnVtIHByaXZhdGUsIHB1YmxpYyBldGMuCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UpIHRvIGNoYW5nZSB0aGUgdW5kZXJseWluZyBlbnVtIHR5cGUgKGVudW0gYmFzZSkKCiAgICAgICAgICAgIElmIHdlIGFkZCB0aGlzIGZvciB0aGUgYWJvdmUgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2NsYXNzbW9kaWZpZXJzKSBBbkVudW0gInByb3RlY3RlZCIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSkgQW5FbnVtICJsb25nIgoKICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBpcyBnZW5lcmF0ZWQ6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcHJvdGVjdGVkIGVudW0gQW5FbnVtIDogbG9uZyB7CiAgICAgICAgICAgICAgICAgIGZvbywKICAgICAgICAgICAgICAgICAgYmFyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDQvMDcvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNlZyBmYXVsdCBmaXggZm9yIGVtcHR5IGVudW1zLCBsaWtlCiAgICAgICAgICAgICAgICBlbnVtIEZvbyB7fTsKCjAzLzIxLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICBbTm90ZTogdGhpcyBjaGFuZ2UgcmV2b2tlZCBvbiAwNC8yNS8yMDA0XQoJICAgIFtQeXRob25dIE1ha2VzIHRoZSBmb2xsb3dpbmcgJ3ZhcicgY2FzZXMgbW9yZSB1bmlmb3JtOgoKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGdhOwogCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBzYTsKICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWE7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgIG5vdyB0aGUgdGhyZWUgdmFyaWFibGVzIChnYSwgc2EsIG1hKSBjYW4gYmUgYXNzaWduZWQgYXM6CgoKICAgICAgICAgICAgICAgICAgY3Zhci5nYSA9ICJoZWxsbyI7CiAgICAgICAgICAgICAgICAgIEEuc2EgPSAiaGVsbG8iOwogICAgICAgICAgICAgICAgICBhLm1hID0gImhlbGxvIjsKCiAgICAgICAgICAgIGllLCBub3cgJ21hJyB3aWxsIGFsc28gdXNlIGEgc3RkOjpzdHJpbmcgdHlwZW1hcCAnaW4nIGlmCiAgICAgICAgICAgIGRlZmluZWQsIGJlZm9yZSBpdCB3YXMgb25seSBhY2NlcHRpbmcgYSAncF9zdGRfc3RyaW5nJwogICAgICAgICAgICBwb2ludGVyLiAgTm90ZSwgaG93ZXZlciwgdGhhdCAnbWEnIHdpbGwgbm90IHVzZSB0aGUKICAgICAgICAgICAgJ3ZhcmluL3Zhcm91dCcgdHlwZW1hcHMgKHRoYXQgcHJvYmFibHkgY291bGQgYmUgbW9yZQogICAgICAgICAgICBuYXR1cmFsKSwgYnV0IGl0IHdpbGwgcGljayB1cCB0aGUgJ2luJyB0eXBlbWFwIGZvciBjb25zdAogICAgICAgICAgICBzdGQ6OnN0cmluZyYgKHdoaWNoIGlzIGVhc2llcikuCgoJICAgIFRoZSBjaGFuZ2VzIGluIGN3cmFwLmMgYW5kIGxhbmcuY3h4IHdpbGwgcHJvYmFibHkgZml4IHRoZQoJICAgIGJlaGF2aW91ciBpbiBvdGhlciBsYW5ndWFnZXMgdGhhdCBkbyBub3Qgb3ZlcmxvYWQgdGhlCgkgICAgbWVtYmVydmFySGFuZGxlciBtZXRob2QgInRvbyBtdWNoIi4KIAogICAgICAgICAgICAKMDMvMjEvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gRGlzYWJsaW5nIHRoZSBkZWZhdWx0IGluc3RhbnRpYXRpb25zIGxpa2U6CgoJICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPGludCxpbnQ+OwoKICAgICAgICAgICAgZm9yIGFsbCB0aGUgcHJpbWl0aXZlIHR5cGVzIGFuZCBTVEwgY29udGFpbmVycy9jbGFzc2VzLgoJICAgIFRoZXkgYXJlIGV4cGVuc2l2ZSwgc3BlY2lhbGx5IGZvciBwYWlyIGFuZCBtYXAsIGFuZCB0aGUKCSAgICBwcmV2aW91cyBiZWhhdmlvdXIgYWxzbyByZXF1aXJlcyB0aGUgdXNlciB0byBwZXJmb3JtCgkgICAgbWFudWFsIGluc3RhbnRpYXRpb25zLiBTdGlsbCwgaWYgdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMKCSAgICBub3QgaW1wb3J0YW50LCBpdCBjYW4gYmUgcmUtZW5hYmxlZCBieSBkZWZpbmluZyB0aGUgbWFjcm8KCSAgICBTV0lHX1NURF9ERUZBVUxUX0lOU1RBTlRJQVRJT04gKHNlZSBzdGRfY29tbW9uLmkpLgoKCSAgICBBbHNvLCBub3JtYWxpemluZyB0aGUgSU5QVVQvT1VUUFVUL0lOT1VUIHR5cGVtYXBzLiBOb3cKCSAgICB0aGV5IHVzZSB0aGUgc2FtZSBjb252ZXJzb3JzIHRoYW4gdGhlIHJlc3Qgb2YgdGhlCgkgICAgdHlwZW1hcHMsIGFuZCB5b3UgY2FuIHVzZSB0aGVtIGZvciBzdGQ6OnBhaXIsIHN0ZDo6c3RyaW5nCgkgICAgYW5kIGFsbCB0aGUgb3RoZXIgU1RMIHR5cGVzLCBsaWtlIGluOgoKCSAgICAgIHZvaWQgcF9pbm91dGQoc3RkOjpwYWlyPGRvdWJsZSwgZG91YmxlPiAqSU5PVVQpOwoKCSAgICBBZGRlZCB0aGUgYXR0cmlidXRlLmkgYW5kIGltcGxpY2l0LmkgZmlsZXMgd2l0aCBtYWNyb3MgdG8KCSAgICB0cmFuc2Zvcm0gZnVuY3Rpb25zIHBhaXJzIGxpa2UgJ3NldF94Jy8nZ2V0X3gnIAoJICAgIChvciAnVCYgeCgpJy8nY29uc3QgVCYgeCgpIGNvbnN0JykgaW50byBhbiBhdHRyaWJ1dGUsCgkgICAgYW5kIGFsbG93aW5nIHRoZSB1c2Ugb2YgaW1wbGljaXQgY29uc3RydWN0b3JzIGluIHR5cGVtYXBzCgkgICAgKHNlZSB0aGUgZmlsZXMgZm9yIG1vcmUgZGV0YWlscykuCgowMy8yMS8yMDA0OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggdGhlIGRvY3VtZW50YXRpb24gc3RyaW5ncyBvZiBmdW5jdGlvbnMgd2l0aAoJICAgIGFub255bW91cyBhcmd1bWVudHMuCgowMy8xOC8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBNb3JlIGdlbmVyYWwgc3RkX3N0cmluZy5pIGludGVyZmFjZS4KCSAgICBOb3cgeW91IGNhbiB3cmFwIGl0IHVzaW5nCgoJICAgICAgJXRlbXBsYXRlKHN0cmluZykgc3RkOjpiYXNpY19zdHJpbmc8Y2hhcj47CgogICAgICAgICAgICBhbmQgdXNlIHRoZSBzdGQ6OnN0cmluZyBhcyBhIGJhc2UgY2xhc3M6CgoJICAgICAgc3RydWN0IEEgOiBzdGQ6OnN0cmluZyB7CiAgICAgICAgICAgICAgfTsKCgkgICAgQnV0IG1vcmUgaW1wb3J0YW50LCBzd2lnIHdpbGwgcmVjb2duaXplIAoJICAgIGJvdGggc3RkOjpiYXNpY19zdHJpbmc8Y2hhcj4gYW5kIHN0ZDo6c3RyaW5nIGFzCgkgICAgdGhlIHNhbWUgdHlwZS4KCjAzLzE2LzIwMDQ6IG1tYXR1cwoJICAgIFByZXZpb3VzbHkgYWRkZWQsIGJ1dCBub3QgbWVudGlvbmVkIGJlZm9yZToKCgkgICAgLSBmcmllbmQgZGVjbGFyYXRpb24gc3VwcG9ydCwgc3dpZyBub3cgZW1pdHMgYSBnbG9iYWwKCSAgICAgIGZ1bmN0aW9uIGluIHRoZSBzYW1lIGNsYXNzIHNjb3BlLgoKCSAgICAtIHJlZi91bnJlZiBmZWF0dXJlczogdG8gbWl4IHJlZiBjb3VudGluZyBDKysgY2xhc3NlcwoJICAgICAgYW5kIG5hdGl2ZSBzY3JpcHQgcmVmIGNvdW50aW5nIG1lY2hhbmlzbXMgKGxpa2UgaW4gcHl0aG9uKS4KCSAgICAKCSAgICAgIFVzZSBpdCBsaWtlOgoKIAkgICAgICAgICVmZWF0dXJlKCJyZWYiKSAgIFJDT2JqICIkdGhpcy0+cmVmKCk7IgogICAgICAgICAgICAgICAgJWZlYXR1cmUoInVucmVmIikgUkNPYmogIiR0aGlzLT51bnJlZigpOyIKCgkgICAgICBBbmQgdGhlIGNsYXNzIFJDT2JqLCBhbmQgYWxsIHRoZSBkZXJpdmVkIG9uZXMsIHdpbGwKCSAgICAgIHBlcmZvcm0gdGhlIHJpZ2h0IHJlZi91bnJlZiBjYWxscyB3aGVuIGEgbmV3IHBvaW50ZXIgIAoJICAgICAgaXMgcmV0dXJuZWQgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSwgb3Igd2hlbiB0aGUgdGFyZ2V0CgkgICAgICBsYW5ndWFnZSBhdHRlbXB0cyB0byBkZWxldGUgdGhlIG9iamVjdC4KCSAgICAgIAoJICAgICAgU2VlIHRoZSByZWZjb3VudC5pIGZpbGUgaW4gdGhlIHRlc3Qtc3VpdGUgZm9yIG1vcmUKCSAgICAgIGRldGFpbHMuCgoJICAgIAowMy8xNi8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBVc2luZyB0aGUgbmV3ICVmcmFnbWVudCBzdXBwb3J0LCBtYWpvciByZXdyb3RlIAoJICAgIG9mIHRoZSBweXRob24gc3dpZyBsaWJyYXJ5LCBpbmNsdWRpbmc6CgoJICAgIC0gQWxtb3N0IGF1dG9tYXRpYyB0ZW1wbGF0ZS90eXBlbWFwIGluc3RhbnRpYXRpb24gZm9yCgkgICAgICB0aGUgU1RMIGNvbXBvbmVudHMuIEZvciBleGFtcGxlLCBub3cgeW91IGNhbiB3cml0ZToKCgkJICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgICBhbmQgYSBzcGVjaWFsaXplZCB2ZWN0b3JfaSBjbGFzcyBpcyBlbWl0dGVkIHdpdGggYWxsCgkgICAgICB0aGUgbmVlZGVkIHR5cGVtYXBzLiBObyBuZWVkIHRvIHVzZSB0aGUgb2xkCgkgICAgICAnc3BlY2lhbGl6ZV92ZWN0b3InIG1hY3Jvcy4KCgkgICAgICBOb3RlIHlvdSBjYW4gYWxzbyBkZWZpbmUKCgkgICAgICAgICAgJXRlbXBsYXRlKG1hdHJpeF9pKSAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4gPjsKCSAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX3BpaSkgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCxpbnQ+ID47CgoJICAgIC0gVGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gCiAJIAogICAgICAgICAgIAkgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgoJICAgICAgZGVmaW5lcyB0aGUgdmVjdG9yIHR5cGVtYXBzLCBidXQgbm8gcHJveHkgY2xhc3MuIEZvciBhbGwgdGhlCiAgICAgICAgICAgICAgZnVuZGFtZW50YWwgdHlwZXMsIHRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGFyZQogICAgICAgICAgICAgIGRlZmluZWQsIHNvLCB5b3UgY2FuIHNheQoKCSAgICAgICVpbmNsdWRlIHN0ZF92ZWN0b3IKCgkgICAgICBpbnQgZnVuYyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBhKTsKCSAgICAgIAoJICAgICAgd2hlcmUgdGhlIHByb3BlciB0eXBlbWFwIGlzIGFwcGxpZWQgdG8gJ2EnLCBidXQgbm8KCSAgICAgIHN0ZDo6dmVjdG9yPGludD4gcHJveHkgaXMgZ2VuZXJhdGVkLgoJICAgICAgCgogICAgICAgICAgICAtIEFsbCB0aGUgU1RMIGNvbnRhaW5lcnMgcHJlc2VudCBhIG1vcmUgdW5pZm9ybSBiZWhhdmlvciBhbmQKCSAgICAgIG1vcmUgY29tcGxldGUgaW50ZXJmYWNlIGRlY2xhcmF0aW9uLiBUaGUgZm9sbG93aW5nIGFyZSAKCSAgICAgIG5vdyBzdXBwb3J0ZWQ6CgoJCSAgc3RkOjp2ZWN0b3I8VD4KCQkgIHN0ZDo6bGlzdDxUPgoJCSAgc3RkOjpkZXF1ZTxUPgoJCSAgc3RkOjpzZXQ8VD4KCQkgIHN0ZDo6bXVsdGlzZXQ8VD4KCQkgIHN0ZDo6bWFwPFQ+CgkJICBzdGQ6Om11bHRpbWFwPFQ+CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgbm90IGEgY29udGFpbmVyLCBidXQgYWxzbyBzdXBwb3J0ZWQ6CgoJCSAgc3RkOjpwYWlyPFQsVT4KCiAgICAgICAgICAgICAgYWxzbywgbW9yZSB0eXBlbWFwcyBhcmUgZGVmaW5lZCBmb3IgYWxsIG9mIHRoZW0sCgkgICAgICBpbmNsdWRpbmcgdmFyaW4sIHZhcm91dCwgdHlwZWNoZWNrLCBldGMuCgogICAgICAgICAgICAtIEluaXRpYWwgYXR0ZW1wdCB0byBpbXBsZW1lbnQgdGhlIFNUTCBjb250YWluZXJzCiAgICAgICAgICAgICAgY29uc2lkZXJpbmcgYWxsb2NhdG9ycywgaWU6CgoJICAgICAgICAgIHN0ZDo6dmVjdG9yPFQsQT4JCQkKCgkgICAgICBpdCBpcyBwYXJ0aWFsbHkgd29ya2luZywgYnV0IGl0IGlzIGp1c3QgYSB3b3JrYXJvdW5kCgkgICAgICB3aGlsZSBzd2lnIGltcHJvdmVzIGl0cyB0ZW1wbGF0ZSB0eXBlIHN1cHBvcnQuCgkgICAgICAKCSAgICAgIAoJICAgICBQbGVhc2UgdGVzdCB3aXRoIHlvdXIgcGFydGljdWxhciBzZXR1cC4gSXQgc2VlbXMgdG8gYmUKCSAgICAgd29ya2luZyB3aXRoIGcrKyAzLjIuMiwgZysrIDIuOTYsIEludGVsIGljYyBhbmQgU0dJIENDCgkgICAgIGNvbXBpbGVycywgcGx1cyBweXRob24gMS41LjIsIDIuMCBhbmQgMi4zLCBidXQgc2luY2UKCSAgICAgd2UgYXJlIHVzaW5nIHRlbXBsYXRlcywgdGhlcmUgaXMgYSBjaGFuY2UgeW91IGNhbiBmaW5kCgkgICAgIHNvbWUgcHJvYmxlbXMgd2hlbiB1c2luZyB3aXRoIGFuIG9sZCBDKysgY29tcGlsZXIuCgowMy8xNi8yMDA0OiBtbWF0dXMKCiAgICAgICAgICAgIC0gQWxsb3dpbmcgdGhlIGVtcHR5ICV0ZW1wbGF0ZSBkaXJlY3RpdmUsIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCgkgICAgICB0byBwcm9jZXNzIHRoZSBjbGFzcyAidHlwZWRlZiJzIGFuZCAidHlwZW1hcCJzLiBCZWZvcmUKCSAgICAgIG9ubHkgdGhlIGludGVybmFsICJ0eXBlZGVmInMgd2VyZSBwcm9jZXNzZWQuCgogICAgICAgICAgICAgIFRoaXMgbWFrZXMgcG9zc2libGUgdG8gZW1pdCB0aGUgZGVmYXVsdCBpbi9vdXQKICAgICAgICAgICAgICB0eXBlbWFwcyB3aXRob3V0IHRoZSBuZWVkIG9mIHdyYXBwaW5nIGFuIHNwZWNpYWxpemVkCiAgICAgICAgICAgICAgdmVjdG9yIGluc3RhbmNlLgoKCSAgICAtIEFkZGluZyB0aGUgcHJlcHJvY2Vzc29yIGV4dGVuc2lvbiAjQCB3aGljaCBtYW5nbGVzIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBtYWNybyBhcmd1bWVudCwgbGlrZSBpbjoKCiAgICAgICAgICAgICAgICAjZGVmaW5lIG1hY3JvKFgpICAjQFgKICAgICAgICAgICAgICAgIG1hY3JvKGludCkgICAgICAgICAtPiBpbnQKICAgICAgICAgICAgICAgIG1hY3JvKHN0ZDo6c3RyaW5nKSAtPiBzdGRfc19zX3N0cmluZwogICAgICAgICAgICAgICAgCgkgICAgLSBGcmFnbWVudHMgY2FuIG5vdyBiZSAidHlwZSBzcGVjaWFsaXplZCIsIGFzIHRoZSB0eXBlbWFwcy4gVGhlCgkgICAgICBzeW50YXggaXMgYXMgZm9sbG93cwogCiAgICAgICAgICAgICAgICAlZnJhZ21lbnQoIm5hbWUiLCJoZWFkZXIiKSAKICAgICAgICAgICAgICAgICAgeyAvKiBhIHR5cGUgaW5kZXBlbmRlbnQgZnJhZ21lbnQgKG9sZCBzeW50YXgpICovIH0KICAgICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZSIge1R5cGV9LCAiaGVhZGVyIikgCiAgICAgICAgICAgICAgICAgIHsgLyogdGhlIGZyYWdtZW50IGlzIHR5cGUgZGVwZW5kZW50ICovfQogCiAgICAgICAgICAgICAgTm93IGZyYWdtZW50cyBjYW4gYWxzbyBiZSB1c2VkIGluc2lkZSB0ZW1wbGF0ZXM6IAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgJWZyYWdtZW50KCJpbmNvZGUie0E8VD59LCJoZWFkZXIiKSB7CgkJICAgICAgLyogJ2luY29kZScgc3BlY2lhbGl6ZWQgZnJhZ21lbnQgKi8KCQkgICB9CiAKCQkgICAldHlwZW1hcChpbixmcmFnbWVudD0iaW5jb2RlIntBPFQ+fSkgewoJCSAgICAgIC8qCgkJICAgICAgICAgaGVyZSB3ZSB1c2UgdGhlICd0eXBlIHNwZWNpYWxpemVkJyAKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ICJpbmNvZGUie0E8VD59CiAgICAgICAgICAgICAgICAgICAgICAqLwoJCSAgICB9CiAgICAgICAgICAgICAgICB9OwoJCQkgICAgIAkKCjAzLzExLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3IgYnVnIHdoaWNoIG1lYW50IHRoYXQgc29tZSB2aXJ0dWFsIGZ1bmN0aW9ucyBvdmVycmlkZGVuIGluCiAgICAgICAgICAgIEphdmEgd2VyZSBub3QgYmVpbmcgY2FsbGVkIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMuIEJ1ZyByZXBvcnRlZCBhbmQgZml4ZWQKICAgICAgICAgICAgYnkgUm9iZXJ0IGRlIFZyaWVzIGFuZCBTY290dCBNaWNoZWwuCgowMy8wMi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIGRvbid0IGZvcmdldCB0byBjaGVjayB0aGUgdHlwZSBvZiBzdHJpbmcgYXJndW1lbnRzLgoKMDIvMjQvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtbmFtZXNwYWNlIDxuYW1lPi4gVGhpcyBhbGxvd3Mgb25lIHRvIHNwZWNpZnkKICAgICAgICAgICAgYSBDIyBuYW1lc3BhY2UgaW50byB3aGljaCBhbGwgQyMgY2xhc3NlcyBhcmUgZ2VuZXJhdGVkLgoKMDIvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKSAKCSAgICBbTXpTY2hlbWVdIFVzZSBGVU5DX05BTUUgcmF0aGVyIHRoYW4gYSBib2d1cyB0eXBlbWFwIHZhcmlhYmxlIGZvciBzaWduYWxsaW5nCgkgICAgZXJyb3JzLiAgQ2FsbCBzY2hlbWVfd3JvbmdfdHlwZSB3aXRoIGEgemVyby1iYXNlZCBhcmd1bWVudCBudW1iZXIuICAKCSAgICBSZXBvcnRlZCBieSBPbmRyZWogUGFjb3Zza3ksIFNGICM5MDI2MjEuCgoJICAgIFtHdWlsZV0gRGVmaW5lIEZVTkNfTkFNRSBhbHNvIGluIHRoZSBkaXNwYXRjaCB3cmFwcGVyIGZvciBvdmVybG9hZGVkCgkgICAgZnVuY3Rpb25zLiAgUGF0Y2ggYnkgSm9obiBMZW56LCBTRiAjODk2MjU1LgoKMDIvMjIvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBkb24ndCB0cnkgdG8gaW52b2tlIGEgbnVsbCBkZXN0cnVjdG9yIGZ1bmN0aW9uLgoKMDIvMjAvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIHNvIHRoYXQgdGhlIFNXSUcgc291cmNlIHdpbGwgY29tcGlsZSB1c2luZyB0aGUgRGlnaXRhbCBNYXJzIENvbXBpbGVyCiAgICAgICAgICAgIChmb3JtZXJseSBTeW1hbnRpYyBjb21waWxlcikgb24gV2luZG93cy4gU3VibWl0dGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjAyLzEzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIE5ldyBjb21tYW5kLWxpbmUgYXJndW1lbnQgLW5vaW5pdC4gIFVzZSBpdCBmb3IgYnVpbGRpbmcKCSAgICB0aGUgcnVudGltZSBsaWJyYXJ5LCB3aGVyZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgZnVuY3Rpb25zCgkgICAgc2NoZW1lX2luaXRpYWxpemUgZXRjLiAgUmVwb3J0ZWQgYnkgVGltIEJyb3duLCBTRiAjODkxNzU0LgoKCSAgICBbTXpTY2hlbWVdIERvbid0IHByb2R1Y2UgaW52YWxpZCBDIGNvZGUgd2hlbiBpbnZva2VkIHdpdGggdGhlCgkgICAgLWRlY2xhcmVtb2R1bGUgb3B0aW9uLiAgUmVwb3J0ZWQgYnkgVGltIEJyb3duLCBTRiAjODkxMTA4LgoJICAgIAoJICAgIFtHdWlsZV0gQnVpbGQgdGhlIHJ1bnRpbWUgbGlicmFyeSB3aXRoIHBhc3NpdmUgbGlua2FnZSwgdG8gcmVuYW1lCgkgICAgdGhlIFNXSUdfaW5pdCBmdW5jdGlvbiB1bmlxdWVseS4KCjAyLzEyLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFBhdGNoIHN1Ym1pdHRlZCBieSBCaWxsIEhvZmZtYW4gd2hpY2ggcHJldmVudHMgU1dJRyBmcm9tIGNyYXNoaW5nCiAgICAgICAgICAgIHdoZW4gYSBmaWxlIGZvciB0aGUgdHlwZXdyYXBwZXIgY2xhc3MgY2Fubm90IGJlIG9wZW5lZC4KCjAyLzExLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIE92ZXJsb2FkaW5nIGNoYW5nZXM6CiAgICAgICAgICAgICAgLSBNZXRob2RzIHdoaWNoIGFyZSBvdmVybG9hZGVkIGluIGNvbnN0IG9ubHkgbm8gbG9uZ2VyIGdlbmVyYXRlIEphdmEKICAgICAgICAgICAgICAgIGNvZGUgdGhhdCB3b24ndCBjb21waWxlIC0gdGhlIGZpcnN0IG1ldGhvZCBwYXJzZWQgaXMgdXNlZCBhbmQgYQogICAgICAgICAgICAgICAgd2FybmluZyBpcyBkaXNwbGF5ZWQuIE5vdGUgdGhhdCB0aGlzIGJlaGF2aW91ciBpcyBzbGlnaHRseSBkaWZmZXJlbnQKICAgICAgICAgICAgICAgIHRvIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdoaWNoIGFsd2F5cyB1c2VzIHRoZSBub24tY29uc3QgbWV0aG9kLgogICAgICAgICAgICAgIC0gV2FybmluZyBtZXNzYWdlcyA1MDkgYW5kIDUxMiByZXBsYWNlZCBieSBuZXcgd2FybmluZyBudW1iZXIgNTE2LCB3aGljaCAKICAgICAgICAgICAgICAgIGlzIG1vcmUgcmVsZXZhbnQgdG8gdGhlc2Ugc3RhdGljYWxseSB0eXBlZCBsYW5ndWFnZXMgYXMgdGhlIG92ZXJsb2FkZWQKICAgICAgICAgICAgICAgIG1ldGhvZHMgYXJlbid0ICdzaGFkb3dlZCcsIHRoZXkgYXJlIGlnbm9yZWQuCgowMS8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBSZXBsYWNlIHRoZSAia25vd25fY2xhc3NlcyIgaGFzaCB0YWJsZSBieSBhIG5vZGUKCSAgICBhdHRyaWJ1dGUuICBNZXRob2RzIG9mIGNsYXNzZXMgaW4gQysrIG5hbWVzcGFjZXMgbm93IGdldAoJICAgIHRoZSBwcm9wZXIgc3BlY2lhbGl6ZXIgaW4gdGhlIEdPT1BTIGRlY2xhcmF0aW9uLgoJICAgIFJlcG9ydGVkIGJ5IHJtQG1oLWZyZWlidXJnLmRlLgoKMDEvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gVW5pcXVpZnkgdGhlIGFyZ3VtZW50IG5hbWVzIGluIEdPT1BTIHNoYWRvdyBtZXRob2QKCSAgICBkZWNsYXJhdGlvbnMuICBSZXBvcnRlZCBieSBybUBtaC1mcmVpYnVyZy5kZS4KCjAxLzIxLzIwMDQ6IHN1bnNoaW5lIChFcmljIFN1bnNoaW5lKQogICAgICAgICAgICBSZXZpdmVkIHRoZSBOZXh0U3RlcCBwb3J0IG9mIFNXSUcuCgogICAgICAgICAgICBGaXhlZCBmYXRhbCBwcm9ibGVtIGluIERvaFN0cnN0cigpIGNhdXNlZCBieSBkaWZmZXJlbmNlIGluIHN0cnN0cigpCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHdoaWNoIG1hZGUgJWFwcGx5IGJlY29tZSBlbnRpcmVseSBkeXNmdW5jdGlvbmFsLiAgT24KICAgICAgICAgICAgTmV4dFN0ZXAsIHN0cnN0cigiZm9vIiwiIikgZXZhbHVhdGVzIHRvIE5VTEw7IHdoZXJlYXMsIG9uIG1vZGVybgogICAgICAgICAgICBwbGF0Zm9ybXMsIGl0IGV2YWx1YXRlcyB0byAiZm9vIi4gICVhcHBseSByZWxpZXMgZXh0ZW5zaXZlbHkgdXBvbgogICAgICAgICAgICBzdHJzdHIoImZvbyIsIiIpIGV2YWx1YXRpbmcgdG8gbm9uLU5VTEwsIHRoZXJlZm9yZSBpdCBmYWlsZWQKICAgICAgICAgICAgY2F0YXN0cm9waGljYWxseSB3aGVuIGZhY2VkIHdpdGggTmV4dFN0ZXAncyBzdHJzdHIoKS4KCiAgICAgICAgICAgIEFkZGVkIGBib29sJyBjaGVjayB0byBjb25maWd1cmUuaW4gc2luY2UgTmV4dFN0ZXAncyBDKysgY29tcGlsZXIKICAgICAgICAgICAgZG9lcyBub3Qgc3VwcGx5IHRoaXMgdHlwZS4gIHN3aWcuaCBub3cgZmFrZXMgdXAgYGJvb2wnIGlmIG5lZWRlZC4KCiAgICAgICAgICAgIFdvcmtlZCBhcm91bmQgTmV4dFN0ZXAgQysrIGNvbXBpbGVyIGJ1ZyBpbiB3aGljaCBDKysgY29kZSBpcwogICAgICAgICAgICBkaXNhbGxvd2VkIGluc2lkZSBleHRlcm4gIkMiIGZ1bmN0aW9ucy4gIFRoaXMgcHJvYmxlbSBhZmZlY3RlZCBhbGwKICAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcywgc2luY2UgdGhleSBwdWJsaXNoIGhvb2sgZnVuY3Rpb25zIG9mIHRoZSBmb3JtOgogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqc3dpZ19mb28odm9pZCkgeyByZXR1cm4gbmV3IEZPTygpOyB9CiAgICAgICAgICAgIEZpeGVkIGJ5IGNyZWF0aW5nIGEgQysrIHdyYXBwZXI6CiAgICAgICAgICAgICAgICBzdGF0aWMgTGFuZ3VhZ2UgKm5ld19zd2lnX2ZvbygpIHsgcmV0dXJuIG5ldyBGT08oKTsgfQogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqc3dpZ19mb28odm9pZCkgeyByZXR1cm4gbmV3X3N3aWdfZm9vKCk7IH0KCiAgICAgICAgICAgIEVuc3VyZWQgdGhhdCBTd2lnX2NvcHlfc3RyaW5nKCkgaXMgdXNlZCBpbiBwbGFjZSBvZiBzdHJkdXAoKSBzaW5jZQogICAgICAgICAgICBOZXh0U3RlcCBkb2VzIG5vdCBzdXBwbHkgc3RyZHVwKCkuCgogICAgICAgICAgICBGaXhlZCBkZXRlY3Rpb24gb2YgUnVieSBsaWJyYXJ5IG5hbWUgYW5kIGxvY2F0aW9uIGluIGNvbmZpZ3VyZS5pbi4KICAgICAgICAgICAgUHJvYmxlbSAxOiBBc3N1bWVkIHRoYXQgbGlicmFyeSBhbHdheXMgcmVzaWRlZCBpbiBSdWJ5J3MgImFyY2hkaXIiLAogICAgICAgICAgICB3aGljaCB3YXMgY29ycmVjdCBmb3IgUnVieSAxLjYueCwgYnV0IHdoaWNoIGlzIGluY29ycmVjdCBmb3IgUnVieQogICAgICAgICAgICAxLjgueCwgaW4gd2hpY2ggY2FzZSB0aGUgbGlicmFyeSBub3JtYWxseSByZXNpZGVzIGluIFJ1YnkncwogICAgICAgICAgICAibGliZGlyIi4gIFByb2JsZW0gMjogQXNzdW1lZCB0aGF0IHRoZSBsaWJyYXJ5IGNvdWxkIGFsd2F5cyBiZQogICAgICAgICAgICBsaW5rZWQgdmlhICItbCIrUlVCWV9JTlNUQUxMX05BTUUgKHdoZXJlIFJVQllfSU5TVEFMTF9OQU1FCiAgICAgICAgICAgIHR5cGljYWxseSBpcyAicnVieSIpLCBob3dldmVyIHRoaXMgZmFpbGVkIGZvciBwbGF0Zm9ybXMsIHN1Y2ggYXMKICAgICAgICAgICAgTmV4dFN0ZXAsIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuICBJbiB0aGlzIGNhc2UsIHRoZQogICAgICAgICAgICBzdGF0aWMgbGlicmFyeSBuYW1lIGluIDEuOC54IGlzIGxpYnJ1Ynktc3RhdGljLmEsIHRodXMKICAgICAgICAgICAgLWxydWJ5LXN0YXRpYyBpcyByZXF1aXJlZC4gIFRoZSBuZXcgbG9naWMgd29ya3MgY29ycmVjdGx5IGZvcgogICAgICAgICAgICBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJpZXMgZm9yIDEuNi54IGFuZCAxLjgueC4KCiAgICAgICAgICAgIEZpeGVkIGRldGVjdGlvbiBvZiBQZXJsIENGTEFHUyBpbiBjb25maWd1cmUuaW4gZm9yIE5leHRTdGVwLgogICAgICAgICAgICBEZXRlY3Rpb24gY29kZSBleHRyYWN0ZWQgQ0ZMQUdTIGZyb20gUGVybCdzICVDb25maWcgaGFzaCBidXQKICAgICAgICAgICAgbmVnbGVjdGVkIHRvIGFkZCBhIG5ld2xpbmUgdG8gdGhlIHZhbHVlIGJlZm9yZSBwYXNzaW5nIGl0IHRocm91Z2gKICAgICAgICAgICAgYHNlZCcuICBOZXh0U3RlcCdzIGFuY2llbnQgYHNlZCcgZGlzY2FyZHMgaW5wdXQgd2hpY2ggaXMgbm90CiAgICAgICAgICAgIHRlcm1pbmF0ZWQgd2l0aCBhIG5ld2xpbmUsIHRodXMgUGVybCBDRkxBR1MgYWx3YXlzIGV2YWx1YXRlZCB0byB0aGUKICAgICAgICAgICAgZW1wdHkgc3RyaW5nLgoKMDEvMTYvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRpZHkgdXAgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIHRoYXQgaXMgZ2VuZXJhdGVkIHdoZW4KICAgICAgICAgICAgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBhcmUgd3JhcHBlZCB3aXRoIHRoZSB0aHJvd3MgdHlwZW1hcC4KICAgICAgICAgICAgVGhpcyByZWR1bmRhbnQgY29kZSBpcyBubyBsb25nZXIgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIGNhdGNoKC4uLikgewogICAgICAgICAgICAgICAgICAgIHRocm93OyAKICAgICAgICAgICAgICAgIH0KCjAxLzEyLzIwMDQ6IHdzZnVsdG9uIG9uIGJlaGFsZiBvZiBtbWF0dXMgKG1hcmNlbG8gbWF0dXMpIAogICAgICAgICAgICBpZiBhIG1ldGhvZCB1c2VzICVleGNlcHRpb24gYW5kIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIHVzZQogICAgICAgICAgICBvZiB0aGUgdGhyb3dzIHR5cGVtYXAsIHRoZSBjb2RlIGluIGEgdGhyb3dzIHR5cGVtYXAgd2lsbCBiZQogICAgICAgICAgICBnZW5lcmF0ZWQgaW5zaWRlIHRoZSB0cnkgYm9keS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleGNlcHRpb24gbWV0aG9kIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBhY3Rpb24gCiAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGludCBpKSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpbnQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBnZW5lcmljIGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzKSBFeGNlcHQgJXsKICAgICAgICAgICAgICAgIC8vIHRocm93cyB0eXBlbWFwIEV4Y2VwdCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIGNsYXNzIEV4Y2VwdCB7fTsKICAgICAgICAgICAgICB2b2lkIG1ldGhvZChpbnQgaSkgdGhyb3cgKEV4Y2VwdCk7CgogICAgICAgICAgICBXaWxsIGdlbmVyYXRlOgoKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgYWN0aW9uIAogICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QoYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHQgJl9lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3dzIHR5cGVtYXAgRXhjZXB0IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICB9IGNhdGNoIChpbnQgaSkgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGludCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGdlbmVyaWMgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIEFzIGNhbiBiZSBzZWVuLCB0aGUgaW5uZXIgdHJ5IGNhdGNoIGJsb2NrIGlzIGZvciB0aGUgdGhyb3dzIHR5cGVtYXBzLgogICAgICAgICAgICBQcmV2aW91c2x5LCB0aGlzIHdhcyByZXZlcnNlZCBzbyB0aGF0IHRoZSBpbm5lciB0cnkgY2F0Y2ggYmxvY2sKICAgICAgICAgICAgd2FzIHRoZSAlZXhjZXB0aW9uIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlLCBpdCB3b3VsZCBoYXZlIGJlZW4KICAgICAgICAgICAgaW1wb3NzaWJsZSB0byBjYXRjaCBFeGNlcHQgYXMgdGhlIGNhdGNoIGFsbCAoLi4uKSB3b3VsZCBjYXRjaCB0aGUKICAgICAgICAgICAgZXhjZXB0aW9uIGluc3RlYWQuCgpWZXJzaW9uIDEuMy4yMSAoSmFudWFyeSAxMSwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMS8xMC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGhlIG91dHB1dCBmb3JtYXQgZm9yIGJvdGggd2FybmluZ3MgYW5kIGVycm9ycyBjYW4gYmUgc2VsZWN0ZWQgZm9yCiAgICAgICAgICAgIGludGVncmF0aW9uIHdpdGggeW91ciBmYXZvdXJpdGUgSURFL2VkaXRvci4gRWRpdG9ycyBhbmQgSURFcyBjYW4gdXN1YWxseQogICAgICAgICAgICBwYXJzZSBlcnJvciBtZXNzYWdlcyBhbmQgaWYgaW4gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdCB3aWxsIGVhc2lseSB0YWtlIHlvdSAKICAgICAgICAgICAgZGlyZWN0bHkgdG8gdGhlIHNvdXJjZSBvZiB0aGUgZXJyb3IuIFRoZSBzdGFuZGFyZCBmb3JtYXQgaXMgdXNlZCBieSAKICAgICAgICAgICAgZGVmYXVsdCBleGNlcHQgb24gV2luZG93cyB3aGVyZSB0aGUgTWljcm9zb2Z0IGZvcm1hdCBpcyB1c2VkIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAkIHN3aWcgLXB5dGhvbiAtRnN0YW5kYXJkIGV4YW1wbGUuaQogICAgICAgICAgICAgICAgZXhhbXBsZS5pOjQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KICAgICAgICAgICAgICAgICQgc3dpZyAtcHl0aG9uIC1GbWljcm9zb2Z0IGV4YW1wbGUuaQogICAgICAgICAgICAgICAgZXhhbXBsZS5pKDQpOiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgowMS8wOS8yMDA0OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODcxOTA5IF0gc2ltcGxlIG5hbWVzcGFjZSBwcm9ibGVtLgogICAgICAgICAgICBUaGlzIHdhcyBhIHByb2JsZW0gdXNpbmcgYW5vbnltb3VzIHN0cnVjdHVyZXMgaW4gYSBuYW1lc3BhY2UuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCAgewogICAgICAgICAgICAgICAgICAgICAgaW50IG47CiAgICAgICAgICAgICAgICAgICB9IFM7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zaCBDaGVycnkuCgowMS8wOS8yMDA0OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgYnJva2VuIFBlcmwgZXhhbXBsZXMuCgoxMi8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEgYW5kIEMjXSBGaXhlcyBmb3Igd3JhcHBpbmcgY292YXJpYW50IChwb2x5bW9ycGhpYykgcmV0dXJuIHR5cGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFzZSB7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgfkJhc2UoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBCYXNlKiBjb3B5KCkgY29uc3QgPSAwOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgRGVyaXZlZCogY29weSgpIGNvbnN0OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBEZXJpdmVkOjpjb3B5IHByb3h5IG1ldGhvZCByZXR1cm5zIEJhc2Ugbm90IERlcml2ZWQuIEEgd2FybmluZyBpcyBpc3N1ZWQKICAgICAgICAgICAgYWJvdXQgdGhpcy4gUHJldmlvdXNseSB0aGUgcG9pbnRlciB1c2VkIGJ5IHRoZSBwcm94eSBjbGFzcyB3YXMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgdHJlYXRlZCBhcyBhIEJhc2UqIGluc3RlYWQgb2YgYSBEZXJpdmVkKi4KCjEyLzE4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggc28gdGhhdCBXaW5kb3dzIHBhdGhzIGFyZSBkaXNwbGF5ZWQgY29ycmVjdGx5IHdoZW4gcmVwb3J0aW5nIGVycm9ycy4KICAgICAgICAgICAgQW4gZXJyb3IgcHJldmlvdXNseSB3b3VsZCBoYXZlIGJlZW4gc2hvd24gc29tZXRoaW5nIGxpa2U6CgogICAgICAgICAgICAgIC4/eGFtcGxlLmk6MTQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCiAgICAgICAgICAgIGluc3RlYWQgb2Y6CgogICAgICAgICAgICAgIC5cZXhhbXBsZS5pOjE0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgoKVmVyc2lvbiAxLjMuMjAgKERlY2VtYmVyIDE3LCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8xNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIExhc3QgbWludXRlIG1vZGlmaWNhdGlvbnMuICAgUGVybDUgbW9kdWxlIG5vdyBnZW5lcmF0ZXMgc2hhZG93IGNsYXNzZXMKICAgICAgICAgICAgYnkgZGVmYXVsdCBsaWtlIGFsbCBvZiB0aGUgb3RoZXIgbW9kdWxlcy4gIFBIUDQgd3JhcHBlcnMgbm8gbG9uZ2VyCiAgICAgICAgICAgIGluY2x1ZGUgImNvbmZpZy5oIi4gCgoxMi8xNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFdlYWtlbmVkIHdhcm5pbmcgbWVzc2FnZSByZWxhdGVkIHRvIGNvbnN0cnVjdG9yIG5hbWVzIHNvIHRoYXQgYW4KICAgICAgICAgICAgdW51c3VhbCBuZXN0ZWQtY2xhc3Mgd3JhcHBpbmcgdGVjaG5pcXVlIHdvdWxkIHdvcmsgYWdhaW4gKGFwcGFyZW50bHkKICAgICAgICAgICAgaXQgd29ya2VkIGluIHNvbWUgb2xkZXIgU1dJRyByZWxlYXNlcykuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBTY29wZSB7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzc0E7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzc0I7CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlOjpDbGFzc0EgewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGU6OkNsYXNzQiB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlOiAgVGhlcmUgaXMgc3RpbGwgc29tZSBvZGQgaW50ZXJhY3Rpb24gd2l0aCB0aGUgU1dJRyBzeW1ib2wKICAgICAgICAgICAgdGFibGUvdHlwZSBzeXN0ZW0gdGhhdCB3aWxsIG5lZWQgdG8gYmUgbG9va2VkIGF0IGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEd1c3Rhdm8gTmllbWV5ZXIuCgoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm90ZWN0ZWQgY2xhc3MgbWV0aG9kcyBhcmUgd3JhcHBlZCBhcyBwcm90ZWN0ZWQgSmF2YSBtZXRob2RzIAogICAgICAgICAgICB3aGVuIHVzaW5nIHRoZSBkaXJwcm90IGRpcmVjdG9yIGZlYXR1cmUuIFRoaXMgY2FuIGJlIGNoYW5nZWQgdXNpbmcKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgdG8gc29tZXRoaW5nIGVsc2Ugc2hvdWxkIHRoZSBuZWVkIGFyaXNlLCBmb3IKICAgICAgICAgICAgZXhhbXBsZSwgcHJpdmF0ZSBvciBwYWNrYWdlIGFjY2Vzcy4KCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIAogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyAoSmF2YSkgYW5kICVjc21ldGhvZG1vZGlmaWVycyAoQyMpIG9wZXJhdGUgc2xpZ2h0bHkgCiAgICAgICAgICAgIGRpZmZlcmVudGx5LiBQcmV2aW91c2x5IHRoaXMgZmVhdHVyZSBoYWQgdG8gYmUgcHJlc2VudCB0byBzZXQgdGhlIG1ldGhvZAogICAgICAgICAgICBtb2RpZmllcnMuIE5vdyBpdCBpcyBvbmx5IHVzZWQgaWYgaXQgZXhpc3RzIGZvciB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzICJwdWJsaWMiIGFzIHByZXZpb3VzIGhvd2V2ZXIsIHdoZW4gd3JhcHBpbmcgcHJvdGVjdGVkCiAgICAgICAgICAgIGRpcmVjdG9yIG1ldGhvZHMgaXQgaXMgInByb3RlY3RlZCIuIFRoaXMgY2hhbmdlIHdpbGwgbm90IGFmZmVjdCBleGlzdGluZwogICAgICAgICAgICB1c2Ugb2YgdGhlICVqYXZhbWV0aG9kbW9kaWZpZXJzIG9yICVjc21ldGhvZG1vZGlmaWVycy4KCjEyLzExLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgVGhpcyBmaXggc29tZSByZWN1cnJpbmcgcmVwb3J0cyBhYm91dCBrZXl3b3JkcyBub3QgYmVlbgoJICAgIHByb3Blcmx5IGlkZW50aWZpZWQgYW5kIHdhcm5lZCwgYW5kIGl0IHNvbHZlcyB0aGUgcHJvYmxlbQoJICAgIG9mIGhvdyB0byBhZGQgYSB0ZXN0IGZpbGUgdG8gdGhlIHRlc3Qtc3VpdGUgc3VjaCB0aGF0IGl0CgkgICAgZG9lc24ndCB1c2UgYW55IGtleXdvcmQgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzCgkgICAgKGFuZCBkb2luZyBpdCB3aXRob3V0IGNvbXBpbGluZyB0aGUgdGVzdCBmb3IgYWxsIHRoZQoJICAgIHN1cHBvcnRlZCBsYW5ndWFnZXMsIHRoaW5nIHRoYXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSwKCSAgICBhbmQgd2l0aG91dCByZXF1aXJpbmcgeW91IHRvIGtub3cgYWxsIHRoZSBzdXBwb3J0ZWQKCSAgICBsYW5ndWFnZSBrZXl3b3JkcywgdGhpbmcgdGhhdCBpcyBhbHdheXMgaW1wb3NzaWJsZSkuCgoJICAgIFNvIHRoZXNlIGFyZSB0aGUgY2hhbmdlcyBnbG9iYWxseSBzcGVha2luZzoKCgkgICAgLSBVbmlmb3JtIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBrZXl3b3JkIHdhcm5pbmdzIHRocm91Z2gKCSAgICAgIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBhbGwgdGhlIGxhbmd1YWdlcyBoYXMgbm93IGEKCSAgICAgIHNlcGFyYXRlIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBrZXl3b3JkcyBvciBiYWQgbmFtZXM6CgoJCSAgcHl0aG9uL3B5dGhvbmt3LnN3ZwoJCSAgY2hpY2tlbi9jaGlja2Vua3cuc3dnCiAgICAgICAgICAgICAgICAgIC4uLi4KCgkgICAgLSBBZGRlZCBrZXl3b3JkIGxpc3QgZm9yIG1vc3Qgb2YgdGhlIGxhbmd1YWdlcyB0aGF0IGRpZG4ndAoJICAgICAgaGF2ZSBvbmUgKHVzaW5nIHRoZSBuZXcgc2VwYXJhdGVkIGZpbGUpLgoJCSAgICAJICAgIAoJICAgIC0gQWRkZWQgdGhlICJBbGwga2V5d29yZHMiIHdhcm5pbmcgc3VwcG9ydDogLVdhbGxrdyBvcHRpb24uCgogICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gaW5jbHVkZSBhbGwgdGhlIGtub3duIGtleXdvcmRzCgkgICAgICBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLCBhbmQgY2FuIGJlIHVzZWQgYXM6CgogICAgICAgICAgICAgICAgIHN3aWcgLVdhbGxrdyAuLi4uCgkgICAgCgkgICAgICBUaGlzIHdpbGwgaGVscCB0byB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgYSB0ZXN0LXN1aXRlCgkgICAgICBmaWxlIHRoYXQgY2FuIGJlIGNvbXBpbGVkIGluIGFsbCB0aGUgc3dpZyBzdXBwb3J0ZWQKCSAgICAgIGxhbmd1YWdlcywgYW5kIGl0IHdpbGwgYmUgYWxzbyBoZWxwZnVsIGZvciB1c2VycyB3aG8KCSAgICAgIHdhbnQgdG8gY3JlYXRlIG11bHRpLWxhbmd1YWdlIGxpYnJhcmllcy4KCSAgICAKCSAgICBBbmQgdGhlc2UgYXJlIHRoZSBkZXRhaWxlZCBjaGFuZ2VzIChtb3N0bHkgZmlsZSBhZGRpdGlvbik6CgoJICAgIC0gRm9yIHRoZSBsYW5ndWFnZXMgdGhhdCBhbHJlYWR5IGhhdmUgc29tZSBzb3J0IG9mIGtleXdvcmQKCSAgICAgIHdhcm5pbmcgbGlzdCwgbW92ZSBpdCB0byBhbiBleHRlcm5hbCBsYW5ndWFnZWt3LnN3ZwoJICAgICAgZmlsZSwgaWU6CgkgICAgCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gcHl0aG9uLnN3ZyAtPiBweXRob25rdy5zd2cKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSBjaGlja2VuLnN3ZyAtPiBjaGlja2Vua3cuc3dnCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gdGNsOC5zd2cgLT4gdGNsa3cuc3dnCiAKICAgICAgICAgICAgICBhbmQgcmUtaW5jbHVkZSBsYW5ndWFnZWt3LnN3ZyBmcm9tIGxhbmd1YWdlLnN3Zy4KCSAgICAKCSAgICAtIEZvciB0aGUgbGFuZ3VhZ2UgdGhhdCBkaWRuJ3QgaGF2ZSBhIGtleXdvcmQgbGlzdCwgYW5kCgkgICAgICBmb3IgdGhlIG9uZXMgdGhhdCBJIGNvdWxkIGZpbmQgYSBsaXN0LCBhZGQgdGhlCgkgICAgICBsYW5ndWFnZWt3LnN3ZyBmaWxlLCBpZToKCiAgICAgICAgICAgICAgICAgY3NoYXJwL2NzaGFycGt3LnN3ZwogICAgICAgICAgICAgICAgIGphdmEvamF2YWt3LnN3ZwogICAgICAgICAgICAgICAgIHBocDQvcGhwa3cuc3dnCgkJIHBpa2UvcGlrZWt3LnN3ZwkgCgkJIHJ1YnkvcnVieWt3LnN3ZwoKCiAgICAgICAgICAgICAgYWxzbyBhZGQgYSBsaW5lIGluIGxhbmd1YWdlLnN3ZyB0byBpbmNsdWRlCgkgICAgICBsYW5ndWFnZWt3LnN3ZywgYnV0IG5vdyBpdCBpcyBjb21tZW50ZWQhISEsIGxpa2UgaW4KCSAgICAgIGphdmEuc3dnOgoKICAgICAgICAgICAgICAgICAgLyogamF2YSBrZXl3b3JkcyAqLwogICAgICAgICAgICAgICAgICAvKiBwbGVhc2UgdGVzdCBhbmQgYWN0aXZhdGUgKi8KICAgICAgICAgICAgICAgICAgLy8laW5jbHVkZSAiamF2YWt3LnN3ZyIKCgkgICAgICBpZSwgdGhlcmUgd2lsbCBiZSBubyBjaGFuZ2UgaW4gaG93IHN3aWcgcnVucyBub3JtYWxseQoJICAgICAgdW50aWwgdGhlIGxhbmd1YWdlIG1haW50YWluZXIgdGVzdCBhbmQgdW5jb21tZW50IHRoYXQKCSAgICAgIGxpbmUuCgkgICAgICAKCSAgICAgIFNvLCBwbGVhc2UgY2hlY2sgZWFjaCBsYW5ndWFnZWt3LnN3ZyBmaWxlIChJIGxlZnQgdGhlCgkgICAgICBsaW5rIHRvIHRoZSBrZXl3b3JkIGxpc3Qgc291cmNlIGZvciBjaGVja2luZyksIGFuZCBhZnRlcgoJICAgICAgdGVzdGluZywgdW5jb21tZW50IHRoZSAlaW5jbHVkZSBsaW5lLgoKCSAgICAtIEFkZGVkIHRoZSBmaWxlIGFsbGt3LnN3Zywgd2hpY2ggaW5jbHVkZXMgYWxsIHRoZQogICAgICAgICAgICAgIGxhbmd1YWdla3cuc3dnIGZpbGVzLgoKCSAgICAgIEZvciB0aGUgbGFuZ3VhZ2VzIHRoYXQgaGFzIG5vIGxhbmd1YWdla3cuc3dnIGZpbGUgcmlnaHQKCSAgICAgIG5vdywgYW5kIGlmIHRoZXkgbmVlZCBvbmUsIGFkZCB0aGUgZmlsZSBpbnRvIHRoZQoJICAgICAgbGFuZ3VhZ2UgZGlyZWN0b3J5LCBhbmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGluY2x1ZGUKCSAgICAgIGxpbmUgaW50byB0aGUgYWxsa3cuc3dnIGZpbGUuCgkgICAgICAKCSAgICAtIEFkZGVkIHRoZSAtV2FsbGt3IHRoYXQgaW5jbHVkZXMgdGhlIGFsbGt3LnN3ZyBmaWxlLgoJICAgICAgTm90ZSB0aGF0IHRoZSBvbGQgLWxhbGxrdy5zd2cgb3B0aW9uIGNvdWxkbid0IGJlIHVzZWQKCSAgICAgIHNpbmNlIGl0IGluY2x1ZGUgdGhlIGZpbGUgYWZ0ZXIgaXQgd291bGQgYmUgbmVlZGVkLgoKCgkgICAgSG9wZWZ1bGx5LCB0aGUgLVdhbGxrdyBvcHRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZGVmYXVsdAoJICAgIHJ1bGVzIGluIHRoZSByZWxhdGVkIHRlc3Qtc3VpdGUgTWFrZWZpbGVzLCBzbywgd2hlbgoJICAgIGNyZWF0aW5nIGEgbmV3IHRlc3QsIG9yIGFkZGluZyBhIG5ldyBzd2lnIGxpYnJhcnkgZmlsZQoJICAgIChsaWtlIF9zdGRfZGVxdWUuaSksIHN3aWcgd2lsbCB3YXJuIHlvdSBpZiB5b3UgYXJlIHVzaW5nIGEKCSAgICBiYWQgbmFtZSwgY29uc2lkZXJpbmcgYWxsIHRoZSBsYW5ndWFnZSB3aGVyZSBpdCBuZWVkcyB0bwoJICAgIHJ1bi4KCSAgICAKCSAgICBSaWdodCBub3cgeW91IGNhbiB0ZXN0IGl0IGJ5IHVzaW5nOgoKICAgICAgICAgICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZSBTV0lHPSJzd2lnIC1XYWxsa3ciCgoJICAgIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgdGFyZ2V0IGxhbmd1YWdlLCBpdCBkb2Vzbid0IG1hdHRlci4KCgkgICAgQW5kIHllcywgdGhlcmUgYXJlIHNldmVyYWwgZXhhbXBsZXMgdGhhdCBhcmUgdXNpbmcKCSAgICByZXNlcnZlZCBrZXl3b3Jkcywgc3BlY2lhbGx5IGZyb20gY3NoYXJwLgogICAgICAgICAgCgkgICAgKioqIFJlbWVtYmVyICoqKio6IHRoZSBuZXcga2V5d29yZCB3YXJuaW5nIGxpc3RzIGFyZSBub3QKCSAgICBpbmNsdWRlZCBieSBkZWZhdWx0IGluIGFueSBvZiBsYW5ndWFnZSB0aGF0IGJlZm9yZSBkaWRuJ3QKCSAgICBoYXZlIG9uZS4gVG8gZW5hYmxlIHRoZSBrZXl3b3JkIHdhcm5pbmdzIGFzIHRoZSBkZWZhdWx0CgkgICAgYmVoYXZpb3IsIHRoZSBpbmNsdXNpb24gb2YgdGhlIGxhbmd1YWdla3cuc3dnIGZpbGUgaGFzIHRvCgkgICAgYmUgdW5jb21tZW50ZWQgYXQgZWFjaCBsYW5ndWFnZS5zd2cgZmlsZS4KCgkgICAgU28sIGFsbCB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lcnMsIHBsZWFzZSBjaGVjayB0aGUKCSAgICBrZXl3b3JkcyBsaXN0LiAKCgkgICAgQWxzbywgeW91IGNhbiBhZGQgYnVpdC1pbiBuYW1lcywgYW5kIG5vdCBvbmx5IGtleXdvcmRzLCBsaWtlCgkgICAgJ1RydWUvRmFsc2UnIGluIHB5dGhvbi4gIFJlbWVtYmVyIHRoYXQgeW91IGNhbiBiZSBtb3JlCgkgICAgc3BlY2lmaWMgYW5kIHJlZmVyIG9ubHkgdG8gbWVtYmVyIG5hbWVzLCBsaWtlICo6OmNvbmZpZ3VyZQoJICAgIG9yICo6OmNnZXQgKHNlZSBhbiBleGFtcGxlIGluIHRoZSB0Y2w4L3RjbDhrdy5zd2cgZmlsZSksCgkgICAgb3Igb25seSBnbG9iYWwgbmFtZXMsIGxpa2UgOjpyYW5nZSAoc2VlIGFuIGV4YW1wbGUgaW4gdGhlCgkgICAgcHl0aG9uL3B5dGhvbmt3LnN3ZyBmaWxlLgoKCSAgICBKdXN0IHRvIGJlIGNvbnNpc3RlbnQsIHVzZSB0aGUgZm9sbG93aW5nIGNvZGVzOgoKCSAgICAtIFVzZSBjb2RlIDMxNCBmb3Iga2V5d29yZCBhbmQvb3IgZmF0YWwgYmFkIG5hbWVzLgoJICAgIC0gVXNlIGNvZGUgMzIxIGZvciBidWl0LWluIGFuZC9vciBub3QgZmF0YWwgYmFkIG5hbWVzLgogICAgICAgICAgIAogICAgICAgICAgICBzbywgdGhleSBjYW4ndCBiZSBkaXNhYmxlZC9lbmFibGVkIGluZGVwZW5kZW50bHkgKHNlZQoJICAgIHB5dGhvbi9weWh0b25rdy5zd2cgZm9yIGV4YW1wbGVzKS4KCgkgICAgKioqKiBBbmQgZG9uJ3QgYWRkIGFueSBuZXcgdGVzdCBmaWxlIHdpdGhvdXQgY2hlY2tpbmcgaXQKCSAgICB3aXRoIHRoZSAtV2FsbGt3IG9wdGlvbiEhICh0aGF0IGluY2x1ZGVzIG1lKSAqKioqKi4KCSAgCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU0YgYnVnICM4NTQ2MzQKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgYWNjZXB0aW5nIHRoZSBVbml4IGRpcmVjdG9yeSBzZXBhcmF0b3IgJy8nIG9uIAogICAgICAgICAgICBXaW5kb3dzIGFuZCB0aGUgTWFjIGluIGFkZGl0aW9uIHRvIHRoZSBuYXRpdmUgb25lICggJ1wnIG9uIAogICAgICAgICAgICBXaW5kb3dzKS4gVGhpcyBjYW4gYmUgdXNlZCBpbiAlaW1wb3J0LCAlaW5jbHVkZSBhbmQgY29tbWFuZGxpbmUgCiAgICAgICAgICAgIG9wdGlvbnMgdGFraW5nIGEgcGF0aCwgZm9yIGV4YW1wbGUgLUkuIE9uIEN5Z3dpbiwgYm90aCB0aGUgV2luZG93cwogICAgICAgICAgICBhbmQgVW5peCBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNhbiBub3cgYmUgdXNlZCAod2FzICcvJyBvbmx5KS4KICAgICAgICAgICAgCjEyLzEwLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCiAgICAgICAgICAgIFtweXRob25dIEltcGxlbWVudGluZyB0aGUgcnVudGltZSAicmVwcm90ZWN0ZWQiIGRpcmVjdG9yCgkgICAgbWVtYmVycywgaWYgeW91IGhhdmU6CiAgICAKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEI7CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB+QmFyKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGhlbGxvKCkgeyByZXR1cm4gZG9faGVsbG8oKTspCgogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBkb19oaSgpIHtyZXR1cm4gMDt9CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGRvX2hlbGxvKCkge3JldHVybiAwO30KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGVuLCBhdCB0aGUgcHl0aG9uIHNpZGUKCiAgICAgICAgICAgICAgICBpbXBvcnQgbXlfbW9kdWxlCgogICAgICAgICAgICAgICAgY2xhc3MgRm9vKG15X21vZHVsZS5CYXIpOgogICAgICAgICAgICAgICAgICBkZWYgZG9faGVsbG8oc2VsZik6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgIAoJICAgICAgICBiID0gQmFyKCkgIyBQdXJlIEMrKyBEaXJlY3RvciBjbGFzcwogICAgICAgICAgICAgICAgZiA9IEZvbygpICMgQysrIERpcmVjdG9yICsgcHl0aG9uIG1ldGhvZHMKCiAgICAgICAgICAgICAgICBiLmhlbGxvKCkgIyBPaywgYW5kIGl0IGNhbGxzIEMrKyBCYXI6OmRvX2hlbGxvKCkKICAgICAgICAgICAgICAgIGYuaGVsbG8oKSAjIE9rLCBhbmQgaXQgY2FsbHMgUHl0aG9uIEZvbzo6ZG9faGVsbG8oKQoKICAgICAgICAgICAgICAgIGIuZG9faGkoKSAjIFJ1bnRpbWVFcnJvciwgZG9faGkoKSBpcyBwcm90ZWN0ZWQhIQogICAgICAgICAgICAgICAgZi5kb19oaSgpICMgUnVudGltZUVycm9yLCBkb19oaSgpIGlzIHByb3RlY3RlZCEhCiAKICAgICAgICAgICAgICAgIGIuZG9faGVsbG8oKSAjIFJ1bnRpbWVFcnJvciwgZG9faGVsbG8oKSBpcyBwcm90ZWN0ZWQhIQogICAgICAgICAgICAgICAgZi5kb19oZWxsbygpICMgT2ssIHNpbmNlIGl0IGl0cyByZWRlZmluZWQgaW4gcHl0aG9uLgoKICAgICAgICAgICAgSGVyZSBCYXIuZG9faGVsbG8gaXMgYWx3YXlzIHByb3RlY3RlZCwgYnV0IEZvby5kb19oZWxsbwogICAgICAgICAgICBpcyAicHVibGljIiwgYmVjYXVzZSBpdCBpcyByZWRlZmluZWQgaW4gcHl0aG9uLiBCZWZvcmUsCgkgICAgYWxsIHRoZSAnZG9faGVsbG8nIG1ldGhvZHMgd2VyZSBwdWJsaWMuCgoJICAgIFRoaXMgc2VlbXMgdG8gYmUgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBDKysgYW5kIHB5dGhvbgoJICAgIHBoaWxvc29waGllcywgaWUsIGFsbCB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1ldGhvZHMga2VlcAoJICAgIHByb3RlY3RlZCBhdCB0aGUgdXNlciBzaWRlIChDKysgd2F5KSB1bnRpbCB0aGV5IGFyZQoJICAgIHJlZGVmaW5lZCAocHl0aG9uIHdheSwgd2VyZSBhbGwgZGVmaW5lZCBtZXRob2RzIGFyZSBhbHdheXMKCSAgICBwdWJsaWMpLiBBbmQgdGhpcyBpcyBub3Qgb25seSBhIGdvb2QgY29tcHJvbWlzZSwgaXQgYWxzbwoJICAgIHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSB0byBkbyBpdCA6KS4KCgkgICAgTm93IHJ1YnkgaGFzIG5hdGl2ZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVycywgYW5kIHB5dGhvbgoJICAgIHB1cmUgcnVudGltZSBzdXBwb3J0LiBJIGd1ZXNzIHRoZXNlIGFyZSB0aGUgdHdvIHBvc3NpYmxlCgkgICAgZXh0cmVtZSBjYXNlcy4gQW5kIGhvcGVmdWxseSwgdGhleSBjb3VsZCBiZSB1c2VkIGFzCgkgICAgdGVtcGxhdGVzIHRvIG1vZGlmeSB0aGUgb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydAoJICAgIGRpcmVjdG9ycywgc28gdGhleSBjYW4gInJlcHJvdGVjdCIgdGhlIHByb3RlY3RlZCBkaXJlY3RvcgoJICAgIG1lbWJlcnMgYXQgdGhlIHRhcmdldCBsYW5ndWFnZSBzaWRlLgoKCSAgICBUaGlzIGZpbmlzaGVkIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgc3VwcG9ydCBmb3IgdGhlIAoJICAgIHB5dGhvbiBsYW5ndWFnZS4gT2NhbG0gd2lsbCBuZWVkIHRvIGFkZCB0aGUKCSAgICAicmVwcm90ZWN0aW9uIiBsYXRlci4KCjEyLzEwLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgVGhlIGZvbGxvd2luZyBjYXNlIChyZXBvcnRlZCBieSBMeWxlIEpvaG5zb24pIHdhcyBmaXhlZDoKCgkgICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwogCgkgICAgICBjbGFzcyBGb28geyAKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgdm9pZCB5KCk7CgoJICAgICAgcHJvdGVjdGVkOgoJICAgICAgICBpbnQgeDsKCSAgICAgIH07CgoJICAgc3dpZyB3YXJuZWQgdGhhdCB0aGUgc3ltYm9sICd4JyB3YXMgYWxyZWFkeSBkZWZpbmVkLCBhbmQKICAgICAgICAgICB0aGUgcmVuYW1pbmcgZmFpbHMuICd4JyB3YXMgbm90IGVtaXR0ZWQsIHNpbmNlIGl0IGlzCiAgICAgICAgICAgcHJvdGVjdGVkLCBidXQgaXQgd2FzIGtlcHQgaW4gdGhlIHN5bWJvbCB0YWJsZSB3aXRoIHRvbwogICAgICAgICAgIG11Y2ggaW5mb3JtYXRpb24uCgoJICAgTm93IHN3aWcgd29ya3MgZm9yIGFsbCB0aGUgY2FzZXMgKHBsYWluLCBkaXJlY3RvciBhbmQKCSAgIGRpcnByb3QpIGFnYWluLiBUaGlzIHdhcyBmaXhlZCBieSBhbGxvd2luZyB0aGUgcGFyc2VyLnkgdG8KCSAgIGRlY2lkZSBtdWNoIGNsb3NlciB3aGF0IHRvIGRvIHdpdGggJ3gnLiBCZWZvcmUgYWxsIHRoZQoJICAgZGlzY2FyZGluZyBvciBnZW5lcmF0aW9uIHdhcyByZXNvbHZlZCBhdCB0aGUgbGFuZy5jeHgKCSAgIHN0YWdlLiBBbHNvIHRoZSBjaGFuZ2VzIGluIHBhcnNlci55IHRvIGltcGxlbWVudCB0aGUKCSAgIGRpcmVjdG9yIHByb3RlY3RlZCBtb2RlIGFyZSBub3cgbXVjaCBtb3JlIGVuY2Fwc3VsYXRlZCwgYW5kCgkgICB0aGV5IGdldCBkaXNhYmxlZCBpZiB0aGUgbW9kZSBpcyBub3QgZW5hYmxlZC4gQmVmb3JlIHRoZQoJICAgZGVhY3RpdmF0aW9uIHdhcyBkb25lIGF0IHRoZSBnZW5lcmF0aW9uIHN0YWdlIChsYW5nLmN4eCkuCgoJICAgQnkgdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBkaXJlY3RvciBtb2RlIGlzIGVuYWJsZWQsIGFuZAoJICAgJXJlbmFtZSBpcyBkb25lLCByZXVzaW5nIGEgcHJvdGVjdGVkIG1lbWJlciBuYW1lLCB0aGVyZSBpcwoJICAgYSBwYXRob2xvZ2ljYWwgY2FzZToKCgkgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CiAKICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBBIHsKCSAgICAgcHVibGljOgoJICAgICAgIHZvaWQgeSgpOwoKCSAgICAgcHJvdGVjdGVkOgoJICAgICAgIGludCB4OyAgICAgICAgICAgIC8qIHdvcmtzICovCgkgICAgICAgc3RhdGljICBpbnQgeDsgICAgLyogd29ya3MgKi8KCSAgICAgICBzdGF0aWMgIHZvaWQgeCgpOyAvKiB3b3JrcyAqLwoJICAgICAgIHR5cGVkZWYgdm9pZCB4KCk7IC8qIHdvcmtzICovCgoJICAgICAgIHZpcnR1YWwgdm9pZCB4KCk7IC8qIGFsd2F5cyBmYWlscywgYXMgaXQgc2hvdWxkLCBzaW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb286OngoKSB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yICovCgoJICAgICAgIHZvaWQgeCgpOyAvKiBhbHdheXMgZmFpbHMsIGJ1dCBzb21ldGltZXMgaXQgc2hvdWxkbid0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luY2UgdGhlIEZvbzo6eCgpIHdpbGwgbm90IGJlIGVtaXR0ZWQgaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIG5vdCB2aXJ0dWFsICovCgoJICAgICB9OwoKCSAgIFRoZSBsYXN0IGNhc2UgaXMgbm90IGFsd2F5cyByaWdodCBiZWNhdXNlIGF0IHRoZSBwYXJzZXIucHkKCSAgIHN0YWdlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZWNpZGUgaWYgdGhlIHByb3RlY3RlZCBtZW1iZXIKCSAgIEZvbzo6eCgpIGNvdWxkIG9yIG5vdCBjb25mbGljdCB3aXRoIHRoZSByZW5hbWVkIEZvbzo6eSgpLAoJICAgc2luY2UgRm9vOjp4KCkgY291bGQgYmUgdmlydHVhbCBieSBpbmhlcml0YW5jZS4KCgkgICBJIGd1ZXNzIHRoaXMganVzdCBhbiBpbnRyaW5zaWMgbGltaXRhdGlvbiwgYW5kIG5vIG11Y2ggY2FuCgkgICBiZSBkb25lIGFib3V0IGl0IHdpdGhvdXQgcmVzb3J0aW5nIGludG8gbGFyZ2VyIGNoYW5nZXMgdG8KCSAgIHBvc3Rwb25lLCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoZSBtdWx0aXBseSBzeW1ib2wKCSAgIGRldGVjdGlvbiAobGFuZy5jeHggc3RhZ2UpLgoJICAgCgkgICBTbywgYnkgbm93LCBpdCBpcyBqdXN0IGNvbnNpZGVyZWQgYSB3ZWxsIGtub3duICJmZWF0dXJlIiBpbgoJICAgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtb2RlLiBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgaXQgc2VlbXMKCSAgIHRvIGJlIGEgcmFyZSBjYXNlLCBhbmQgaXQgY2FuIGJlIGF2b2lkZWQgYnkgdGhlIHVzZXIgYnkKCSAgIGhpZGluZyAneCcgYmVmb3JlIHJlbmFtaW5nICd5JzoKCgkgICAgICVyZW5hbWUoX3gpIEZvbzo6eCgpOwoJICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwoJICAgCgoxMi8wOC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIHZpcnR1YWwgbWV0aG9kIGRldGVjdGlvbnMgbm93IHByb3Blcmx5CgkgICAgdHJlYXRzIHRoZSBmb2xsb3dpbmcgY2FzZXM6CgogICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7IHR5cGVkZWYgaW50IEludDsgfQoJICAgICBzdHJ1Y3QgQSB7fTsKCSAgICAgdHlwZWRlZiBBIEI7CgogICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgIHZpcnR1YWwgfkZvbygpIHt9CgogICAgICAgICAgICAgICB2aXJ0dWFsIEZvbyogY2xvbmVyKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgaW50IGdldF92YWx1ZSgpID0gMDsKCSAgICAgICB2aXJ0dWFsIEEqIGdldF9jbGFzcygpID0gMDsKCSAgICAgICB2aXJ0dWFsIHZvaWQganVzdF9kb19pdCgpID0gMDsKCSAgICAgfTsKCiAgICAgICAgICAgICBzdHJ1Y3QgQmFyIDogRm9vCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIEJhciogY2xvbmVyKCk7CiAgICAgICAgICAgICAgIGZvbzo6SW50IGdldF92YWx1ZSgpOwogICAgICAgICAgICAgICBCKiBnZXRfY2xhc3MoKTsKICAgICAgICAgICAgICAgdm9pZCBqdXN0X2RvX2l0KCk7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgIEFsbCB0aGUgRm9vIGFuZCBCYXIgbWV0aG9kcyBhcmUgdmlydHVhbC4gIEEgbmV3IGF0dHJpYnV0ZQoJICAgICJ2aXJ0dWFsOnR5cGUiIHJlY29yZCB0aGUgYmFzZSBwb2x5bW9ycGhpYyB0eXBlLiBJbiB0aGUKCSAgICBwcmV2aW91cyBjYXNlcyB3ZSBoYXZlOgoKCSAgICAgICB0eXBlIDogQmFyICAgICAgIHZpcnR1YWw6dHlwZSA6IEZvbwoJICAgICAgIHR5cGUgOiBmb286OkludCAgdmlydHVhbDp0eXBlIDogaW50CgkgICAgICAgdHlwZSA6IEIgICAgICAgICB2aXJ0dWFsOnR5cGUgOiBBCgkgICAgICAgdHlwZSA6IHZvaWQgICAgICB2aXJ0dWFsOnR5cGUgOiB2b2lkCgogICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VmdWwgaW4gbGFuZ3VhZ2VzIChqYXZhK2RpcmVjdG9ycykKCSAgICB0aGF0IGNvdWxkIGhhdmUgcHJvYmxlbXMgcmVkZWZpbmluZyBCYXIqIEJhcjo6Y2xvbmVyKCkuCgoJICAgIElmIHlvdSBuZXZlciBoYWQgY29kZSBsaWtlIHRoZSBhYm92ZSwgeW91IHdpbGwgc2VlIG5vCgkgICAgZWZmZWN0cy4gQnV0IGlmIHlvdSBoYXZlIHNvbWUgY29kZSBsaWtlIHRoYXQsIHlvdQoJICAgIHdpbGwgc2VlIHNvbWUgZWZmZWN0cyBzaW5jZSBzb21lIG1ldGhvZHMgdGhhdAoJICAgIGJlZm9yZSB3ZXJlIG5vdCBwcm9wZXJseSB0cmVhdGVkIGFzIHZpcnR1YWwsCgkgICAgd2lsbCBzdGFydCB0byBhY3QgbGlrZSB0aGF0LiBUaGlzIGNvdWxkIGVubGFyZ2UKCSAgICB5b3VyIGRpcmVjdG9yIGNsYXNzZXMuCgkgICAgCgoxMi8wOC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXIgc3VwcG9ydCAoZGlycHJvdCkKCSAgICBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgoJICAgIAoJICAgIEl0IGNhbiBiZSBlbmFibGUgYnkgdXNpbmcgJy1kaXJwcm90JyBvciBieSBhZGRpbmcKCSAgICB0aGUgb3B0aW9uIHRvIHRoZSBtb2R1bGUgZGVjbGFyYXRpb24sIGxpa2U6CgogICAgICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIsZGlycHJvdD0iMSIpIG15X21vZHVsZQoKCSAgICBUaGlzIG1vZHVsZSBvcHRpb24gd2FzIGFkZGVkIHRvIHByb3Blcmx5IGNvbXBpbGUgdGhlCgkgICAgZGlyZWN0b3JfcHJvdGVjdGVkLmkgYW5kIGRpcmVjdG9yX25lc3RlZC5pIGV4YW1wbGVzLgoJICAgIAoJICAgIFRoZSBmZWF0dXJlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHB5dGhvblsyLjIsMi4zXSAKCSAgICBhbmQgcnVieVsxLjYuN10sIGJvdGggYXQgY29tcGlsYXRpb24gYW5kIHJ1bnRpbWUsIGFuZCAKCSAgICBqYXZhW2oyc2RrMS40LjFfMDFdLCBidXQgb25seSBhdCBjb21waWxhdGlvbiAobXkgamF2YQoJICAgIGluc3RhbGxhdGlvbiBkb2Vzbid0IHJ1biBhbnkgb2YgdGhlIGRpcmVjdG9yIGV4YW1wbGVzLAoJICAgIG9sZHMgbm9yIG5ld3MpLgoKCSAgICBQbGVhc2UgdGVzdCBmb3Igb2NhbWwgYW5kIGphdmEuCgkgICAgCgkgICAgVGhlIGVycm9ycyByZXBvcnRlZCBieSBXaWxsaWFtIGFuZCBTY290dCB3ZXJlIGZpeGVkLAoJICAgIGV4Y2VwdCBmb3IgYSB3YXJuaW5nIGFib3V0ICBTV0lHX0phdmFUaHJvd0V4ZWNwdGlvbigpCgkgICAgbXVsdGlwbHkgZGVmaW5lZC4gSSBjYW4ndCByZXByb2R1Y2UgdGhpcyBlcnJvciB3aXRoIG15CgkgICAgZXhhbXBsZXMuIFdlIHdpbGwgd2FpdCBmb3IgU2NvdHQgdG8gc2VuZCB1cyBhIG1pbmltYWwKCSAgICBjYXNlLgoKCjEyLzA3LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlciBzdXBwb3J0IGhhcyBiZWVuCgkgICAgY29tcGxldGx5IG1vdmVkIG91dCBmcm9tIHB5dGhvbi5jeHgsIGFuZCBub3cKCSAgICByZXNpZGVzIGluIHRoZSBjb21tb24gbGFuZy5jeHgsIGVtaXQuY3h4IGFuZAoJICAgIGFsbG9jYXRlLmN4eCBmaWxlcy4gCgoJICAgIFRoaXMgbWVhbnMgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCB0aGUgb3RoZXIgbGFuZ3VhZ2VzCgkgICAgdGhhdCBjdXJyZW50bHkgc3VwcG9ydCBkaXJlY3RvcnMsIGllLCBweXRob24sIGphdmEsIG9jYWxtCgkgICAgYW5kIHJ1YnkuCgoJICAgIFRoZSBjaGFuZ2UgaGFzIGJlZW4gdGVzdGVkIHdpdGggcHl0aG9uIChjb21waWxhdGlvbitydW50aW1lKQoJICAgIGFuZCBqYXZhIChqdXN0IGNvbXBpbGF0aW9uKS4KCSAgICAKCSAgICBQbGVhc2UgYWRkIHJ1bnRpbWUgdGVzdHMgZm9yIHRoZSBtaXNzaW5nIGxhbmd1YWdlcyAKCSAgICBhbmQgdGVzdCBpdC4KCgkgICAgVGhlICctbm9kaXJwcm90JyBvcHRpb24gd2FzIG1vdmVkIHRvIHRoZSBwcmluY2lwYWwgbWFpbiwKCSAgICBhbmQgY2FuIGJlIHVzZWQgZnJvbSBhbGwgdGhlIGxhbmd1YWdlcy4KCjEyLzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgYW5kIGltcHJvdmVkIGVycm9yIGNoZWNraW5nIG9mIFNUUklOR19PVVQgdHlwZW1hcHMgaW4gCiAgICAgICAgICAgIHZhcmlvdXMuaS4KCjEyLzA0LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgLSBOb3cgdGhlIHZpcnR1YWwgbWVtYmVycyB3aXRoIG5vIGV4cGxpY2l0IGRlY2xhcmF0b3IKCSAgICBhcmUgcHJvcGVybHkgaWRlbnRpZmllZDoKCSAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBBICB7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZigpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBIHsKICAgICAgICAgICAgICAgICAgaW50IGYoKTsKICAgICAgICAgICAgICAgIH07CgoJICAgIEhlcmUsIEI6OmYoKSBpcyB2aXJ0dWFsLCBhbmQgdGhlIGRpcmVjdG9yIGFuZCB0aGUKCSAgICB2aXJ0dWFsIGVsaW1pbmF0aW9uIG1lY2hhbmlzbSBub3cgcmVjb2duaXplIHRoYXQuCgogICAgICAgICAgICAtIFtDI10gVGhpcyBmaXggYWxzbyBmaXhlcyB0aGUgcHJvYmxlbSB3aGVyZSAnb3ZlcnJpZGUnIHdhcyBub3QgYmVpbmcgCiAgICAgICAgICAgIHVzZWQgb24gYW55IG92ZXJyaWRkZW4gdmlydHVhbCBtZXRob2QsIHNvIGZvciBzdHJ1Y3QgQiBhYm92ZSwgCiAgICAgICAgICAgIHRoaXMgQyMgY29kZSBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgcHVibGljIGNsYXNzIEIgOiBBIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgZigpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCgkgICAgLSBJbml0aWFsIHN1cHBvcnQgZm9yIHByb3RlY3RlZCB2aXJ0dWFsIG1ldGhvZHMuIFRoZXkgYXJlIG5vdwoJICAgIHByb3Blcmx5IGVtaXR0ZWQgd2hlbiB1c2luZyB3aXRoIGRpcmVjdG9yIChweXRob24gb25seSBieQoJICAgIG5vdykuCgkgICAgCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBBOyAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBBICB7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjEoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEI7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEF7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgIGludCBmMSgpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGYyKCk7CiAgICAgICAgICAgICAgICB9OwoKCSAgICBUaGlzIGNhbiBiZSBkaXNzYWJsZWQgYnkgdXNpbmcgdGhlICctbm9kaXJwcm90JyBvcHRpb24uCgoJICAgIC0gVGhlIGZlYXR1cmUgJ25vZGlyZWN0b3InIGlzIHdvcmtpbmcgbm93IGF0IHRoZSB0b3AgbGV2ZWwsCgkgICAgc28sIGl0IG11c3Qgd29yayBmb3IgYWxsIHRoZSBsYW5ndWFnZXM6CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQTsKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub2RpcmVjdG9yIikgQTo6ZjI7CgogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYxKCk7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjIoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAKCSAgICBpbiB0aGlzIGNhc2UsIG9ubHkgJ2YxJyBpcyBleHBvcnRlZCB0byB0aGUgZGlyZWN0b3IgY2xhc3MuCgkgICAgCgkgICAgLSBBZGRlZCBkaXJlY3RvciBzdXBwb3J0IGZvciBjb25zdCBUWVBFJiBhcmd1bWVudHMgKHB5dGhvbikuCgoxMi8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgSU5PVVQgYW5kIE9VVFBVVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGZvciB3aGVuIHRoZSBKTkkgdHlwZSAKICAgICAgICAgICAgaXMgYmlnZ2VyIHRoYW4gdGhlIEMgdHlwZS4gRm9yIGV4YW1wbGUsIHVuc2lnbmVkIGxvbmcgKDMyYml0cyBvbiBtb3N0IHN5c3RlbXMpCiAgICAgICAgICAgIGlzIG1hcHBlZCB0byBqbG9uZyAoNjRiaXRzKS4gUmV0dXJuZWQgdmFsdWUgd2FzIGluY29ycmVjdC4gQnVnIHJlcG9ydGVkIGJ5IAogICAgICAgICAgICBCcmlhbiBIYXdsZXkuCgoxMi8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBCZXR0ZXIgZml4IGZvciBlbnRyeSBkYXRlZCAwNS8xMS8yMDAzLiBGaXhlcyB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIHR5cGVtYXBzOgoKICAgICAgICAgICAgSmF2YTogamF2YWJhc2UsIGphdmFpbnRlcmZhY2VzLCBqYXZhaW1wb3J0cywgamF2YWNsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGphdmFmaW5hbGl6ZSwgamF2YWdldGNwdHIgJiBqYXZhY29kZS4KICAgICAgICAgICAgQyM6IGNzYmFzZSwgY3NpbnRlcmZhY2VzLCBjc2ltcG9ydHMsIGNzY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGNzZmluYWxpemUsIGNzZ2V0Y3B0ciAmIGNzY29kZS4KCiAgICAgICAgICAgIEl0IGFsc28gZml4ZXMgYnVnIGluIHVzaW5nIGFycmF5cyBvZiBDIHN0cnVjdHMgd2l0aCBhcnJheXNfamF2YS5pIAogICAgICAgICAgICBhcyByZXBvcnRlZCBTY290dCBNaWNoZWwuCgoxMi8wMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsXSBGaXhlZCBbIDg1MjExOSBdIHJlY3Vyc2l2ZSBpbmhlcml0YW5jZSBpbiBvdXRwdXQgLnBtLCBwZXJsNS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBEb3dsaW5nLgoKMTIvMDIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBGaXhlZCBbIDc1NTM4MiBdIGNhbGxpbmcgZnVuYyhjb25zdCB2ZWN0b3I8VD4mIHApIGV2YWx1YXRlcyBwWzBdIGluIGludGVycC4KICAgICAgICAgICAgVGhlIFRjbCB0eXBlIGNoZWNrZXIgd2FzIGltcHJvcGVybHkgaGFuZGxpbmcgdGhlIGludGVycHJldGVyIHJlc3VsdCB3aGVuCiAgICAgICAgICAgIHR5cGUgdmlvbGF0aW9ucyB3ZXJlIHN1cHBvc2VkIHRvIGJlIGlnbm9yZWQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEZsYXZpdSBQb3BwLU5vd2FrLgoKMTEvMzAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgNTQ1MDU4IF0gY29uZmlndXJlJ3MgLS13aXRoLXRjbGluY2wgaGFzIG5vIGVmZmVjdAoKMTEvMzAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBbIDc2NjQwOSBdIG1pc3Npbmcgc3ltYm9sIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uIGR1cmluZyBtb2R1bGUgbG9hZAogICAgICAgICAgICBTV0lHJ3MgaW50ZXJuYWwgZnVuY3Rpb25zIGFyZSBhbGwgc3RhdGljIGFzIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGRpZmZlcmVudCBTV0lHCiAgICAgICAgICAgIGdlbmVyYXRlZCBtb2R1bGVzIHRvIHNoYXJlIGFueSBjb2RlIGF0IHJ1bnRpbWUuCgoxMS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgODQ4MzM1IF0gRGlyZWN0b3JzOiAjaW5jbHVkZSB3cmFwcGVyIC5oIGZpbGUgLSB3YXMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgYWRkaW5nIGEgZGlyZWN0b3J5IHRvIHRoZSBnZW5lcmF0ZWQgI2luY2x1ZGUgImZvb193cmFwLmgiIHN0YXRlbWVudAogICAgICAgICAgICBpbiBzb21lIHNpdHVhdGlvbnMuCgoxMS8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFsgODQ5MDY0IF0gSkFWQSA6IEFjY2VzcyBtb2RpZmllciBmb3IgZGVyaXZlZCBjbGFzcyB3cm9uZy4KICAgICAgICAgICAgVGhlIGRlbGV0ZSgpIG1ldGhvZCBpcyBhbHdheXMgcHVibGljIG5vdy4gSXQgdXNlZCB0byBiZSBwcm90ZWN0ZWQgd2hlbmV2ZXIgYSAKICAgICAgICAgICAgZGVzdHJ1Y3RvciB3YXMgbm9uIHB1YmxpYy4gQW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gcnVudGltZSAKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRocm93biBpbnN0ZWFkIG9mIG1ha2luZyBkZWxldGUoKSBwcm90ZWN0ZWQgbm93LgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDg1MDE1MSBdIFBZVkVSU0lPTiB3aXRoIHB5dGhvbjIuMyBpbiBjb25maWd1cmUgb2YgU1dJRyAxLjMuMTkgKE1heWJlKS4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgIFsgODUwNjY2IF0gI2luY2x1ZGUgZXh0cmEgbGluZSBhZGRlZC4gIAogICAgICAgICAgICBUaGlzIHNob3VsZCBmaXggc29tZSBwcm9ibGVtcyB3aXRoIGdldHRpbmcgY29ycmVjdCBsaW5lIG51bWJlcnMgb24KICAgICAgICAgICAgZXJyb3IgbWVzc2FnZXMuCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGFub3RoZXIgb25lIG9mIE1hcmNlbG8ncyBldmlsIHRlbXBsYXRlIGJ1Z3MgKGluZmluaXRlCiAgICAgICAgICAgIHJlY3Vyc2lvbikuIFsgODQ5NTA0IF0gdGVtcGxhdGUgYW5kIHR5cGVkZWYgLT4gaW5mLiByZWN1cnNpb24uCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHBhcnNpbmcgcHJvYmxlbSB3aXRoIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXM6CgoJICAgICAgICAgaW50ICp4ID0gJnNvbWVhcnJheVswXTsKCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NTY1NTIgXSBtaXNzaW5nIGRlZmF1bHQgYXJndW1lbnQgY2xhc3Mgc2NvcGUgd2l0aCAifCIuCiAgICAgICAgICAgIFRoaXMgaXMgcmVhbGx5IG9ubHkgYSBiYW5kLWFpZCBmaXggZm9yIHVzZSBvZiBjbGFzcy1lbnVtcyBpbgogICAgICAgICAgICBleHByZXNzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgZW51bSBGbGFnIHsgZmxhZzEgPSAweDEsIGZsYWcyID0gMHgyIH07CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCB4ID0gZmxhZzEgfCBmbGFnMik7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3RlOiB0aGVyZSBhcmUgc3RpbGwgc29tZSAobW9yZSBzdWJ0bGUpIGNhc2VzIHRoYXQgYXJlIGJyb2tlbiwKICAgICAgICAgICAgYnV0IGhhcmQgdG8gZml4IGR1ZSB0byBhbiBpc3N1ZSB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4gV2lsbAogICAgICAgICAgICBhZGRyZXNzIGxhdGVyLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEbWl0cnkgTWlyb25vdi4KCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgODQwODc4IF0gc3VwcG9ydCBmb3IgJWlubGluZSB7IC4uLiB9IChQQVRDSCkuCiAgICAgICAgICAgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kICVpbmxpbmUgJXsgLi4uICV9IGlzIHRoYXQgdGhlCiAgICAgICAgICAgIGVuY2xvc2VkIHRleHQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gICBUaGlzCiAgICAgICAgICAgIGFsbG93cyBzcGVjaWFsIG1hY3JvcyBhbmQgb3RoZXIgcHJvY2Vzc2luZyB0byBiZSB1c2VkIGluIAogICAgICAgICAgICBjb25qdW5jdGlvbiB3aXRoICVpbmxpbmUuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgzNjkwMyBdIEMrKyBpbmNvbnNpc3RlbmN5ICh3aXRoIHZvaWQgYXJndW1lbnRzKS4KICAgICAgICAgICAgU1dJRyB3YXMgaGF2aW5nIGRpZmZpY3VsdHkgd2l0aCBmKCkgdnMgZih2b2lkKSBpbiBDKysgcHJvZ3JhbXMuCiAgICAgICAgICAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZih2b2lkKSA9IDA7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGYoKTsgICAgLy8gTm90IG1hdGNoZWQgdG8gZih2b2lkKSBjb3JyZWN0bHkKICAgICAgICAgICAgICAgICAgfTsgCgogICAgICAgICAgICBUaGUgcGFyc2VyIG5vdyBub3JtYWxpemVzIGFsbCBkZWNsYXJhdGlvbnMgb2YgdGhlIGZvcm0gZih2b2lkKSAKICAgICAgICAgICAgaW4gQysrIGNsYXNzZXMgdG8gZigpLiAgVGhpcyBzaG91bGQgZml4IGEgdmFyaWV0eSBvZiBzdWJ0bGUgCiAgICAgICAgICAgIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UsIG9wdGltaXphdGlvbnMsIG92ZXJsb2FkaW5nLCBldGMuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFydGhvIEJob3dtaWNrLgogCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBJbmNvcnBvcmF0ZWQgWyA4NDEwNzQgXSBiZXR0ZXIgY3JvYWtpbmcgKFBBVENIKS4gIFRoaXMgZml4ZXMgc29tZSBwcm9ibGVtcwogICAgICAgICAgICB3aXRoIHN0cmluZ3MgYW5kIHByb3ZpZGVzIHNvbWUgbmV3IGVycm9yIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgogICAgICAgICAgICAKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5MTgzNSBdIERlZmF1bHQgYXJndW1lbnQgd2l0aCBjYXN0OiB0eHQgPSAoY2hhciAqKSJ0eHQiIHN5bnRheCBFcnJvci4KICAgICAgICAgICAgVGhlIHBhcnNlciBzaG91bGQgbm93IGFjY2VwdCB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhjaGFyICpzID0gKGNoYXIgKikgIkhlbGxvIik7CgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IENsYXVkaXVzIFNjaG5vcnIuCgoxMS8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEZpeGVkIHByb2JsZW0gd2l0aCBjcm9zcyBtb2R1bGUgbGlua2luZy4gIFByZXZpb3VzbHkgbW9kdWxlcyByZWZlcnJlZAogICAgICAgICAgICB0byBiYXNlIGNsYXNzZXMgdGhyb3VnaCBhIGdsb2JhbCB2YXJpYWJsZS4gICBOb3csIHRoZSBtb2R1bGUgbG9va3MgdXAgYmFzZQogICAgICAgICAgICBjbGFzc2VzIHRocm91Z2ggdGhlIHR5cGUgc3lzdGVtIGl0c2VsZi0tLWF2b2lkaW5nIHRoZSBuZWVkIHRvIGxpbmsgdG8gYSBnbG9iYWwKICAgICAgICAgICAgbGlrZSBiZWZvcmUuICBDYXZlYXQ6ICBtb2R1bGVzIHdpdGggYmFzZSBjbGFzc2VzIG11c3QgYmUgbG9hZGVkIGJlZm9yZQogICAgICAgICAgICBtb2R1bGVzIHdpdGggZGVyaXZlZCBjbGFzc2VzLgogCjExLzI0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgdXNlICgpIHRvIHJlcHJlc2VudCBudWxsIHBvaW50ZXJzLAoJICAgIGFzIGl0IGlzIGRvbmUgaW4gLWdoIG1vZGUuCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgQWRkIGEgZ2VuZXJhdGVkIHNjcmlwdCAicHJlaW5zdC1zd2lnIiwgd2hpY2ggY2FuIGJlIHVzZWQKCSAgICB0byBpbnZva2UgU1dJRyBiZWZvcmUgaXQgaGFzIGJlZW4gaW5zdGFsbGVkLiAgSXQgYXJyYW5nZXMKCSAgICB0aGF0IHRoZSBydW50aW1lIGxpYnJhcmllcyBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZQoJICAgIHVzZWQuIAoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLWdoIG1vZGUsIGRvbid0IGZvcmdldCB0byBjYWxsIFNXSUdfR3VpbGVfSW5pdC4KCSAgICBBZGQgYSBTV0lHX2NvbnRyYWN0X2Fzc2VydCBtYWNyby4KCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFVwZGF0ZSB0aGUgY29uZmlndXJlIGNoZWNrIGZvciB0aGUgZHluZXh0IG9iamVjdCB0byB3b3JrCgkgICAgd2l0aCBNelNjaGVtZSAyMDUuCgoxMS8yMC8yMDAzOiBtbWF0dXMKCSAgICBGaXhlZCB0aGUgaW5jbHVkZS9pbXBvcnQgZXJyb3IgcmVwb3J0ZWQgYnkgS2VyaW0gQm9yY2hhZXYsCgkgICAgd2hlcmUgdHdvIGZpbGVzIHdpdGggbmFtZXMgbGlrZQoKCSAgICAnZGlyMS9oZWxsby5pJwoJICAgICdkaXIyL2hlbGxvLmknCgkgICAgCgkgICAgY2FuIG5vdCBiZSBpbmNsdWRlIGF0IHRoZSBzYW1lIHRpbWUuIFN3aWcgd2FzIGluY2x1ZGluZwoJICAgIGp1c3QgdGhlIGZpcnN0IG9uZSwgYXNzdW1pbmcgdGhlIHNlY29uZCBvbmUgd2FzIG5vdCBhCgkgICAgZGlmZmVyZW50IG9uZSwgc2luY2UgaXQgd2FzIGNoZWNraW5nL2tlZXBpbmcganVzdCB0aGUKCSAgICBiYXNlbmFtZSAnaGVsbG8uaScuCgoxMS8xOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIFNXSUcgcnVudGltZSBsaWJyYXJ5IHN1cHBvcnQuIAogICAgICAgICAgICAgIC0gIFRoZSAtYyBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuIHJlbmFtZWQgdG8gLW5vcnVudGltZQogICAgICAgICAgICAgIC0gIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOiAtcnVudGltZS4gIFdoZW4gc3VwcGxpZWQsIHRoaXMKICAgICAgICAgICAgICAgICBpbnNlcnRzIHRoZSBzeW1ib2wgU1dJR19HTE9CQUwgaW50byB0aGUgd3JhcHBlciBjb2RlLiAgVGhpcywKICAgICAgICAgICAgICAgICBpbiB0dXJuLCBtYWtlcyBhbGwgb2YgdGhlIHJ1bnRpbWUgc3VwcG9ydCBmdW5jdGlvbnMgZ2xvYmFsbHkKICAgICAgICAgICAgICAgICB2aXNpYmxlLgogICAgICAgICAgICAgICAtIE5ldyBsaWJyYXJ5IGZpbGU6IHN3aWdydW4uaS4gICBVc2VkIHRvIGNyZWF0ZSBtb2R1bGVzCiAgICAgICAgICAgICAgICAgZm9yIHJ1bnRpbWUgbGlicmFyeSAoaWYgbmVlZGVkKS4KICAgIAoxMS8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgJ21ha2Ugc3JjcnBtJyBycG1idWlsZCBmaXggLSBwYXRjaCBmcm9tIEpvZSBDb29wZXIKCjExLzE4LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIENoYW5nZSBtZWFuaW5nIG9mIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLWd1aWxlIHRvCgkgICAgdGhlIG5hbWUgb2YgdGhlIEd1aWxlIGV4ZWN1dGFibGUuICBUaGUgbmV3IG9wdGlvbiAtLXdpdGgtZ3VpbGUtcHJlZml4IAoJICAgIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHRyZWUgd2hlcmUgR3VpbGUgaXMKCSAgICBpbnN0YWxsZWQuICAoSG93ZXZlciwgdXN1YWxseSBpdCBzdWZmaWNlcyB0byB1c2UgdGhlCgkgICAgc2luZ2xlIG9wdGlvbiAtLXdpdGgtZ3VpbGUtY29uZmlnLikgIAoJICAgIFdoZW4gcnVubmluZyB0aGUgcnVuIHRlc3RzIHRlc3Qtc3VpdGUsIG1ha2Ugc3VyZSB0byB1c2UgdGhlCgkgICAgdmVyc2lvbiBvZiBHdWlsZSB0aGF0IFNXSUcgd2FzIGNvbmZpZ3VyZWQgZm9yLgoKMTEvMTcvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW1wcm92ZW1lbnRzIHRvIG9iamVjdC1vd25lcnNoaXAgbWFuYWdlbWVudCBpbiAKCSAgICAiLXNjbSIgbW9kZS4gIChUaGV5IGRvIG5vdCBhcHBseSB0byB0aGUgZGVmYXVsdCAiLWdoIiBtb2RlLikKCSAgICAqIFJlbmFtZWQgdGhlIHNtb2IgdHlwZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgY2FuCgkgICAgICBiZSBnYXJiYWdlIGNvbGxlY3RlZCBmcm9tICJjb2xsZWN0ZWQgc3dpZyIgdG8gImNvbGxlY3RhYmxlCgkgICAgICBzd2lnIiwgd2hpY2ggaXMgbW9yZSBwcmVjaXNlLiAgCgkgICAgKiBFeHBvcnQgdGhlIGRlc3RydWN0b3IgZnVuY3Rpb25zIGFnYWluLiAgSXQgaXMgbm93CiAJICAgICAgYWxsb3dlZCB0byBleHBsaWNpdGx5IGNhbGwgZGVzdHJ1Y3RvcnMsIGV2ZW4gZm9yCgkgICAgICBnYXJiYWdlLWNvbGxlY3RlZCBwb2ludGVyIG9iamVjdHMuICBBIHBvaW50ZXIgb2JqZWN0CgkgICAgICB0aGF0IGhhcyBiZWVuIHBhc3NlZCB0byBhIGRlc3RydWN0b3IgaXMgbWFya2VkIGluIGEKCSAgICAgIHNwZWNpYWwgd2F5IHVzaW5nIGEgbmV3IHNtb2IgdHlwZSwgImRlc3Ryb3llZCBzd2lnIi4KCSAgICAgIChUaGlzIGhlbHBzIGF2b2lkIG5hc3R5IG1lbW9yeSBidWdzLCB3aGVyZSByZWZlcmVuY2VzIHRvCgkgICAgICBkZWFkIEMgb2JqZWN0cyBhcmUgc3RpbGwgaGVsZCBpbiBTY2hlbWUuIE1vcmVvdmVyLCB0aGUKCSAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIHdpbGwgbm90IHRyeSB0byBmcmVlIGEgZGVzdHJveWVkCgkgICAgICBvYmplY3Qgb25jZSBtb3JlLikKCSAgICAqIERlc3RydWN0b3ItbGlrZSBmdW5jdGlvbnMgY2FuIGFsc28gbWFyayB0aGVpciBhcmd1bWVudHMgCgkgICAgICBhcyBkZXN0cm95ZWQgYnkgYXBwbHlpbmcgdGhlIHR5cGVtYXAgU1dJR1RZUEUgKkRFU1RST1lFRC4KCSAgICAgIChJdCBjYWxscyB0aGUgZnVuY3Rpb24gU1dJR19HdWlsZV9NYXJrUG9pbnRlckRlc3Ryb3llZC4pCgkgICAgKiBGdW5jdGlvbnMgdGhhdCAiY29uc3VtZSIgdGhlaXIgb2JqZWN0cyAob3IgdGhhdCAib3duIgoJICAgICAgdGhlbSBhZnRlciB0aGUgY2FsbCkgY2FuIG1hcmsgdGhlaXIgYXJndW1lbnRzIGFzCgkgICAgICBub3QgZ2FyYmFnZSBjb2xsZWN0YWJsZS4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgYXBwbHlpbmcKCSAgICAgIHRoZSB0eXBlbWFwIFNXSUdUWVBFICpDT05TVU1FRC4gIChJdCBjYWxscyB0aGUgZnVuY3Rpb24KCSAgICAgIFNXSUdfR3VpbGVfTWFya1BvaW50ZXJOb25jb2xsZWN0YWJsZS4pCgkgICAgKiBUaGUgbWFjcm8gVFlQRU1BUF9QT0lOVEVSX0lOUFVUX09VVFBVVCBmcm9tIGxpYnJhcnkKCSAgICAgIHBvaW50ZXItaW4tb3V0LmkgY3JlYXRlcyBhZGRpdGlvbmFsIHR5cGVtYXBzIAoJICAgICAgUFRSVFlQRSAqSU5QVVRfQ09OU1VNRUQsIFBUUlRZUEUgKklOUFVUX0RFU1RST1lFRC4KCSAgICAgIFRoZXkgbWFyayB0aGUgcGFzc2VkIHBvaW50ZXIgb2JqZWN0IGxpa2V3aXNlLgoJICAgICAgVGhlIHR5cGVtYXAgUFRSVFlQRSAqT1VUUFVUIGNyZWF0ZXMgYSBnYXJiYWdlLWNvbGxlY3RhYmxlCgkgICAgICBwb2ludGVyIG9iamVjdCwgbGlrZSAlbmV3b2JqZWN0IGRvZXMgZm9yIGEgcmV0dXJuZWQgCgkgICAgICBwb2ludGVyLiAgVXNlIHRoZSBuZXcgdHlwZW1hcCBQVFJUWVBFICpPVVRQVVRfTk9OQ09MTEVDVEFCTEUKCSAgICAgIHRvIGNyZWF0ZSBhIHBvaW50ZXIgb2JqZWN0IHRoYXQgd2lsbCBub3QgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCgoxMS8xNy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBIYW5kbGUgJGlucHV0IGluICJmcmVlYXJnIiB0eXBlbWFwcy4KCSAgICBOZXZlciBxdWFsaWZ5IEdPT1BTIHNsb3QgbmFtZXMgd2l0aCB0aGUgY2xhc3MgbmFtZS4gCgkgICAgSGFuZGxlIG9wdGlvbmFsIGFyZ3VtZW50cyBwcm9wZXJseSBpbiB0aGUgR09PUFMgbWV0aG9kcy4KCjExLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBmb3IgaW5zdGFsbGF0aW9uIHRvIHdvcmsgd2l0aCB0aGUgdXBjb21pbmcgQXV0b21ha2UtMS44LgogICAgICAgICAgICBta2luc3RhbGxkaXJzIHdhcyBiZWluZyB1c2VkIGJ5IGEgbm9uLUF1dG9tYWtlIG1ha2VmaWxlLiAKICAgICAgICAgICAgbWtpbnN0YWxsZGlycyBpcyBiZWluZyBwaGFzZWQgb3V0IGFuZCBzbyB3YXMgbm90IGJlaW5nCiAgICAgICAgICAgIGNyZWF0ZWQgYnkgQXV0b21ha2UuIGluc3RhbGwtc2ggdXNlZCBpbnN0ZWFkLgoKMTEvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBpbXByb3ZlbWVudHMsIHR3ZWFrcyBhbmQgYnVnIGZpeGVzIHNpbmNlIAogICAgICAgICAgICB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBoYXZlIGJlZW4gY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBXaGVuICVmZWF0dXJlKCJzaGFkb3ciKSBpcyB1c2VkIHRvIGFkZCBjb2RlIHRvIHNoYWRvdwogICAgICAgICAgICBjbGFzc2VzLCB0aGUgc3BlY2lhbCB2YXJpYWJsZSAkYWN0aW9uIGV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIHVuZGVybHlpbmcgd3JhcHBlciBmdW5jdGlvbiB0aGF0IHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQgbm9ybWFsbHkuCgoxMS8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIFdoZW4gZ2VuZXJhdGluZyBwcm94eSBjbGFzcyBjb2RlLCBTV0lHIGVtaXRzIGEgZmV3CiAgICAgICAgICAgIGRlZmF1bHQgbWV0aG9kcyBmb3IgX19yZXByX18oKSBhbmQgb3RoZXIgUHl0aG9uIHNwZWNpYWwKICAgICAgICAgICAgbWV0aG9kcy4gIFNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhcmUgZW1pdHRlZCBhZnRlciBhbGwgb2YgdGhlCiAgICAgICAgICAgIGNvbnRlbnRzIG9mIGEgY2xhc3MuIEhvd2V2ZXIsIHRoaXMgbWFrZXMgaXQgaGFyZCB0byBvdmVycmlkZQogICAgICAgICAgICB0aGUgbWV0aG9kcyB1c2luZyAlcHl0aG9uY29kZSBhbmQgc29tZSBvdGhlciBkaXJlY3RpdmVzIHRoYXQKICAgICAgICAgICAgYWxsb3cgY29kZSB0byBiZSBpbnNlcnRlZCBpbnRvIGEgY2xhc3MuICBUaGVzZSBzcGVjaWFsIG1ldGhvZHMKICAgICAgICAgICAgYXJlIG5vdyBlbWl0dGVkIGludG8gdGhlIGNvZGUgKmJlZm9yZSogYWxsIG9mIHRoZSBvdGhlciBtZXRob2RzLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgRXJpYyBKb25lcy4KIAoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFByZXByb2Nlc3NvciBlbmhhbmNlbWVudC4gICBGb3IgaW5jbHVkZSBzdGF0ZW1lbnRzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlICJmb28vYmFyLmkiCgogICAgICAgICAgICB0aGUgZGlyZWN0b3J5ICJmb28iIGlzIG5vdyBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggd2hpbGUgCiAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGJhci5pLiAgVGh1cywgaWYgYmFyLmkgaW5jbHVkZXMgb3RoZXIKICAgICAgICAgICAgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LCB0aGV5IHdpbGwgYmUgZm91bmQuIFByZXZpb3VzbHksCiAgICAgICAgICAgIHlvdSB3b3VsZCBoYXZlIHRvIGFkZCBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIHVzaW5nIC1JIHRvIG1ha2UgdGhpcwogICAgICAgICAgICB3b3JrIGNvcnJlY3RseS4gIE5vdGU6IHRoZSBDIHByZXByb2Nlc3NvciBzZWVtcyB0byBiZWhhdmUgaW4KICAgICAgICAgICAgYW4gaWRlbnRpY2FsIG1hbm5lciBvbiBtYW55IChtb3N0PyBhbGw/KSBzeXN0ZW1zLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS2VyaW0gQm9yY2hhZXYuCgoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byBtYWtlIFNXSUcgd29yayBvbiBNYWMgT1NYIDEwLjMueCAoUGFudGhlcikuCiAgICAgICAgICAgIFRlc3RlZCB3aXRoIFB5dGhvbiwgVGNsLCBQZXJsLCBhbmQgUnVieS0tLWFsbCBvZiB3aGljaCBzZWVtIHRvIHdvcmsuCgoxMS8wOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIHRoZSB0eXBlbWFwcyBpbiB2YXJpb3VzLmkgd2hpY2ggd2VyZSBtb3N0bHkgYnJva2VuLgogICAgICAgICAgICBjaGFyICoqU1RSSU5HX0lOIGFuZCBjaGFyICoqU1RSSU5HX1JFVCB0eXBlbWFwcyByZXBsYWNlZCB3aXRoIAogICAgICAgICAgICBTVFJJTkdfQVJSQVkuIGZsb2F0ICpGTE9BVF9BUlJBWV9SRVRVUk4gdHlwZW1hcCByZW1vdmVkLgoKMTEvMDgvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBUY2wgbW9kdWxlIG5vdyBlbWl0cyBhIHNhZmUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGJ5CiAgICAgICAgICAgIGRlZmF1bHQuICBJdCBjYW4gYmUgcmVtb3ZlZCBieSBydW5uaW5nICdzd2lnIC1ub3NhZmUnLgoKMTEvMDQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gT25seSB1c2UgdGhlIFNDTV8gQVBJIHdoZW4gdGhlIGZ1bmN0aW9uCgkgICAgYHNjbV9zbG90X2V4aXN0c19wJyBleGlzdHMgKG5lZWRlZCBmb3IgR09PUFMgc3VwcG9ydCkuICAKCSAgICBUaGlzIGZ1bmN0aW9uIHdhcyByZW5hbWVkIGR1cmluZyB0aGUgR3VpbGUgMS41IHNlcmllcwoJICAgIGZyb20gYHNjbV9zbG90c19leGlzdHNfcCcuCgkgICAgUmVwb3J0IHRoZSByaWdodCBydW50aW1lIGxpYnJhcnkgd2hlbiBpbnZva2VkIHdpdGgKCSAgICAtc2NtIC1sZGZsYWdzLgoKMTEvMDMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBGaXggIzc4MjA1Mi4gIFRoZSAtLXdpdGgtY2hpY2tlbmNmZyBjb25maWd1cmUKCSAgICBvcHRpb24gKGFuZCBvdGhlcnMpIHdlcmUgbm90IGFjY2VwdGVkLgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gTWVyZ2UgbmV3IHNldCBvZiBHT09QUyBjaGFuZ2VzIGJ5IEpvaG4gTGVuei4KCSAgICBHT09QUyBvYmplY3RzIGFyZSBub3cgbWFuaXB1bGF0ZWQgZGlyZWN0bHkgYnkgdGhlIEMgY29kZS4KCSAgICBTb21lIGZpeGVzIHRvIHR5cGVtYXAtR09PUFMgaW50ZXJhY3Rpb24uCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBSZW1vdmUgdGhlIGZpbGUgYXJndW1lbnQgdG8gLXNjbXN0dWIgYW5kIC1nb29wcy4KCSAgICBUaGUgU2NoZW1lIGZpbGVzIGFyZSBub3cgYWx3YXlzIGNhbGxlZCBNT0RVTEUuc2NtIG9yCgkgICAgTU9EVUxFLXByaW1pdGl2ZS5zY20sIHdoZXJlIE1PRFVMRSBpcyB0aGUgbW9kdWxlIG5hbWUgYW5kIAoJICAgICJwcmltaXRpdmUiIGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSAtcHJpbXN1ZmZpeCBvcHRpb24uCgkgICAgVGhlIFNjaGVtZSBmaWxlcyBhcmUgbm93IHBsYWNlZCBpbiB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5CgkgICAgdGhlIC1vdXRkaXIgb3B0aW9uLCBvciB0aGUgY3VycmVudCBkaXJlY3RvcnkuCgkgICAgKFBhdGNoIGJ5IEpvaG4gTGVueiwgc2xpZ2h0bHkgbW9kaWZpZWQuKQoKCSAgICAqKiogSU5DT01QQVRJQklMSVRZIFtHdWlsZV0gKioqCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgVW5pZnkgdGhlIHBvaW50ZXItY29udmVyc2lvbiBydW50aW1lIEFQSS4gIFRoZSBzdGFuZGFyZAoJICAgIGZ1bmN0aW9ucyBhcmU6CgkgICAgICogU1dJR19OZXdQb2ludGVyT2JqIChQT0lOVEVSLCBUWVBFLCBGTEFHUykKCSAgICAgICAgLS0gQ3JlYXRlIGFuIHNjcmlwdGluZyBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgdHlwZWQKCQkgICBwb2ludGVyLiBGTEFHUyBhcmUgbGFuZ3VhZ2Ugc3BlY2lmaWMuCgkgICAgICogU1dJR19Db252ZXJ0UHRyIChJTlBVVCwgUkVTVUxULCBUWVBFLCBGTEFHUykKCSAgICAgICAgLS0gR2V0IGEgcG9pbnRlciBmcm9tIHRoZSBzY3JpcHRpbmcgb2JqZWN0IElOUFVUIGFuZAoJCSAgIHN0b3JlIGl0IGluIHRoZSBwbGFjZSBSRVNVTFQuICBXaGVuIGEgdHlwZSBtaXNtYXRjaCAKCQkgICBvY2N1cnMsIHJldHVybiBub256ZXJvLgoJICAgICAqIFNXSUdfTXVzdEdldFB0ciAoSU5QVVQsIFRZUEUsIEFSR05VTSwgRkxBR1MpCgkgICAgICAgIC0tIEdldCBhIHBvaW50ZXIgZnJvbSB0aGUgc2NyaXB0aW5nIG9iamVjdCBJTlBVVCBhbmQKCQkgICByZXR1cm4gaXQuICBXaGVuIGEgdHlwZSBtaXNtYXRjaCBvY2N1cnMsIHRocm93IGFuCgkJICAgZXhjZXB0aW9uLiAgSWYgQVJHTlVNID4gMCwgcmVwb3J0IGl0IGFzIHRoZSAKCQkgICBhcmd1bWVudCBudW1iZXIgdGhhdCBoYXMgdGhlIHR5cGUgbWlzbWF0Y2guCiAgICAgICAgICAgIFtHdWlsZV06ICAgIE5vIGNoYW5nZXMuCgkgICAgW016U2NoZW1lXTogTm8gY2hhbmdlcy4KCSAgICBbUGVybF06ICAgICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTmV3UG9pbnRlck9iai4KCQkgICAgICAgIFRoZSBmdW5jdGlvbiBTV0lHX01ha2VQdHIgaXMga2VwdC4KCQkJVGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ciBpcyBjdXJyZW50bHkgbm90CgkJCXN1cHBvcnRlZC4KCSAgICBbUHl0aG9uXTogICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ci4KCSAgICBbUnVieV06ICAgICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ci4KCSAgICBbVGNsXTogICAgICBSZW1vdmUgdGhlICJpbnRlcnAiIGFyZ3VtZW50IG9mCgkJICAgICAgICBTV0lHX05ld0luc3RhbmNlT2JqLCBTV0lHX0NvbnZlcnRQdHIsCgkJICAgICAgICBTV0lHX0NvbnZlcnRQYWNrZWQsIGFuZCBTV0lHX0NvbnZlcnRQdHJGcm9tU3RyaW5nLgoJCQlUaGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyIGlzIGN1cnJlbnRseSAKCQkJbm90IHN1cHBvcnRlZC4KCSAgICBObyBjaGFuZ2VzIHRvIFBpa2UgYmVjYXVzZSBpdHMgcG9pbnRlciBjb252ZXJzaW9uIGNvZGUgZGlkCgkgICAgbm90IGxvb2sgY29tcGxldGUuICBObyBjaGFuZ2VzIHRvIFBIUDQsIGJlY2F1c2UgSSBkaWQgbm90CgkgICAgdW5kZXJzdGFuZCBpdHMgcnVudGltZSBjb2RlLiAgTm8gY2hhbmdlcyB0byBDaGlja2VuCgkgICAgYmVjYXVzZSBtYWpvciBjaGFuZ2VzIGFyZSBleHBlY3RlZCBzb29uIGFueXdheS4gIE5vCgkgICAgY2hhbmdlcyB0byBKYXZhLCBPQ2FtbCwgQyMgYmVjYXVzZSB0aGV5IGRvIG5vdCBzZWVtIHRvCgkgICAgaGF2ZSBhIHBvaW50ZXItY29udmVyc2lvbiBydW50aW1lIEFQSS4KCiAgICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgW1RjbF0gKioqCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW1Blcmw1LCBQSFA0LCBQaWtlLCBQeXRob24sIFJ1YnksIFRjbF06IFVzZSB0aGUKCSAgICBwcmVwcm9jZXNzb3IgdG8gcmVuYW1lIGV4dGVybmFsIGZ1bmN0aW9ucyBvZiB0aGUgU1dJRwoJICAgIHJ1bnRpbWUgQVBJIHRvIGZvbGxvdyB0aGUgbmFtaW5nIGNvbnZlbnRpb24KCSAgICBTV0lHXzxsYW5ndWFnZT5fPGZ1bmN0aW9uPi4gIFRoaXMgc2hvdWxkIGFsbG93IGxpbmtpbmcKCSAgICBtb3JlIHRoYW4gb25lIGludGVycHJldGVyIGludG8gYSBwcm9ncmFtLgoKMTAvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRml4IHNpbmNlIGludHJvZHVjaW5nIHRoZSBleGNlcHRpb24gYW5kIHN0ZDo6c3RyaW5nIGRlbGVnYXRlcy4KICAgICAgICAgICAgVGhlIGZpeCBvdmVyY29tZXMgbGlua2VyIGVycm9ycyB3aGVuIHVzaW5nIG1vcmUgdGhhbiBvbmUgU1dJRyBtb2R1bGUuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgQW5kcmVhcyBTY2j2cmsuCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjMzMDIgXSBJbmNyIFRjbCBzdXBwb3J0LgogICAgICAgICAgICBDb250cmlidXRlZCBieSBBbGV4ZXkgRHlhY2hlbmtvLgogICAgICAgICAgICBOb3RlOiBuZWVkcyBkb2N1bWVudGF0aW9uLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzI1IF0gbmV3IFB5dGhvbiBNb2R1bGUgb3B0aW9ucyBhbmQgZmVhdHVyZXMuCiAgICAgICAgICAgIFJvYmluIER1bm4gd3JpdGVzOgoKICAgICAgICAgICAgVGhpcyBwYXRjaCBtYWtlcyBhIG51bWJlciBvZiBjaGFuZ2VzIHRvIHRoZSBTV0lHIHB5dGhvbiBtb2R1bGUuCgogICAgICAgICAgICAxLiBBZGQgLWFwcGx5IG9wdGlvbiwgYW5kIGNoYW5nZSB0aGUgZGVmYXVsdCBjb2RlCiAgICAgICAgICAgIG91dHB1dCB0byB1c2UgdGhlIGZvbygqYXJncywgKiprdykgY2FsbGluZyBzeW50YXgKICAgICAgICAgICAgaW5zdGVhZCBvZiB1c2luZyBhcHBseSgpLiBJZiB0aGUgLWFwcGx5IG9wdGlvbiBpcwogICAgICAgICAgICBnaXZlbiB0aGVuIGNvZGUgaXMgZ2VuZXJhdGVkIGFzIGJlZm9yZS4gVGhpcyBpcyB2ZXJ5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gUGF0Y2ggIzczNzI4MSBidXQgdGhlIG5ldyAtbW9kZXJuIG9wdGlvbgogICAgICAgICAgICBtYWtlcyB0aGUgc2Vjb25kIGhhbGYgb2YgdGhhdCBwYXRjaCB1bm5lY2Vzc2FyeSBzbyBpdAogICAgICAgICAgICBpcyBub3QgaW5jbHVkZWQgaGVyZS4KCSAgICAKICAgICAgICAgICAgMi4gQWRkIC1uZXdfcmVwciBvcHRpb24uIFRoaXMgaXMgdGhlIHNhbWUgYXMgbXkgUGF0Y2gKICAgICAgICAgICAgIzc5NzAwMiB3aGljaCBJIHdpbGwgbWFyayBhcyBjbG9zZWQgc2luY2UgaXQgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIG5lZWRlZC4gV2hlbiB0aGlzIG5ldyBvcHRpb24gaXMgdXNlZCB0aGVuIHRoZQogICAgICAgICAgICBfX3JlcHJfXyBtZXRob2RzIHRoYXQgYXJlIGdlbmVyYXRlZCBmb3IgcHJveHkgY2xhc3NlcwogICAgICAgICAgICB3aWxsIGJlIG1vcmUgaW5mb3JtYXRpdmUgYW5kIGdpdmUgZGV0YWlscyBhYm91dCB0aGUKICAgICAgICAgICAgcHl0aG9uIGNsYXNzIGFuZCB0aGUgQysrIGNsYXNzLgoJICAgIAogICAgICAgICAgICAzLiBBZGQgJWZlYXR1cmUoImFkZHRvZnVuYyIpLiBJdCBhbGxvd3MgeW91IHRvIGluc2VydAogICAgICAgICAgICBvbmUgb3IgbW9yZSBsaW5lcyBvZiBjb2RlIGluc2lkZSB0aGUgc2hhZG93IG1ldGhvZCBvcgogICAgICAgICAgICBmdW5jdGlvbiB0aGF0IGlzIGFscmVhZHkgZ2VuZXJhdGVkLCBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHJlcGxhY2luZyB0aGUgd2hvbGUgdGhpbmcgbGlrZSAlZmVhdHVyZSgic2hhZG93IikgZG9lcy4KICAgICAgICAgICAgRm9yIF9faW5pdF9fIGl0IGdvZXMgYXQgdGhlIGVuZCwgZm9yIF9fZGVsX18gaXQgZ29lcwogICAgICAgICAgICBhdCB0aGUgYmVnaW5pbmcgYW5kIGZvciBhbGwgb3RoZXJzIHRoZSBjb2RlIGdlbmVyYXRlZAogICAgICAgICAgICBpcyBleHBhbmRlZCBvdXQgdG8gYmUgbGlrZQoJICAgIAogICAgICAgICAgICBkZWYgQmFyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIHZhbCA9IF9tb2R1bGUuRm9vX0JhcigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIHJldHVybiB2YWwKCSAgICAKICAgICAgICAgICAgYW5kIHRoZSAiYWRkdG9mdW5jIiBjb2RlIGlzIGluc2VydGVkIGp1c3QgYmVmb3JlIHRoZQogICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LiBJZiB0aGUgZmVhdHVyZSBpcyBub3QgdXNlZCBmb3IgYQogICAgICAgICAgICBwYXJ0aWN1bGFyIG1ldGhvZCBvciBmdW5jdGlvbiB0aGVuIHRoZSBzaG9ydGVyIGNvZGUgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGp1c3QgbGlrZSBiZWZvcmUuCgkgICAgCiAgICAgICAgICAgIDQuIEEgbGl0dGxlIGJpdCBvZiByZWZhY3RvcmluZyB0byBtYWtlIGltcGxlbWVudGluZwogICAgICAgICAgICBhZGR0b2Z1bmMgYSBsaXR0bGUgZWFzaWVyLgoJICAgIAogICAgICAgICAgICA1LiBBZGRlZCBhIC1tb2Rlcm4gY29tbWFuZC1saW5lIGZsYWcgdGhhdCB3aWxsIGNhdXNlCiAgICAgICAgICAgIFNXSUcgdG8gb21pdCB0aGUgY3J1ZnQgaW4gdGhlIHByb3h5IG1vZHVsZXMgdGhhdCBhbGxvd3MKICAgICAgICAgICAgaXQgdG8gd29yayB3aXRoIHZlcnNpb25zIG9mIFB5dGhvbiBwcmlvciB0byAyLjIuIFRoZQogICAgICAgICAgICByZXN1bHQgaXMgYSBzaW1wbGVyLCBjbGVhbmVyIGFuZCBmYXN0ZXIgcHl0aG9uIHByb3h5CiAgICAgICAgICAgIG1vZHVsZSwgYnV0IG9uZSB0aGF0IHJlcXVpcmVzIFB5dGhvbiAyLjIgb3IgZ3JlYXRlci4gCgoxMC8zMS8yMDAzOiBiZWF6bGV5IAogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzE5IF0gWE1MIG1vZHVsZSB0d2Vha3MuCiAgICAgICAgICAgIFRoaXMgYWRkcyBhIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC14bWxsaXRlIHRoYXQgCiAgICAgICAgICAgIGdyZWF0bHkgcmVkdWNlcyB0aGUgYW1vdW50IG9mIGVtaXR0ZWQgWE1MIGNvZGUgYnkKICAgICAgICAgICAgZWxpbWluYXRpbmcgc29tZSBmaWVsZHMgbW9zdGx5IHVzZWQgaW4gU1dJRydzCiAgICAgICAgICAgIGludGVybmFsIHByb2Nlc3NpbmcuICBDb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzE3IF0gQWRkcyBEb2hTcGxpdExpbmVzIGZ1bmN0aW9uLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKMTAvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgyNzkwNyBdIGFyZ291dCBvYmplY3RzIG5vdCBiZWluZyB3cmFwcGVkIHByb3Blcmx5IChQQVRIKS4KICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGnxbyBHYXJj7WEuCgkgICAgIAoxMC8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODI2OTk2IF0gcGVybCB0eXBlIGNoZWNraW5nIGlnbm9yZXMgcGVybCBzdWJjbGFzc2VzLgogICAgICAgICAgICBUaGlzIGVuaGFuY2VtZW50IG1ha2VzIGl0IHNvIHdyYXBwZWQgY2xhc3NlcyBhbmQgc3RydWN0cyBjYW4KICAgICAgICAgICAgYmUgc3ViY2xhc3NlZCBpbiBQZXJsIGFuZCB1c2VkIG5vcm1hbGx5LiAKICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGnxbyBHYXJj7WEuCgoxMC8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbnRQdHIgbWFyc2hhbGxlZCB3aXRoIGEgdm9pZCogaW5zdGVhZCBvZiBpbnQgaW4gQyBmdW5jdGlvbiAKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiBUaGUgY2FzdHMgdGh1cyBsb29rIG1vcmUgY29udmVudGlvbmFsLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAvLyBvbGQKICAgICAgICAgICAgICAgIERsbEV4cG9ydCBkb3VibGUgU1dJR1NURENBTEwgQ1NoYXJwX2dldF9TaGFwZV94KGludCBqYXJnMSkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFNoYXBlICphcmcxID0gKFNoYXBlICopIDAgOwogICAgICAgICAgICAgICAgICAgIGFyZzEgPSAqKFNoYXBlICoqKSZqYXJnMTsgCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBuZXcKICAgICAgICAgICAgICAgIERsbEV4cG9ydCBkb3VibGUgU1dJR1NURENBTEwgQ1NoYXJwX2dldF9TaGFwZV94KHZvaWQgKiBqYXJnMSkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFNoYXBlICphcmcxID0gKFNoYXBlICopIDAgOwogICAgICAgICAgICAgICAgICAgIGFyZzEgPSAoU2hhcGUgKilqYXJnMTsgCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgoKMTAvMTQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBzbWFydCBwb2ludGVycy4KICAgICAgICAgICAgSWYgYSBjbGFzcyBoYXMgb3ZlcmxvYWRlZCBtZXRob2RzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50IHgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGJhcihpbnQgeCwgaW50IHkpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBhbmQgdGhlIGNsYXNzIGlzIHVzZWQgYXMgYSBzbWFydCBwb2ludGVyOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvb1B0ciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBTV0lHIHdvdWxkIHRyeSB0byBleHBvc2UgdGhlIHN0YXRpYyBtZW1iZXIgRm9vOjpiYXIKICAgICAgICAgICAgdGhyb3VnaCBGb29QdHItLS1yZXN1bHRpbmcgYm9ndXMgd3JhcHBlciBjb2RlIGFuZCBhIGNvbXBpbGVyCiAgICAgICAgICAgIGVycm9yLgoKICAgICAgICAgICAgRHVlIHRvIHRoZSB3YXkgaW4gd2hpY2ggb3ZlcmxvYWRpbmcgaXMgaGFuZGxlZCwgaXQgaXMKICAgICAgICAgICAgZXh0cmVtZWx5IGRpZmZpY3VsdCB0byBlbGltaW5hdGUgdGhlIHN0YXRpYyBtZXRob2QgaW4KICAgICAgICAgICAgdGhpcyBjYXNlLiAgVGhlcmVmb3JlLCBpdCBpcyBzdGlsbCBleHBvc2VkLiAgSG93ZXZlciwKICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBjb2RlIG5vdyBjb21waWxlcyBhbmQgd29ya3MuCgoxMC8wNS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlLCBNelNjaGVtZSwgQ2hpY2tlbl06IFJlbW92ZSBzeW1ib2wgY2xhc2hlcyBiZXR3ZWVuCgkgICAgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGJ5IHJlbmFtaW5nIGFsbCBleHRlcm4gY29tbW9uLnN3ZwoJICAgIGZ1bmN0aW9ucyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IuCgoxMC8wNS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGRlZCBiYXNpYyBHT09QUyBzdXBwb3J0LCBjb250cmlidXRlZCBieSBKb2huIExlbnouCgkgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgoJICAgIAogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC8wNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBOZXcgb3B0aW9uLCAtb25seS1zZXR0ZXJzLCB3aGljaCBkaXNhYmxlcwoJICAgIHRyYWRpdGlvbmFsIGdldHRlciBhbmQgc2V0dGVyIHByb2NlZHVyZXMgZm9yIHN0cnVjdHVyZSBzbG90cy4KCjEwLzAzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZGVkIHJ1biB0ZXN0IGZvciByZWZlcmVuY2VfZ2xvYmFsX3ZhcnMgYnkgSm9obiBMZW56LgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBQYXJ0aWFsIHNvbHV0aW9uIHRvIFsgNzkyMTgwIF0gQysrIHNtYXJ0LXBvaW50ZXIvbmFtZXNwYWNlIG1peHVwIHJldmlzaXRlZC4KICAgICAgICAgICAgVGhlIHByb2JsZW0gaXMgbm90IGVhc3kgdG8gZml4IChhdCBsZWFzdCBpdCBkb2Vzbid0IHNlZW0gc28pLCBidXQgaXMKICAgICAgICAgICAgcmVsYXRlZCB0byB0aGUgaW5zdGFudGlhdGlvbiBvZiBxdWFsaWZpZWQgdGVtcGxhdGVzIGluc2lkZSBvZiBvdGhlcgogICAgICAgICAgICBuYW1lc3BhY2VzLiAgIFNXSUcgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlIGluIHRoaXMgY2FzZSByYXRoZXIKICAgICAgICAgICAgdGhhbiBnZW5lcmF0aW5nIGJyb2tlbiB3cmFwcGVycy4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MDAwMTIgXSBFTlRFUiBtYWNybyBmcm9tIENPUkUvc2NvcGUuaCBjbGFzaGVzIHdpdGggbGliYyBzZWFyY2guaC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODExNTE4IF0gQ2FzdGluZyBpbnRzIHRvIGRvdWJsZXMgKHcvIHNvbHV0aW9uPykKICAgICAgICAgICAgQWRkcmVzc2VzIGEgcHJvYmxlbSB3aXRoIG92ZXJsb2FkaW5nIGluIHRoZSBQZXJsIG1vZHVsZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIERhbGxleS4KCjA5LzI4LzIwMDM6IG1rb2VwcGUKCSAgICBbR3VpbGUgd2l0aCAtc2NtIG9wdGlvbl0gRml4IHR5cG8gaW4gZ2VuZXJhdGVkIGNvZGUgZm9yCgkgICAgcHJvY2VkdXJlcy13aXRoLXNldHRlcnMuICBSZXBvcnRlZCBieSBKb2huIExlbnouCgowOS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODEyNTI4IF0gZXh0ZXJucyBub3QgY29ycmVjdCB3aGVuIHRocm93IGlzIGluIHNpZ25hdHVyZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zZXBoIFdpbnN0b24uCiAgICAgICAgICAgIAowOS8yMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU1dJRyB3YXMgZ2VuZXJhdGluZyBhIG51bWJlciBvZiBzeW1ib2xzIHRoYXQgZGlkbid0IGNvbXBseSB3aXRoIAogICAgICAgICAgICB0aGUgSVNPIEMvQysrIHN0YW5kYXJkLCBpbiBwYXJ0aWN1bGFyIElTTy9JRUMgMTQ4ODI6MTk5OChFKSAxNy40LjMuMS4yCiAgICAgICAgICAgIHdoZXJlIGRvdWJsZSB1bmRlcnNjb3JlcyBhcmUgZm9yYmlkZGVuIGFzIHdlbGwgYXMgc3ltYm9scyBzdGFydGluZyB3aXRoCiAgICAgICAgICAgIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgYW4gdXBwZXIgY2FzZSBsZXR0ZXIuIE1vc3Qgb2YgdGhlc2UgaGF2ZQogICAgICAgICAgICBiZWVuIHJvb3RlZCBvdXQuIFNlZSBuZXcgc2VjdGlvbiBhZGRlZCB0byBpbnRlcm5hbHMuaHRtbCBkZXZlbG9wbWVudAogICAgICAgICAgICBtYW51YWwgJ1N5bWJvbCBOYW1pbmcgR3VpZGVsaW5lcyBmb3IgR2VuZXJhdGVkIEMvQysrIENvZGUnLgoKMDkvMjMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIERpcmVjdG9yIHR5cGVtYXAgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBpbnYgICAgID0+IGRpcmVjdG9yaW4KICAgICAgICAgICAgb3V0diAgICA9PiBkaXJlY3Rvcm91dAogICAgICAgICAgICBhcmdvdXR2ID0+IGRpcmVjdG9yYXJnb3V0CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzE5LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFtQeXRob25dIERpcmVjdG9yIGNvbnN0cnVjdG9ycyBub3cgZGVmYXVsdCB0byBfX2Rpc293biA9IDAsIAoJICAgIHdoaWNoIGlzIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBhbmQgZml4ZXMgdGhlIGRpcmVjdG9yX2ZpbmFsaXplciAKCSAgICB0ZXN0IGNhc2UgdW5kZXIgcHl0aG9uLgoKMDkvMTIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gLSBUeXBlbWFwcyBhZGRlZCBmb3Igc3RkOjpzdHJpbmcgYW5kIGNvbnN0IHN0ZDo6c3RyaW5nICYuCiAgICAgICAgICAgICAgICAgLSBOZXcgZGVsZWdhdGUgZm9yIGNyZWF0aW5nIGEgQyMgc3RyaW5nIGdpdmVuIGEgY2hhciAqLiBJdAogICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgYnkgY2FsbGluZyBTV0lHX2NzaGFycF9zdHJpbmdfY2FsbGJhY2sgYXMgc2hvd24KICAgICAgICAgICAgICAgICAgIGluIHRoZSBzdGQ6OnN0cmluZyAnb3V0JyB0eXBlbWFwLiBVc2VmdWwgaWYgdGhlIHJldHVybiB0eXBlIGlzCiAgICAgICAgICAgICAgICAgICBtYXBwZWQgdG8gYSBDIyBzdHJpbmcgYW5kIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIAogICAgICAgICAgICAgICAgICAgZm9yIGNsZWFuaW5nIHVwIG1lbW9yeSBhcyB0aGUgQyMgZ2FyYmFnZSBjb2xsZWN0b3IgZG9lc24ndAogICAgICAgICAgICAgICAgICAgZnJlZSB0aGUgbWVtb3J5IGNyZWF0ZWQgaW4gQy9DKysgYW5kIHRoZW4gcmV0dXJuZWQgYXMgYSBDIyBzdHJpbmcuCiAgICAgICAgICAgICAgICAgLSBUaGUgZXhjZXB0aW9uIGRlbGVnYXRlcyBoYXZlIG1vdmVkIGludG8gYW4gaW5uZXIgY2xhc3MgaW4gdGhlCiAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGUgY2xhc3MsIHRoZXJlYnkgZnJlZWluZyB1cCB0aGUgc3RhdGljIGNvbnN0cnVjdG9yLgoKMDkvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICAoSW50ZXJuYWxzKQogICAgICAgICAgICBNYWpvciByZWZhY3RvcmluZyBvZiBpdGVyYXRpb24gb3ZlciBsaXN0cyBhbmQgaGFzaGVzLiAgVGhlCiAgICAgICAgICAgIERPSCBsaWJyYXJ5IG5vdyB1c2VzIGl0ZXJhdG9ycy4gIFRoZXkgd29yayBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgTGlzdCAqbCA9IChzb21lIGxpc3QpOwoKICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGk7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBGaXJzdChsKTsgaS5pdGVtOyBpID0gTmV4dChpKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGkuaXRlbSBjb250YWlucyB0aGUgYWN0dWFsIGxpc3QgaXRlbS4KICAgICAgICAgICAgICAgICAgICAvLyBpLml0ZW0gaXMgTlVMTCBhdCBlbmQgb2YgbGlzdAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEhhc2ggKmggPSAoc29tZSBoYXNoKTsKICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGo7CiAgICAgICAgICAgICAgICBmb3IgKGogPSBGaXJzdChoKTsgai5pdGVtOyBqID0gTmV4dChqKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGouaXRlbSBjb250YWlucyBoYXNoIHRhYmxlIGl0ZW0KICAgICAgICAgICAgICAgICAgICAvLyBqLmtleSAgY29udGFpbnMgaGFzaCB0YWJsZSBrZXkKICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIGouaXRlbSBhbmQgai5rZXkgYXJlIE5VTEwgYXQgZW5kCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgVGhlIG9sZCBpdGVyYXRpb24gZnVuY3Rpb25zIEZpcnN0aXRlbSgpLCBOZXh0aXRlbSgpLCBGaXJzdGtleSgpLAogICAgICAgICAgICBhbmQgTmV4dGtleSgpIGFyZSBnb25lLiAgCgogICAgICAgICAgICBUaGUgbmV3IGl0ZXJhdG9ycyBhcmUgc2ltcGxlciwgcmVzdWx0IGluIGJldHRlciBtZW1vcnkgdXNlLAogICAgICAgICAgICBhbmQgbWF5IGJlIGZhc3Rlci4gIEFsc28sIHRoZXJlIGFyZSBubyBsb25nZXIgYW55IHByb2JsZW1zCiAgICAgICAgICAgIGl0ZXJhdGluZyBvdmVyIHRoZSBzYW1lIGxpc3QvaGFzaCBpbiBtdWx0aXBsZSBwbGFjZXMgYXQKICAgICAgICAgICAgdGhlIHNhbWUgdGltZS4gIEZvciBleGFtcGxlLCB0aGlzIGlzIGZpbmU6CgogICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGksajsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSBGaXJzdChsKTsgaS5pdGVtOyBpID0gTmV4dChpKSkgewogICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IEZpcnN0KGwpOyBqLml0ZW07IGogPSBOZXh0KGopKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKFRoaXMgbmV2ZXIgd29ya2VkIGluIHByZXZpb3VzIHZlcnNpb25zKS4KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqLiAgVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIAogICAgICAgICAgICB0aGlyZCBwYXJ0eSBleHRlbnNpb25zIHRvIFNXSUcgKG9yIGdpdmUgdGhlbSBmdXJ0aGVyIGVuY291cmFnZW1lbnQKICAgICAgICAgICAgdG8gam9pbiB0aGUgU1dJRyBDVlMtdHJlZSA6LSkuCgowOS8xMC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBGaXggbWVtb3J5IGxlYWtzIGluIHRoZSAibGlzdC12ZWN0b3IuaSIgdHlwZW1hcHMuCgowOS8wOS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIFVzZSBDX21rX2Jvb2wgcmF0aGVyIHRoYW4gQ19ta2Jvb2wuICBUaGlzIGZpeGVzCgkgICAgdGhlIHdyYXBwaW5nIG9mIGJvb2xlYW4gdmFsdWVzIGZvciBDaGlja2VuIDEuMTAgYW5kIG5ld2VyLgoJICAgIFJlcG9ydGVkIGJ5IERhdmUgPGh1bmRvQHlhaG9vLmNvbT4gLyBGZWxpeCBXaW5rZWxtYW5uCgkgICAgPGZlbGl4QHByb3hpbWEtbXQuZGU+LgoKMDkvMDUvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvcnMgaW1wbGVtZW50ZWQgZm9yIEphdmEuIEluIHN1bW1hcnkgdGhpcyBpcyBhIGJpZyBuZXcgZmVhdHVyZSAKICAgICAgICAgICAgd2hpY2ggc3VwcG9ydHMgdXBjYWxscyBmcm9tIEMrKyB0byBKYXZhLiBDb2RlIGlzIGdlbmVyYXRlZCB0byBzdXBwb3J0IEMrKyAKICAgICAgICAgICAgY2FsbGJhY2tzIHRvIGNhbGwgaW50byBKYXZhIGFuZCB0cnVlIHBvbHltb3JwaGljIGJlaGF2aW91ciBmb3IgSmF2YSBjbGFzc2VzIAogICAgICAgICAgICBkZXJpdmVkIGZyb20gQysrIGNsYXNzZXMuIFNlZSBqYXZhLmh0bWwgZm9yIGRldGFpbHMuIENvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBTY290dCBNaWNoZWwuCgowOS8wNS8yMDAzOiBUaWdlcgogICAgICAgICAgICBDcmVhdGVkIGNvbnRyYWN0IGV4YW1wbGUgZGlyZWN0b3J5IGF0IC9TV0lHL0V4YW1wbGVzL2NvbnRyYWN0CiAgICAgICAgICAgIEFkZGVkIHNpbXBsZSBjb250cmFjdCBleGFtcGxlcyAoc2ltcGxlX2MgJiBzaW1wbGVfY3h4KQogICAgICAgICAgICBNb2RpZmllZCBjb250cmFjdCBtb2R1bGUncyBvdXRwdXQgZm9ybWF0CgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOS8wMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGVzdC1zdWl0ZSBidWlsZCBpbXByb3ZlbWVudHM6CiAgICAgICAgICAgIC0gTXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgd29ya2luZyBmb3IgdGhlIHRlc3Qgc3VpdGUsIHNvIGl0IGlzIG5vdwogICAgICAgICAgICAgIHBvc3NpYmxlIHRvIHJ1biBjb25maWd1cmUgaW4gbXVsdGlwbGUgc3ViZGlyZWN0b3JpZXMgYW5kIHJ1biB0aGUgdGVzdAogICAgICAgICAgICAgIHN1aXRlIGluIGVhY2ggb2YgdGhlc2Ugc3ViIGRpcmVjdG9yaWVzLgogICAgICAgICAgICAtICdtYWtlIGRpc3RjbGVhbicgZml4ZWQgc28gaXQgZG9lc24ndCBib21iIG91dCBvbiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgd2hlbiB1c2luZyBtdWx0aXBsZSBzdWJkaXJldG9yeSBidWlsZHMuIFJlcXVpcmVkIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMKICAgICAgICAgICAgICB0byBiZSBtb3ZlZDoKICAgICAgICAgICAgICAgIEV4YW1wbGVzL0dJRlBsb3QvUGVybCAtPiBFeGFtcGxlcy9HSUZQbG90L1Blcmw1CiAgICAgICAgICAgICAgICBFeGFtcGxlcy9HSUZQbG90L1BocCAgLT4gRXhhbXBsZXMvR0lGUGxvdC9QaHA0CiAgICAgICAgICAgICAgVGhlc2UgbmV3IGRpcmVjdG9yaWVzIHVzZWQgdG8gYmUgc3ltYm9saWMgbGlua3MgdG8gdGhlIG9sZCBkaXJlY3RvcnkuCiAgICAgICAgICAgICAgQWxzbyB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9QZXJsIHN5bWJvbGljIGxpbmsgaGFzIGJlZW4gcmVtb3ZlZC4KICAgICAgICAgICAgLSBSdW5uaW5nIHRoZSB0ZXN0LXN1aXRlLCBvdGhlciB0aGFuIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5LCBzYXkKICAgICAgICAgICAgICBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlL3B5dGhvbiB3aWxsIG5vdyBkaXNwbGF5IGFsbCB0aGUgY29kZSBiZWluZwogICAgICAgICAgICAgIGV4ZWN1dGVkLgogICAgICAgICAgICAtIFRoZSBmb2xsb3dpbmcgMyBDIyBjb21waWxlcnMgYXJlIGRldGVjdGVkIGR1cmluZyBjb25maWd1cmUgYW5kIHdvcmsgd2l0aCAKICAgICAgICAgICAgICB0aGUgdGVzdC1zdWl0ZTogTW9ubywgUG9ydGFibGUuTkVUIGFuZCBNaWNyb3NvZnQuCgowOS8wMS8yMDAzOiBUaWdlcgogICAgICAgICAgICBBZGRlZCBpbmhlcml0YW5jZSBzdXBwb3J0IGZvciBkZXNpZ24gYnkgY29udHJhY3QgZmVhdHVyZS4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTQ5MTQgXSBXcm9uZyB0eXBlcyBpbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KICAgICAgICAgICAgU1dJRyB3YXMgbm90IGhhbmRsaW5nIGFyZ3VtZW50cyBjb3JyZWN0bHkgaW4gdGVtcGxhdGUgCiAgICAgICAgICAgIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb288VCAqPiB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgVCAqYmxhaCgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vSW50KSBGb288aW50ICo+OwoKICAgICAgICAgICAgaW4gdGhpcyBjbGFzcywgdGhlIHJldHVybiB0eXBlIG9mIGJsYWggd2FzIHNldCB0bwogICAgICAgICAgICAnaW50ICoqJywgYnV0IGl0IHNob3VsZCByZWFsbHkgYmUgJ2ludCAqJy4gIFRoaXMgaGFzIGJlZW4KICAgICAgICAgICAgZml4ZWQsIGJ1dCBpdCB3aWxsIGFmZmVjdCBhbGwgcHJpb3IgdXNlcyBvZiBwYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uLgogCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3ODYzOTQgXSBQYXRjaCBmb3IgZ2VuZXJhdGVkIHBlcmwgY29kZSBkb2VzIG5vdCBjb21waWxlIHVuZGVyIFJlZEhhdDkuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNjb3R0IEZpbm5lcmFuLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5MTU3OSBdICh1bnNpZ25lZCkgbG9uZyBsb25nIGhhbmRsZWQgaW5jb3JyZWN0bHkgKFRjbCkuCiAgICAgICAgICAgIFRoaXMgd2FzIGFuIGVycm9yIGluIHRoZSBUY2wgdHlwZW1hcHMuaSBmaWxlLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgS2plbGwgV29vZGluZy4KICAgICAgICAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NzU3MyBdIG5vIHdheSB0byByZW5hbWUgY2xhc3NlcyBjb21pbmcgZnJvbSBDIHN0cnVjdHVyZXMuCiAgICAgICAgICAgIFRoaXMgcHJvYmxlbSByZWxhdGVzIHRvIHJlbmFtaW5nIG9mIGFub255bW91cyBzdHJ1Y3R1cmVzIHdpdGggYQogICAgICAgICAgICB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6IAoKICAgICAgICAgICAgICAgICAgJXJlbmFtZShCYXIpIEZvbzsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfSBGb287CgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KICAgICAgICAgICAgCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTc1NzYgXSAtaGVscCBzZWVtcyB0byBpbXBseSB0aGF0IG9ubHkgdGNsLXNwZWNpZmljIG9wdGlvbnMgZXhpc3QuCiAgICAgICAgICAgIEFkZGVkIGEgY29tbWVudCB0byBhbGVydCB1c2VyIHRvIG90aGVyIG9wdGlvbnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5ODIwNSBdIFNlZ2ZhdWx0IGluIFNXSUdfQ29udmVydFB0ci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUHJhYmh1IFJhbWFjaGFuZHJhbi4KCjA4LzMwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIE1vZGlmaWVkIHRoZSBkaXJlY3RvciB0eXBlbWFwcyBpbiBweXRob24vc3RkX2NvbXBsZXguaSB0byB1c2UgdGhlIAoJICAgIG5ldy1zdHlsZSBtYWNybyBhbmQgY29udmVyc2lvbiBmdW5jdGlvbnMsIHdoaWNoIGVsaW1pbmF0ZWQgc29tZQoJICAgIHJlZHVuZGFudCBjb2RlLiAgRml4ZWQgYSBmZXcgYnVncyBpbiB0aGVzZSB0eXBlbWFwcyBhcyB3ZWxsLCBhbHRob3VnaAoJICAgIG1vcmUgdGVzdGluZyBpcyBuZWVkZWQuCgowOC8yOS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBDb21wbGV0ZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB3cmFwcGluZyBhYnN0cmFjdCBjbGFzc2VzIHdpdGggZGlyZWN0b3JzLgoJICAgIENvbnN0cnVjdG9yIHdyYXBwZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBhYnN0cmFjdCBjbGFzc2VzIHRoYXQgaGF2ZQoJICAgIGRpcmVjdG9ycywgYW5kIGluc3RhbmNlcyBvZiB0aGUgZGlyZWN0b3IgY2xhc3NlcyB3aWxsIGJlIGNyZWF0ZWQgcmVnYXJkbGVzcwoJICAgIG9mIHdoZXRoZXIgdGhlIHByb3h5IGNsYXNzIGhhcyBiZWVuIHN1YmNsYXNzZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCSAgICBObyBjaGVja3MgYXJlIG1hZGUgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgcHVyZSB2aXJ0dWFsCgkgICAgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEluc3RlYWQsIGNhbGxzIHRvCgkgICAgdW5pbXBsZW1lbnRlZCBtZXRob2RzIHdpbGwgdGhyb3cgU1dJR19ESVJFQ1RPUl9QVVJFX1ZJUlRVQUxfRVhDRVBUSU9OCgkgICAgZXhjZXB0aW9ucyBpbiBDKysuCgoJICAgIEludGVncmF0ZWQgUHJhYmh1IFJhbWFjaGFuZHJhbidzIHR5cGVtYXAgcGF0Y2hlcywgd2hpY2ggcHJvdmlkZSBkaXJlY3RvcgoJICAgIHR5cGVtYXAgc3VwcG9ydCBmb3IgZW51bXMgYW5kIHN0ZDo6c2l6ZV90LCBhbmQgZml4IGEgY291cGxlIGJ1Z3MgaW4gdGhlIAoJICAgIGRpcmVjdG9yIHN0ZDo6dmVjdG9yPD4gdHlwZW1hcHMuCgowOC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbXBsZW1lbnRlZCBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHRocm93aW5nIEMjIGV4Y2VwdGlvbnMgZnJvbSBDL0MrKyBjb2RlLgogICAgICAgICAgICBBIGZldyBkZWxlZ2F0ZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgY2FsbGluZyB3aGljaCB0aGVuIHRocm93IHRoZSBDIwogICAgICAgICAgICBleGNlcHRpb24uIFVzZSB0aGUgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbiBmdW5jdGlvbiBmcm9tIEMvQysrIHR5cGVtYXBzLgogICAgICAgICAgICBTZWUgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgb3IgY3NoYXJwaGVhZC5zd2cgZm9yIGFsbCBhdmFpbGFibGUgZXhjZXB0aW9ucy4KICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbihTV0lHX0NTaGFycEV4Y2VwdGlvbiwgImV4Y2VwdGlvbiBkZXNjcmlwdGlvbiIpOwoKICAgICAgICAgICAgVGhlICd0aHJvd3MnIHR5cGVtYXBzIGFyZSBhbHNvIG5vdyBpbXBsZW1lbnRlZCwgc28gY29kZSBpcyBhdXRvbWF0aWNhbGx5IAogICAgICAgICAgICBnZW5lcmF0ZWQgdG8gY29udmVydCBhbnkgQysrIGV4Y2VwdGlvbiBpbnRvIGEgQyMgU3lzdGVtLkV4Y2VwdGlvbiB3aGVuIHRoZSBDKysgCiAgICAgICAgICAgIG1ldGhvZCBkZWNsYXJlcyBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBzdWNoIGFzOgoKICAgICAgICAgICAgICAgaW50IGZvbygpIHRocm93KEJhcik7CgogICAgICAgICAgICBBbHNvIGFueSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHJlZmVyZW5jZXMgdG8gYSBDKysgY2xhc3Mgb3IgYSBjbGFzcyBwYXNzZWQgYnkgdmFsdWUKICAgICAgICAgICAgYW5kIGFyZSBwYXNzZWQgYXMgYSBDIyBudWxsIHdpbGwgbm93IHRocm93IGEgQyMgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbi4KCjA4LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpeCB0byBtYXRjaCB0aGUgY2FsbGluZyBjb252ZW50aW9uIG9mIGFsbCBwaW52b2tlIG1ldGhvZHMgc28gdGhhdCB0aGV5CiAgICAgICAgICAgIG1hdGNoIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBieSBkZWZhdWx0IGluIHRoZSBDIyAnc3RhdGljIGV4dGVybicgZGVjbGFyYXRpb25zIAogICAgICAgICAgICAoX19zdGRjYWxsIGlzIHVzZWQgb24gV2luZG93cykuCgowOC8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFJld29ya2VkIHN0ZDo6c3RyaW5nIHR5cGVtYXBzLiBGaXhlcyBhIG51bWJlciBvZiBzdHJpbmcgaW4gc3RkIG5hbWVzcGFjZSAKICAgICAgICAgICAgcHJvYmxlbXMuIEZvciBleGFtcGxlICV0ZW1wbGF0ZSB2ZWN0b3I8c3RyaW5nPi4gVGhlIHRlbXBsYXRlZCBjbGFzcycgZ2V0IG1ldGhvZCAKICAgICAgICAgICAgd2Fzbid0IHJldHVybmluZyBhIEphdmEgU3RyaW5nLCBidXQgYSBTV0lHVFlQRV9wX3N0cmluZy4gUmVwb3J0ZWQKICAgICAgICAgICAgYnkgWmFjaCBCYXVtLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc2MzUyMiBdIDEuMy4xOSBzZWdmYXVsdCBpbiBTd2lnVHlwZV9hZGRfcG9pbnRlci9Eb2hJbnNlcnRpdGVtLgogICAgICAgICAgICBSZWxhdGVkIHRvIHByb2JsZW0gd2l0aCB1bm5hbWVkIGNsYXNzIGhhbmRsaW5nIGluIFBlcmwgbW9kdWxlLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc2MzU2MyBdIE1pc3NpbmcgaW5kaWNhdGlvbiBvZiBvcHRpb25hbCBhcmd1bWVudHMuCiAgICAgICAgICAgIFRjbCBtb2R1bGUuICBSZXBvcnRlZCBieSBLcnp5c3p0b2YgS296bWluc2tpLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc4NzQzMiBdIGxvbmcgcGFyYW0gaGFuZGxlZCBhcyBpbnQuICBUY2wgbW9kdWxlCiAgICAgICAgICAgIG5vdyB1c2VzIFRjbF9HZXRMb25nRnJvbU9iaiB0byBjb252ZXJ0IGludGVnZXIgdmFsdWVzLgoKMDgvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3NTk4OSBdIG51bWVyaWMgdGVtcGxhdGUgcGFyYW1ldGVycy4gICBUaGVyZSB3ZXJlCiAgICAgICAgICAgIHNvbWUgZXJyb3JzIGluIHRlbXBsYXRlIGV4cGFuc2lvbiByZWxhdGVkIHRvIHRoZSB1c2Ugb2YKICAgICAgICAgICAgYXJyYXlzIHdoZXJlIHRoZSBhcnJheSBkaW1lbnNpb24gd2FzIGEgdGVtcGxhdGUgcGFyYW1ldGVyLgogICAgICAgICAgICBJdCBzaG91bGQgd29yayBub3cuICBSZXBvcnRlZCBieSBCcnlhbiBHcmVlbi4KCjA4LzEwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIGEgZGlyZWN0b3IgdHlwZW1hcCAob3V0dikgZm9yIHJldHVybiBieSB2YWx1ZSBhbmQgY2xlYW5lZCB1cCB1cCBhIGZldyAKCSAgICBvZiB0aGUgY29tbWVudGVkIGRpcmVjdG9yIHR5cGVtYXBzLgoKMDgvMTAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiBmb3IgZGlyZWN0b3IgY2xhc3NlcyB0byBpZ25vcmUgcHJpdmF0ZQoJICAgIGNvbnN0cnVjdG9ycy4gIFByb3RlY3RlZCBjb25zdHJ1Y3RvcnMgYXJlIGFsc28gaWdub3JlZCBmb3Igbm93LCBwZW5kaW5nCgkgICAgYSBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSBvZiB3cmFwcGluZyBjbGFzc2VzIHRoYXQgb25seSBkZWZpbmUgcHJvdGVjdGVkCgkgICAgY29uc3RydWN0b3JzLgoKMDgvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLW91dGRpciA8ZGlyPiB0byBzcGVjaWZ5IHdoZXJlIHRoZSBsYW5ndWFnZSBzcGVjaWZpYwogICAgICAgICAgICBmaWxlcyBhcmUgdG8gYmUgZ2VuZXJhdGVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGFyZ2V0IGxhbmd1YWdlcyBsaWtlIFB5dGhvbiwKICAgICAgICAgICAgSmF2YSBldGMgd2hpY2ggZ2VuZXJhdGUgcHJveHkgZmlsZXMgaW4gdGhlIGFwcHJvcHJpYXRlIGxhbmd1YWdlLgogICAgICAgICAgICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhcHBseSB0byB0aGUgQy9DKysgd3JhcHBlciBmaWxlLgoKMDgvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE9uIFdpbmRvd3MgdGhlIGdlbmVyYXRlZCBmaWxlcyAob3RoZXIgdGhhbiB0aGUgX3dyYXAuYyBvciBfd3JhcC5jeHggZmlsZXMpCiAgICAgICAgICAgIHdlcmUgc29tZXRpbWVzIGluY29ycmVjdGx5IGJlaW5nIGdlbmVyYXRlZCBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB1bmxlc3MKICAgICAgICAgICAgdGhlIGlucHV0IGZpbGUgdXNlZCB0aGUgVW5peCBwYXRoIHNlcGFyYXRvci4gVGhlIFdpbmRvd3MgcGF0aCBzZXBhcmF0b3IgCiAgICAgICAgICAgIHNob3VsZCBub3cgYmUgdXNlZC4gQnVnIHJlcG9ydGVkIGJ5IFJvYmVydCBEYXZpZXMuCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGFycmF5IHZhcmlhYmxlIHNldCB0eXBlbWFwIHRvIFBlcmwgbW9kdWxlLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3NTY3NyBdIEFycmF5IGluaXQgY2F1c2VzIGNvZGVnZW4gYnVnLi4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzkwNjIgXSBDbGFzcyJcbiI6OmZvbyBub3Qgc3VwcG9ydGVkLiAgU1dJRwogICAgICAgICAgICBzaG91bGQgbm93IGNvcnJlY3RseSBoYW5kbGUgd2hpdGVzcGFjZSBpbiBiZXR3ZWVuIAogICAgICAgICAgICBuYW1lc3BhY2UgcXVhbGlmaWVycy4gIEZvciBleGFtcGxlICJBIDo6IEZvbyA6OiBCYXIiLgogICAgICAgICAgICAKMDcvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIGZvciBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBjbGFzc2VzIHRoYXQgYXJlIHBhc3NlZCBieSB2YWx1ZSBhbmQgaGF2ZSAKICAgICAgICAgICAgYSBkZWZhdWx0IHZhbHVlLiBBIGNvcHkgY29uc3RydWN0b3IgZm9yIFN3aWdWYWx1ZVdyYXBwZXIgaXMgcmVxdWlyZWQgCiAgICAgICAgICAgIChTRiAjNzgwMDU2KS4gQWxzbyBmaXhlZCBtZW1vcnkgbGVhayBpbiB0aGVzZSBjaXJjdW1zdGFuY2VzLiBUaGVzZSBtb2RzCiAgICAgICAgICAgIGFsc28gZml4IFNGICM3ODAwNTQuCgowNy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEltcHJvdmVkIHJ1bi10aW1lIGVycm9yIG1lc3NhZ2UgZm9yIHBvaW50ZXJzIGluIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFpvb2tvLgoKMDcvMTAvMjAwMzogYmFsbGFiaW8gKEx1aWdpIEJhbGxhYmlvKQogICAgICAgICAgICBbQWxtb3N0IGFsbCBsYW5ndWFnZXNdIFdyYXBwZXJzIGZvciBzdGQ6OnBhaXIgYWRkZWQuCgkgICAgVHlwZW1hcHMgZm9yIFB5dGhvbiwgUnVieSwgR3VpbGUgYW5kIE16U2NoZW1lLgoKMDcvMDEvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBIYW5kbGUgdGhlIGNhc2Ugb2YgbW9yZSB0aGFuIG9uZSBhcmdvdXQgdHlwZW1hcAoJICAgIHBlciBmdW5jdGlvbi4KCjA2LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFNGICM2NzA5NDkgcmVxdWVzdC4gVGhlIGRlc3RydWN0b3Igd3JhcHBlciBmdW5jdGlvbiBuYW1lIGlzIG5vdyAKICAgICAgICAgICAgY29uZmlndXJhYmxlLiAgQSBuZXcgYXR0cmlidXRlIGNhbGxlZCBtZXRob2RuYW1lIGluIHRoZSAKICAgICAgICAgICAgamF2YWRlc3RydWN0L2phdmFkZXN0cnVjdF9kZXJpdmVkIChKYXZhKSBvciBjc2Rlc3RydWN0L2NzZGVzdHJ1Y3RfZGVyaXZlZCAoQyMpCiAgICAgICAgICAgIHR5cGVtYXBzIHNwZWNpZmllcyB0aGUgbWV0aG9kIG5hbWUuIEZvciBleGFtcGxlIGluIEphdmEgdGhlIGRlc3RydWN0b3IgaXMgCiAgICAgICAgICAgIHdyYXBwZWQgYnkgZGVmYXVsdCB3aXRoIHRoZSBkZWxldGUgbWV0aG9kOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFkZXN0cnVjdCwgbWV0aG9kbmFtZT0iZGVsZXRlIikgU1dJR1RZUEUgey4uLn0KCjA2LzI3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSB0aHJvd3MgYXR0cmlidXRlIGZvciBhZGRpbmcgZXhjZXB0aW9uIGNsYXNzZXMgdG8gdGhlIHRocm93cwogICAgICAgICAgICBjbGF1c2UgYWxzbyBub3cgd29ya3Mgd2l0aCB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOiAKICAgICAgICAgICAgbmV3ZnJlZQogICAgICAgICAgICBqYXZhaW4sIGphdmFvdXQgKEphdmEpCiAgICAgICAgICAgIGNzaW4sIGNzb3V0IChDIykKCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgJ0FuRXhjZXB0aW9uJyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0aHJvd3MgY2xhdXNlIGluIHRoZQogICAgICAgICAgICBwcm94eSBmdW5jdGlvbjoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQsIHRocm93cz0iQW5FeGNlcHRpb24iKSBpbnQgewogICAgICAgICAgICAgICAgaW50IHJldHVyblZhbHVlPSRqbmljYWxsOwogICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlPT0wKSB0aHJvdyBuZXcgQW5FeGNlcHRpb24oIlZhbHVlIG11c3Qgbm90IGJlIHplcm8iKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgfQoKMDYvMjUvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgW1B5dGhvbl0gRGlyZWN0b3IgdHlwZW1hcCBtYXJzaGFsbGluZyBjaGVja3MgZm9yIG51bGwgcG9pbnRlcnMgd2hlbgoJICAgIHdhbGtpbmcgdGhlIHBhcmFtZXRlciBsaXN0IGluc3RlYWQgb2YgcmVseWluZyBzb2xleSBvbiB0aGUgcGFyYW1ldGVyCgkgICAgY291bnQuICBDdXJlcyBhIHNlZ2ZhdWx0IHRoYXQgb2NjdXJyZWQgZm9yIG11bHRpcGxlIGFyZ3VtZW50IGludiB0eXBlbWFwcy4KCSAgICBTb21lb25lIHdpdGggbW9yZSBTd2lnIGV4cGVyaWVuY2Ugc2hvdWxkIHByb2JhYmx5IHJldmlldyB0aGlzIGNvZGUuCgowNi8yNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIERvbid0IGVtaXQgY2FsbHMgdG8gIkNfY2hlY2tfZm9yX2ludGVycnVwdCIsCgkgICAgd2hpY2ggbWF5IHJlc3VsdCBpbiBhbiBlbmRsZXNzIGxvb3AuICBQYXRjaCBieSBmZWxpeEBwcm94aW1hLW10LmRlLgoKMDYvMjAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRmluYWxpemVycyBub3cgdXNlIGRlc3RydWN0b3Igc3ludGF4IGFzIHRoZSBvdmVycmlkZSB3aGljaCB3YXMgdXNlZCBpbiAKICAgICAgICAgICAgdGhlIEZpbmFsaXplIG1ldGhvZCBpcyBub3QgaW4gdGhlIEVDTUEgc3RhbmRhcmRzLCBzcG90dGVkIGJ5IHRoZSBNUyBjb21waWxlci4KCjA2LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEEgbnVtYmVyIG9mIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcmVtb3ZlIHRoZSBKYXZhIG5hbWluZyAKICAgICAgICAgICAgdGhhdCB3YXMgdXNlZCBpbiB0aGUgQyMgbW9kdWxlLgogICAgICAgICAgICAKICAgICAgICAgICAgVHlwZW1hcCBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGpuaSAgICAgICAgICAgICAgICAgICAgICAgICAtPiBjdHlwZQogICAgICAgICAgICBqdHlwZSAgICAgICAgICAgICAgICAgICAgICAgLT4gaW10eXBlCiAgICAgICAgICAgIGpzdHlwZSAgICAgICAgICAgICAgICAgICAgICAtPiBjc3R5cGUKICAgICAgICAgICAgamF2YWluICAgICAgICAgICAgICAgICAgICAgIC0+IGNzaW4KICAgICAgICAgICAgamF2YW91dCAgICAgICAgICAgICAgICAgICAgIC0+IGNzb3V0CiAgICAgICAgICAgIGphdmFpbnRlcmZhY2VzICAgICAgICAgICAgICAtPiBjc2ludGVyZmFjZXMKICAgICAgICAgICAgamF2YWJhc2UgICAgICAgICAgICAgICAgICAgIC0+IGNzYmFzZQogICAgICAgICAgICBqYXZhY2xhc3Ntb2RpZmllcnMgICAgICAgICAgLT4gY3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqYXZhY29kZSAgICAgICAgICAgICAgICAgICAgLT4gY3Njb2RlCiAgICAgICAgICAgIGphdmFpbXBvcnRzICAgICAgICAgICAgICAgICAtPiBjc2ltcG9ydHMKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzIC0+IGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMKICAgICAgICAgICAgamF2YWdldGNwdHIgICAgICAgICAgICAgICAgIC0+IGNzZ2V0Y3B0cgogICAgICAgICAgICBqYXZhZmluYWxpemUgICAgICAgICAgICAgICAgLT4gY3NmaW5hbGl6ZQoKICAgICAgICAgICAgRmVhdHVyZSBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGphdmFjb25zdCAgICAgICAgICAgICAgICAgICAtPiBjc2NvbnN0CiAgICAgICAgICAgIGphdmFtZXRob2Rtb2RpZmllcnMgICAgICAgICAtPiBjc21ldGhvZG1vZGlmaWVycwoKICAgICAgICAgICAgUHJhZ21hIGNoYW5nZXM6CiAgICAgICAgICAgIHByYWdtYShqYXZhKSAgICAgICAgICAgICAgICAtPiBwcmFnbWEoY3NoYXJwKQogICAgICAgICAgICBqbmljbGFzc2Jhc2UgICAgICAgICAgICAgICAgLT4gaW1jbGFzc2Jhc2UKICAgICAgICAgICAgam5pY2xhc3NjbGFzc21vZGlmaWVycyAgICAgIC0+IGltY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqbmljbGFzc2NvZGUgICAgICAgICAgICAgICAgLT4gaW1jbGFzc2NvZGUKICAgICAgICAgICAgam5pY2xhc3NpbXBvcnRzICAgICAgICAgICAgIC0+IGltY2xhc3NpbXBvcnRzCiAgICAgICAgICAgIGpuaWNsYXNzaW50ZXJmYWNlcyAgICAgICAgICAtPiBpbWNsYXNzaW50ZXJmYWNlcwoKICAgICAgICAgICAgU3BlY2lhbCB2YXJpYWJsZSBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgICRqYXZhY2xhc3NuYW1lICAgICAgICAgICAgICAtPiAkY3NjbGFzc25hbWUKICAgICAgICAgICAgJGphdmFpbnB1dCAgICAgICAgICAgICAgICAgIC0+ICRjc2lucHV0CiAgICAgICAgICAgICRqbmljYWxsICAgICAgICAgICAgICAgICAgICAtPiAkaW1jYWxsCgogICAgICAgICAgICBUaGlzIHdpbGwgYnJlYWsgU1dJRyBpbnRlcmZhY2UgZmlsZXMgdGhhdCB1c2UgdGhlc2UgdHlwZW1hcHMsIGZlYXR1cmVzCiAgICAgICAgICAgIGFuZCBwcmFnbWFzLiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSBvciB1c2UgbWFjcm9zIGZvciBiYWNrd2FyZHMKICAgICAgICAgICAgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNi8xMC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBBcHBsaWVkIE16U2NoZW1lIG1vZHVsZSB1cGRhdGVzIGNvbnRyaWJ1dGVkIGJ5CgkgICAgSm9obiBMZW56IDxqZWxlbnpAc3R1ZGVudHMud2lzYy5lZHU+LgoKICAgICAgICAgICAgLSBVcGRhdGVkIG16c2NoZW1lIHRvIHVzZSBTV0lHJ3MgY29tbW9uIHJ1bnRpbWUgdHlwZQogICAgICAgICAgICAgIHN5c3RlbSBmcm9tIGNvbW1vbi5zd2cuIAoKCSAgICAtIFRoZSBMaWIvbXpzY2hlbWUgZGlyZWN0b3J5IGhhcyBiZWVuIHJlb3JnYW5pemVkIHRvCiAgICAgICAgICAgICAgc3RhbmRhcmRpemUgbmFtZXMgYWNyb3NzIHRoZSBsYW5ndWFnZSBtb2R1bGVzOgogICAgICAgICAgICAgIG16c2NoZW1lLmkgd2FzIG1vdmVkIHRvIG16c2NoZW1lLnN3ZywgbXpzY2hlbWUuc3dnIGFuZAogICAgICAgICAgICAgIG16c2NoZW1lZGVjLnN3ZyBoYXZlIGJlZW4gcmVtb3ZlZCwgbXpydW4uc3dnICh3aGljaAogICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBydW50aW1lIGNvZGUpIGhhcyBiZWVuIGFkZGVkLgoKICAgICAgICAgICAgLSBUaGUgc3dpZ19wcm94eSBzdHJ1Y3R1cmUgd2FzIHJlbmFtZWQgdG8gc3dpZ19tel9wcm94eS4KICAgICAgICAgICAgICBzd2lnX216X3Byb3h5IG5vdyBjb250YWlucyBhIHBvaW50ZXIgdG8gYSBzd2lnX3R5cGVfaW5mbwogICAgICAgICAgICAgIHN0cnVjdHVyZS4gIAoKCSAgICAtIEFkZGVkIHZhcmluIGFuZCB2YXJvdXQgdHlwZW1hcHMgZm9yIFNXSUdUWVBFIFtdIGFuZAogICAgICAgICAgICAgIFNXSUdUWVBFICYuCgoJICAgIC0gR2FyYmFnZSBjb2xsZWN0aW9uIGJ5IGNhbGxpbmcgc2NoZW1lX2FkZF9maW5hbGl6ZXIoKSBoYXMKICAgICAgICAgICAgICBiZWVuIGFkZGVkLgoKCSAgICAqKiogTkVXIEZFQVRVUkUgW016U2NoZW1lXSAqKioKCjA2LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IHR5cGVtYXBzOiBqYXZhZGVzdHJ1Y3QgYW5kIGphdmFkZXN0cnVjdF9kZXJpdmVkCiAgICAgICAgICAgIGZvciB0aGUgQysrIGRlc3RydWN0b3Igd3JhcHBlci4gVGhlIGphdmFkZXN0cnVjdCB2ZXJzaW9uIGdldHMgdXNlZCBieQogICAgICAgICAgICBjbGFzc2VzIGF0IHRoZSB0b3Agb2YgYW4gaW5oZXJpdGFuY2UgY2hhaW4gYW5kIHRoZSBqYXZhZGVzdHJ1Y3RfZGVyaXZlZCAKICAgICAgICAgICAgdmVyc2lvbiBnZXRzIHVzZWQgYnkgb3RoZXIgY2xhc3Nlcy4KCiAgICAgICAgICAgIFtDI10gY2lsZGlzcG9zZSBhbmQgY2lsZGlzcG9zZW92ZXJyaWRlIHR5cGVtYXBzIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgIGNzZGVzdHJ1Y3QgYW5kIGNzZGVzdHJ1Y3RfZGVyaXZlZCB0eXBlbWFwcy4gVGhlIGRlbGV0ZSgpCiAgICAgICAgICAgIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGFuZCBpdHMgZnVuY3Rpb25hbGl0eSBwdXQgaW50byB0aGVzZQogICAgICAgICAgICB0eXBlbWFwcyBkZXNpZ25lZCBmb3IgdGhlIERpc3Bvc2UoKSBtZXRob2QuCgogICAgICAgICAgICAtIE5ldyB0eXBlbWFwcyBjc2ludGVyZmFjZXMgYW5kIGNzaW50ZXJmYWNlc19kZXJpdmVkIHJlcGxhY2UKICAgICAgICAgICAgdGhlIGphdmFpbnRlcmZhY2VzIHR5cGVtYXAuIEFsc28gZml4ZXMgdGhlIHBlY3VsaWFyaXR5IG9mIGFsbCBjbGFzc2VzCiAgICAgICAgICAgIGluIGFuIGluaGVyaXRhbmNlIGNoYWluIGluZGl2aWR1YWxseSBkZXJpdmluZyBmcm9tIHRoZSBJRGlzcG9zYWJsZSAKICAgICAgICAgICAgaW50ZXJmYWNlLgoKICAgICAgICAgICAgLSBOZXcgdHlwZW1hcCBjc2ZpbmFsaXplIGZvciBmaW5hbGl6ZXJzLiBDKysgZGVzdHJ1Y3RvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgICAgICAgYnkgZ2FyYmFnZSBjb2xsZWN0b3IgZHVyaW5nIGZpbmFsaXphdGlvbi4gUHJvYmxlbSByZXBvcnRlZCBieSAKICAgICAgICAgICAgQW5kcmVhcyBTY2j2cmsuCgowNi8xMC8yMDAzOiBUaWdlcgoJICAgIE1vZGlmaWVkIGNvbnRyYWN0IGNvZGUgZm9yIGVycm9yIG1lc3NhZ2Ugb3V0cHV0LgogICAgICAgICAgICBDb250cmFjdCBjb2RlIGNhbiBub3cgcHJpbnQgb3V0IHNpbXBsZSBlcnJvciBtZXNzYWdlLgogICAgICAgICAgICBNb2RpZmllZCBjb250cmFjdCBjb2RlIHRvIHByZXBhcmUgZm9yIGluaGVyaXRhbmNlCiAgICAgICAgICAgIAowNi8wMy8yMDAzOiBta29lcHBlCgkgICAgW0d1aWxlXSBBcHBsaWVkIEd1aWxlIG1vZHVsZSB1cGRhdGVzIGNvbnRyaWJ1dGVkIGJ5IAoJICAgIEpvaG4gTGVueiA8amVsZW56QHN0dWRlbnRzLndpc2MuZWR1Pi4gCgoJICAgIC0gU1dJRyBjdXJyZW50bHkgdXNlcyBHdWlsZSdzIGdoXyBBUEksIHdoaWNoIGlzIG1hcmtlZCBhcwoJICAgICAgZGVwcmVjYXRlZCBpbiBHdWlsZSAxLjYgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBHdWlsZQoJICAgICAgMS45LiAgVGhpcyBjaGFuZ2UgaW50cm9kdWNlcyBhIGNvbW1hbmQtbGluZSBmbGFnICItc2NtIgoJICAgICAgd2hpY2ggY2F1c2VzIFNXSUcgdG8gZ2VuZXJhdGUgd3JhcHBlcnMgdGhhdCB1c2UgR3VpbGUncwoJICAgICAgU0NNIEFQSSBpbnN0ZWFkOyB0aGlzIHJlcXVpcmVzIEd1aWxlID49IDEuNi4KCSAgICAKCSAgICAtIFRoZSBMaWIvZ3VpbGUgZGlyZWN0b3J5IGhhcyBiZWVuIHJlb3JnYW5pemVkIHRvCiAgICAgICAgICAgICAgc3RhbmRhcmRpemUgbmFtZXMgYWNyb3NzIGxhbmd1YWdlIG1vZHVsZXM6IGd1aWxlZGVjLnN3ZwogICAgICAgICAgICAgIGFuZCBndWlsZS5zd2cgaGF2ZSBiZWVuIG1vdmVkIGludG8gZ3VpbGVfZ2hfcnVuLnN3ZywKICAgICAgICAgICAgICBndWlsZS5pIGhhcyBiZWVuIG1vdmVkIHRvIGd1aWxlX2doLnN3ZywgZ3VpbGVfc2NtLnN3ZwogICAgICAgICAgICAgIGFuZCBndWlsZV9zY21fcnVuLnN3ZyB3aGljaCBjb250YWluIHRoZSBTQ00gQVBJIHN0dWZmCiAgICAgICAgICAgICAgaGF2ZSBiZWVuIGFkZGVkCgoJICAgIC0gZ2hpbnRlcmZhY2UuaSwgd2hpY2ggY29udGFpbnMgdGhlIGRlZmluZXMgZnJvbSB0aGUgZ2hfCiAgICAgICAgICAgICAgZnVuY3Rpb25zIHRvIHRoZSBzY21fZnVuY3Rpb25zIGhhcyBiZWVuIGFkZGVkCgoJICAgIC0gVGhlIEFQSSBmb3IgZGVhbGluZyB3aXRoIHBvaW50ZXIgb2JqZWN0cyBpcyBub3cKCSAgICAgIFNXSUdfQ29udmVydFB0ciwgU1dJR19NdXN0R2V0UHRyLCBTV0lHX05ld1BvaW50ZXJPYmouCgogICAgICAgICAgICAtIEFkZGVkIHZhcmluIGFuZCB2YXJvdXQgdHlwZW1hcHMgZm9yIFNXSUdUWVBFIFtdIGFuZCBTV0lHVFlQRSAmCgogICAgICAgICAgICAtIEdhcmJhZ2UgY29sbGVjdGlvbiBoYXMgYmVlbiBhZGRlZC4KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSBbR3VpbGVdICoqKgoJICAgIAkKMDYvMDEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIERpbWVuc2lvbmxlc3MgYXJyYXlzIHN1Y2ggYXMgCgogICAgICAgICAgICAgICAgaW50IGZvb1tdID0gezEsIDJ9OwogICAgICAgICAgICAgICAgZXh0ZXJuIGludCBiYXJbXTsKCiAgICAgICAgICAgIHByb2R1Y2UgYSB3YXJuaW5nIHRoYXQgdGhlIHZhcmlhYmxlIGlzIHJlYWQtb25seS4gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQKICAgICAgICAgICAgbGFuZ3VhZ2UsIHRoaXMgdXNlZCB0byBjYXVzZSBjb21waWxlIGVycm9ycyBvciBnZW5lcmF0ZSBhIHNldHRlciB0aGF0CiAgICAgICAgICAgIGdlbmVyYXRlZCBhIHJ1bnRpbWUgZXJyb3IuIEEgc2V0dGVyIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAogICAgICAgICAgICBiZWNhdXNlIHRoZSBhcnJheSBzaXplIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IFNXSUcuIEEgdmFyaW4sIGdsb2JhbGluIAogICAgICAgICAgICBvciBtZW1iZXJpbiB0eXBlbWFwIChkZXBlbmRpbmcgb24gdGhlIHRhcmdldCBsYW5ndWFnZSkgbXVzdCBiZSB3cml0dGVuIAogICAgICAgICAgICBieSB0aGUgdXNlci4KCjA1LzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lbWVudCB0byBkZWZhdWx0IHR5cGVtYXAgbWF0Y2hpbmcgYW5kIGFycmF5cy4gIFdoZW4gYW4KICAgICAgICAgICAgYXJyYXkgaXMgZGVjbGFyZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9vWzRdOwoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHlwZW1hcCBub3cgcmVzb2x2ZXMgdG8gCgogICAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtBTlldCgogICAgICAgICAgICBJZiBubyBtYXRjaCBpcyBmb3VuZCBmb3IgdGhhdCwgaXQgdGhlbiByZXNvbHZlcyB0bwoKICAgICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbXQoKICAgICAgICAgICAgSWYgbm8gYXJyYXkgZGltZW5zaW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24sCiAgICAgICAgICAgIHRoZSBTV0lHVFlQRSBbXSBpcyB1c2VkIHJpZ2h0IGF3YXkuIAoKICAgICAgICAgICAgTm90ZTogVGhpcyBjaGFuZ2UgaGFzIGJlZW4gbWFkZSB0byByZXNvbHZlIHByb2JsZW1zIHJlbGF0ZWQgdG8KICAgICAgICAgICAgYXJyYXlzIHdpdGggYW5kIHdpdGhvdXQgZGltZW5zaW9ucy4gIEZvciBleGFtcGxlLCBzb21ldGltZXMgU1dJRwogICAgICAgICAgICB3YXMgZ2VuZXJhdGluZyBzZXR0ZXIgZnVuY3Rpb25zIGZvciBhcnJheSB2YXJpYWJsZXMgd2l0aCBubyBkaW1lbnNpb25zCiAgICAgICAgICAgIChhbiBlcnJvcikuIExpa2V3aXNlLCBTV0lHIHNvbWV0aW1lcyBtYWRlIGFycmF5cyB3aXRoIGRpbWVuc2lvbnMKICAgICAgICAgICAgcmVhZC1vbmx5IChhbHNvIGFuIGVycm9yKS4gIFRoaXMgZml4ZXMgdGhlIGFycmF5c19nbG9iYWwgdGVzdAogICAgICAgICAgICBwcm9ibGVtLgogICAgICAgICAgICAgICAgICAgICAgICAKMDUvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgdHlwZSBoYW5kbGluZyBidWcgd2l0aCByZWZlcmVuY2VzIGFuZCBwb2ludGVycy4KICAgICAgICAgICAgSWYgeW91IGhhZCBmdW5jdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwoKICAgICAgICAgICAgICAgICAgRm9vICpmdW5jMSgpOwogICAgICAgICAgICAgICAgICB2b2lkIGZ1bmMyKEJhciAmeCk7CgogICAgICAgICAgICBUaGVuIGZ1bmMyKCkgd291bGRuJ3QgYWNjZXB0IG9iamVjdHMgcmV0dXJuZWQgYnkgZnVuYzEoKQogICAgICAgICAgICBiZWNhdXNlIG9mIGEgdHlwZSBlcnJvci4gICBJdCBzaG91bGQgd29yayBub3cuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaWFuIFlhbmcuCgowNS8yMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgdG8gc29tZSBvZiB0aGUgVmlzdWFsIEMrKyBleGFtcGxlIHByb2plY3QgZmlsZXMgd2hpY2ggd291bGQgbm90IAogICAgICAgICAgICB3b3JrIHdpdGggc3BhY2VzIGluIHRoZSBwYXRocyBoZWxkIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCB0byAKICAgICAgICAgICAgcG9pbnQgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSdzIGxpYnJhcnkgLyBpbmNsdWRlIGRpcmVjdG9yeS4KICAgICAgICAgICAgU0YgYnVnICM3NDA3NjkKCjA1LzIxLzIwMDM6ICBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIC1jb250cmFjdHMgb3B0aW9uLgogICAgICAgICAgICBGaXJzdCB0cnkgb2YgdGhlIGlkZWEgb2YgIldyYXAgYnkgQ29udHJhY3QiOiAKICAgICAgICAgICAgYnVpbGQgdXAgcmVhbGlhYmxlIGNyb3NzLWxhbmd1YWdlIG1vZHVsZSBieSB3cmFwcGluZyB3aXRoIFNXSUcuCiAgICAgICAgICAgIEltcGxlbWVudGVkIGJhc2ljIGFzc2VydGlvbgogICAgICAgICAgICAocHJlYXNzZXJ0aW9uICYgcG9zdGFzc2VydGlvbiAmIGludmFyaWFudCkKICAgICAgICAgICAgZm9yIHNpbXBsZSBDL0MrKyBmdW5jdGlvbnMuCiAgICAgICAgICAgIAogICAgICAgICAgICBDdXJyZW50IGZvcm1hdCBvZiBjb250cmFjdHMgYXJlOgogICAgICAgICAgICAlY29udHJhY3QgY2xhc3NfbmFtZSA6OiBmdW5jX25hbWUgKHBhcmFzLi4uKSB7CiAgICAgICAgICAgIHJlcXVpcmU6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHJzOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIGVuc3VyZToKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcjsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICBpbnZhcmlhbnQ6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHI7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoJICAgIAkKMDUvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIHR3ZWFrcy4gVGhlcmUgd2VyZSBhIGZldyBwcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgd2hpY2ggd2VyZQogICAgICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIE1ha2VmaWxlIGZvciBwYXNzaW5nIG9uIHRoZSBjb21tYW5kbGluZSB3aGVuIGNvbXBpbGluZy4KICAgICAgICAgICAgVGhlc2UgYXJlIG5vdyBhbGwgZGVmaW5lZCBpbiBzd2lnY29uZmlnLmguIEF1dG9jb25mIGRvZXNuJ3Qgbm9ybWFsbHkgCiAgICAgICAgICAgIGFsbG93IGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyB0byBiZSBkZWZpbmVkIGluIHRoaXMgY29uZmlnIGhlYWRlciBmaWxlLCAKICAgICAgICAgICAgYnV0IGFuIGF1dG9jb25mIGFyY2hpdmUgbWFjcm8gZW5hYmxlcyB0aGlzLiBUaGlzIG1hY3JvIGFsb25nIHdpdGggZnV0dXJlIAogICAgICAgICAgICBhdXRvY29uZiBtYWNyb3MgYXJlIGdvaW5nIHRvIGJlIHB1dCBpbiB0aGUgVG9vbHMvY29uZmlnIGRpcmVjdG9yeS4KCiAgICAgICAgICAgICdzd2lnIC12ZXJzaW9uJyBub3cgcmVwb3J0cyB0aGUgdGFyZ2V0IGJ1aWxkIHBsYXRmb3JtLgoKMDUvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gRml4IHRvIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6CgogICAgICAgICAgICBqYXZhYmFzZSwgamF2YWludGVyZmFjZXMsIGphdmFpbXBvcnRzLCBqYXZhY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgamF2YWZpbmFsaXplLCBqYXZhZ2V0Y3B0ciAmIGphdmFjb2RlLgoKICAgICAgICAgICAgVGhlc2UgYXJlIHRoZSB0eXBlbWFwcyBmb3IgbW9kaWZ5aW5nL2dlbmVyYXRpbmcgcHJveHkgY2xhc3Nlcy4KICAgICAgICAgICAgUHJldmlvdXNseSB0aGUgdHlwZW1hcHMgd291bGQgdXNlIHRoZSBwcm94eSBjbGFzcyBuYW1lIGFuZCBub3QgdGhlIAogICAgICAgICAgICBDKysgdHlwZSwgd2hpY2ggd2FzIGluY29uc2lzdGVudCB3aXRoIGFsbCBvdGhlciB0eXBlbWFwcy4gCgogICAgICAgICAgICBJbiBtb3N0IGNpcmN1bXN0YW5jZXMgdGhlIHByb3h5IGNsYXNzIG5hbWUgYW5kIHRoZSBDKysgY2xhc3MgbmFtZS90eXBlIAogICAgICAgICAgICBpcyB0aGUgc2FtZSBleGNlcHQgZm9yIGNsYXNzZXMgaW4gbmFtZXNwYWNlLCB0ZW1wbGF0ZWQgY2xhc3NlcyBldGMuIHNvCiAgICAgICAgICAgIHRoaXMgc2hvdWxkbid0IGFmZmVjdCBtb3N0IGNhc2VzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgYW5kIEMjIE1PRFVMRVMgKioqCgowNS8wOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVmlzdWFsIEMrKyBQcm9qZWN0IGZpbGVzIGhhdmUgYmVlbiBhZGRlZCBzbyB0aGF0IHRoZSBydW50aW1lIGxpYnJhcmllcwogICAgICAgICAgICBjYW4gYmUgYnVpbHQgb24gV2luZG93cyAoZm9yIFRjbCwgUGVybCwgUHl0aG9uIGFuZCBSdWJ5KS4KCjA1LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHJldHVybiBieSB2YWx1ZSwgY29uc3QsIGFuZCBwcml2YXRlIGNvbnN0cnVjdG9ycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgQigpOwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgQihjb25zdCBCJik7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBjb25zdCBCIHJldHVybkIoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFByb2JsZW0gYW5kIHBhdGNoIHN1Z2dlc3Rpb24gcmVwb3J0ZWQgYnkgQmlsbCBIb2ZmbWFuLgoKMDQvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gU2luZ2xlIGF1dG9jb25mIGludm9jYXRpb24gLSBhdXRvY29uZiBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5IGhhcyBnb25lLgoKICAgICAgICAgICAgLSBMaWJ0b29sIGJvb3RzdHJhcHBlZCB3aGVuIHJ1bm5pbmcgYXV0b2dlbi5zaC4gVGhpcyByZXF1aXJlcyBhbnlvbmUKICAgICAgICAgICAgICB1c2luZyB0aGUgY3ZzIHZlcnNpb24gb2YgU1dJRyB0byBoYXZlIGxpYnRvb2wgaW5zdGFsbGVkIG9uIHRoZWlyCiAgICAgICAgICAgICAgbWFjaGluZS4gU3VnZ2VzdCB2ZXJzaW9uIDEuNC4yIG9yIGhpZ2hlciwgcHJlZmVyYWJseSB0aGUgbGF0ZXN0IC0gMS41LgoKICAgICAgICAgICAgLSBBdXRvbWFrZSBpcyBub3cgdXNlZCB0byBidWlsZCB0aGUgcnVudGltZSBsaWJyYXJpZXMgaW4gY29uanVuY3Rpb24gCiAgICAgICAgICAgICAgd2l0aCBsaWJ0b29sLgoKICAgICAgICAgICAgLSBSdW50aW1lIGxpYnJhcmllcyBhcmUgbm93IHN1Y2Nlc3NmdWxseSBidWlsdCBhcyBETExzIG9uIEN5Z3dpbi4KCiAgICAgICAgICAgIC0gU2tpcHBpbmcgbGFuZ3VhZ2VzIGlzIG5vIGxvbmdlciBqdXN0IGRldGVybWluZWQgaW4gdGhlIHRvcCBsZXZlbCAKICAgICAgICAgICAgICBtYWtlZmlsZSBidXQgaW4gY29uZmlndXJlLmluLiBUaGlzIGluZm8gaXMgdXNlZCBmb3IgYnVpbGRpbmcKICAgICAgICAgICAgICB0aGUgcnVudGltZSBsaWJyYXJpZXMgYW5kIGZvciBydW5uaW5nIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZS4KCiAgICAgICAgICAgIC0gVGhlc2UgY2hhbmdlcyBoYXZlIGZpeGVkIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yeSBidWlsZHMsIHRoYXQgaXMKICAgICAgICAgICAgICBidWlsZGluZyBmcm9tIGRpcmVjdG9yaWVzIG90aGVyIHRoYW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkuIAogICAgICAgICAgICAgIEluc3RhbGxhdGlvbiBmcm9tIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIGFsc28gd29ya2luZy4gQW4gaW5pdGlhbAogICAgICAgICAgICAgIGNvbmZpZ3VyZSBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBpcyBubyBsb25nZXIgbmVlZGVkIGFzIGRlc2NyaWJlZAogICAgICAgICAgICAgIGluIDA0LzAyLzIwMDMgZW50cnkuIEEgJ21ha2UgZGlzdGNsZWFuJyB3aWxsIGJlIG5lZWRlZCBiZWZvcmUgYnVpbGRpbmcKICAgICAgICAgICAgICBpbiBhIGRpcmVjdG9yeSBvdGhlciB0aGFuIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGlmIHRoZSBhdXRvdG9vbHMgCiAgICAgICAgICAgICAgaGF2ZSBiZWVuIHJ1biBmcm9tIHRoaXMgdG9wIGxldmVsIGRpcmVjdG9yeSBhdCBzb21lIHBvaW50LCBidXQgCiAgICAgICAgICAgICAgYXV0b2NvbmYgd2lsbCB0ZWxsIHlvdSB0aGlzLiBOb3RlIHRoYXQgJ21ha2UgY2hlY2snIG9ubHkgd29ya3MgZnJvbSAKICAgICAgICAgICAgICB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBhdCB0aGUgbW9tZW50LgoKMDQvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDcyMzQ3MSBdIFdyYXBwZXJfcHJpbnQoKSBmYWlscyB3aXRoIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgoKMDQvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBNaW5vciByZWZpbmVtZW50IG9mIGNvbnN0IHN0YXRpYyBtZW1iZXIgdmFyaWFibGUgaGFuZGxpbmcgCiAgICAgICAgICAgIGRlc2NyaWJlZCBpbiBDSEFOR0VTIDA4LzExLzIwMDIuICAgUHJldmlvdXNseSwgU1dJRyBtZXJlbHkKICAgICAgICAgICAgY2hlY2tlZCB0byBzZWUgaWYgdGhlcmUgd2FzIGFuIGluaXRpYWxpemVyIGluIHRoZSBkZWNsYXJhdGlvbi4KICAgICAgICAgICAgTm93LCBTV0lHIGFkZGl0aW9uYWxseSBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgbWVtYmVyCiAgICAgICAgICAgIGlzIGNvbnN0LgoKMDQvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEga2luZCBvZiBsaW1pdGVkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLAogICAgICAgICAgICBhY3RpdmF0ZWQgdXNpbmcgdGhlIC1taW5oZXJpdCBjb21tYW5kLWxpbmUgb3B0aW9uLiBJJ3ZlIGFsc28gdXBkYXRlZAogICAgICAgICAgICB0aGUgIkMrKyBJbmhlcml0YW5jZSIgc2VjdGlvbiBvZiB0aGUgUnVieSBkb2N1bWVudGF0aW9uIHRvIGRpc2N1c3MKICAgICAgICAgICAgaG93IHRoaXMgd29ya3MsIGFuZCBpdHMgbGltaXRhdGlvbnMuIEFsc28gYWxzbyBtb2RpZmllZCB0aGUgbWluaGVyaXQuaQogICAgICAgICAgICB0ZXN0IGNhc2UgdG8gcnVuIGFnYWluc3QgdGhpcy4KCjA0LzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgLWdsb2JhbG1vZHVsZSBjb21tYW5kLWxpbmUgb3B0aW9uIGZvciB0aGUgUnVieQogICAgICAgICAgICBtb2R1bGUsIGZvciB3cmFwcGluZyBzdHVmZiBpbnRvIHRoZSBnbG9iYWwgbW9kdWxlIChLZXJuZWwpIGluc3RlYWQKICAgICAgICAgICAgb2YgYSBuZXN0ZWQgbW9kdWxlLiBVcGRhdGVkIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuCgowNC8yMy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBzeW1uYW1lIGVycm9yIGluIGRpcmVjdG9yIGNhbGxzIHRvIFB5dGhvbiBtZXRob2RzCgkgICAgdGhhdCBleHRlbmQgQysrIG9wZXJhdG9ycy4KCgkgICAgU3RvcHBlZCBkaXJlY3RvciBkZXN0cnVjdG9yIHdyYXBwZXJzIGZyb20gY2FsbGluZyBfX3NldF91cCwKCSAgICB3aGljaCB3YXMgbGVhdmluZyB0aGUgZGlyZWN0b3IgZmxhZyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuCgowNC8yMy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBuYW1lc3BhY2UgcmVzb2x1dGlvbiBhbmQgbmVzdGVkIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFsZnJlZCBMb3JiZXIgKGFuZCBNYXJjZWxvIE1hdHVzKS4KCjA0LzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBQYXRjaCBmb3IgSmF2YSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSB0byBydW4gb24gTWFjIE9TIFguCgowNC8xNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gSW5jb3Jwb3JhdGVkIE5vYnUgTmFrYWRhJ3MgcGF0Y2hlcyBmb3Igc3VwcG9ydGluZyB0aGUgUnVieQogICAgICAgICAgICAxLjggYWxsb2NhdGlvbiBmcmFtZXdvcmsuCgowNC8xNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gUmVwbGFjZWQgYWxsIHVzZXMgb2YgdGhlIGRlcHJlY2F0ZWQgU1RSMkNTVFIoKSBtYWNybyB3aXRoIHRoZQogICAgICAgICAgICBzYWZlciBTdHJpbmdWYWx1ZVB0cigpIG1hY3JvLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHJ1YnktdGFsazo2NzA1OQogICAgICAgICAgICBhbmQgZm9sbG93LXVwcyB0byB0aGF0IHBvc3QuCgowNC8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBwcmVwcm9jZXNzb3IgbWFjcm8gZXhwYW5zaW9uLiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgICNkZWZpbmUgbWluKHgseSkgKCh4KSA8ICh5KSkgPyAoeCkgOiAoeSkgCiAgICAgICAgICAgICAgICBpbnQgZihpbnQgbWluKTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNlYmFzdGllbiBSZWNpby4KCjA0LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgYSBydW50aW1lIGNoZWNrIHRvIHR5cGVtYXBzIGluIGFycmF5c19qYXZhLmkgbGlicmFyeSB0byBjaGVjayAKICAgICAgICAgICAgdGhhdCB0aGUgSmF2YSBhcnJheSBwYXNzZWQgaW4gaXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgQyBhcnJheSBhbmQgdGhyb3cgYW4gCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpZiBub3QuCgogICAgICAgICAgICBBbHNvIGZpeCB0byB1c2UgZGVsZXRlIGluc3RlYWQgb2YgZnJlZSBmb3IgYXJyYXlzIGNyZWF0ZWQgdXNpbmcgbmV3LgoKMDQvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFJlbW92ZSBHQ0MzIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlOgoKICAgICAgICAgICAgICBjYzFwbHVzOiB3YXJuaW5nOiBjaGFuZ2luZyBzZWFyY2ggb3JkZXIgZm9yIHN5c3RlbSBkaXJlY3RvcnkgIi91c3IvaW5jbHVkZSIKICAgICAgICAgICAgICBjYzFwbHVzOiB3YXJuaW5nOiBhcyBpdCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCBhcyBhIG5vbi1zeXN0ZW0gZGlyZWN0b3J5IAoKICAgICAgICAgICAgU2VlIFNGIHBhdGNoICM3MTU1MzEgc3VibWl0dGVkIGJ5IEdlcmFsZCBXaWxsaWFtcwoKMDQvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW1wcm92ZWQgd3JhcHBpbmcgb2YgZW51bXMgYW5kIGNvbnN0YW50cy4gVGhlc2Ugd2VyZSBwcmV2aW91c2x5CiAgICAgICAgICAgIHdyYXBwZWQgYXMgQyMgdmFyaWFibGVzIHJhdGhlciB0aGFuIGNvbnN0YW50cy4gRWl0aGVyIHRoZXNlIGFyZSB3cmFwcGVkCiAgICAgICAgICAgIGFzIHJlYWRvbmx5IChydW50aW1lKSBjb25zdGFudHMgb3IgY29tcGlsZSB0aW1lIGNvbnN0YW50cywgZGVwZW5kaW5nIG9uCiAgICAgICAgICAgIHRoZSAlamF2YWNvbnN0IGRpcmVjdGl2ZSAoVGhlIGRpcmVjdGl2ZSBpcyBsaWtlbHkgdG8gY2hhbmdlIG5hbWUgc29vbikuCiAgICAgICAgICAgIEZvciBleGFtcGxlIHdyYXBwaW5nOgogICAgICAgICAgICAgICVqYXZhY29uc3QoMCk7CiAgICAgICAgICAgICAgI2RlZmluZSBBQkMgMjIKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIFhZWjsKICAgICAgICAgICAgICAjZGVmaW5lIFhZWiAzMwogICAgICAgICAgICBpcyBub3c6CiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpbnQgQUJDID0gZXhhbXBsZVBJTlZPS0UuZ2V0X0FCQygpOwogICAgICAgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgWFlaID0gMzM7CgowNC8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEdsb2JhbCBjb25zdGFudHMgYW5kIGVudW1zIGFyZSBwdXQgaW4gdGhlaXIgb3duIGludGVyZmFjZSBjYWxsZWQKICAgICAgICAgICAgeHh4Q29uc3RhbnRzLCB3aGVyZSB4eHggaXMgdGhlIG1vZHVsZSBuYW1lLiBUaGlzIGlzIGFuIGltcHJvdmVtZW50IGFzIAogICAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byBkZXJpdmUgKGltcGxlbWVudCkgYSBKYXZhIGNsYXNzIGZyb20gdGhlIHh4eENvbnN0YW50cwogICAgICAgICAgICBpbnRlcmZhY2UgdG8gaW1wcm92ZSB0aGUgc3ludGF4OyBuYW1lbHkgd2hlbiB3cmFwcGluZzoKICAgICAgICAgICAgICBlbnVtIHtPTkU9MSwgVFdPLCBUSFJFRX07CiAgICAgICAgICAgIGFjY2Vzc2luZyB0aGVzZSBmcm9tIGEgSmF2YSBjbGFzcyBpbXBsZW1lbnRpbmcgeHh4Q29uc3RhbnRzIGlzIG5lYXRlcjoKICAgICAgICAgICAgICBpbnQgbnVtYmVyID0gT05FOwogICAgICAgICAgICB0aGFuIHRoZSBwcmV2aW91czoKICAgICAgICAgICAgICBpbnQgbnVtYmVyID0geHh4Lk9ORTsKCiAgICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBEYXZlIERyaWJpbi4KCjA0LzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCBpbXByb3ZlbWVudHMgZm9yIG11bHRpcGxlIGJ1aWxkcy4gVGhpcyBhbGxvd3Mgb25lIHRvIGJ1aWxkCiAgICAgICAgICAgIHRoZSBTV0lHIGV4ZWN1dGFibGUgYW5kIHJ1bnRpbWUgbGlicmFyaWVzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zL2NvbXBpbGVycyAKICAgICAgICAgICAgZXRjIGJ5IHJ1bm5pbmcgY29uZmlndXJlIGluIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4gVGhpcyBpc24ndCAxMDAlIGp1c3QgCiAgICAgICAgICAgIHlldCBhbmQgd29uJ3QgYmUgdW50aWwgbGlidG9vbCBpcyBiZXR0ZXIgY29uZmlndXJlZC4uLiBhICdjb25maWd1cmUnIGFuZCAKICAgICAgICAgICAgJ21ha2UgZGlzdGNsZWFuJyBuZWVkcyB0byBiZSBydW4gaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGJlZm9yZSBpdCBhbGwgd29ya3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogICAgICAgICAgICAgICQgLi9jb25maWd1cmUKICAgICAgICAgICAgICAkIG1ha2UgZGlzdGNsZWFuCiAgICAgICAgICAgICAgJCBta2RpciBjb25maWcxOyBjZCBjb25maWcxOyAuLi9jb25maWd1cmUgQ0M9Z2NjIENYWD1nKys7IG1ha2U7IGNkIC4uCiAgICAgICAgICAgICAgJCBta2RpciBjb25maWcyOyBjZCBjb25maWcyOyAuLi9jb25maWd1cmUgQ0M9Y2MgQ1hYPWMrKzsgbWFrZTsgY2QgLi4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRvIGJlIGltcHJvdmVkLiBBICdtYWtlIGNoZWNrJyBkb2VzIG5vdCB3b3JrIHlldCBlaXRoZXIuIAoKMDQvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50IGV4cGFuc2lvbiBidWcuCiAgICAgICAgICAgIFRoaXMgc2hvd2VkIHVwIHdoZW4gdHJ5aW5nIHRvIHVzZSBzdGRfdmVjdG9yLmkgd2l0aCB2ZWN0b3JzCiAgICAgICAgICAgIG9mIHBvaW50ZXJzLgoKMDMvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBmb3IgcGFyYWxsZWwgbWFrZSBidWlsZHMgb2YgU1dJRywgZm9yIGV4YW1wbGUKICAgICAgICAgICAgICBtYWtlIC1qIDQKICAgICAgICAgICAgQnVpbGQgZmFpbHVyZSByZXBvcnRlZCBieSBCaWxsIENsYXJrZS4KCjAzLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUmVsZWFzZWQgMS4zLjE5LgoKCgpWZXJzaW9uIDEuMy4xOSAoTWFyY2ggMjgsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAzLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgVmFyaWV0eSBvZiBtaW5vciBidWcgZml4ZXMgdG8gdGhlIDEuMy4xOCByZWxlYXNlIGluY2x1ZGluZzoKCiAgICAgICAgICAgICAgICAtIFNlZ21lbnRhdGlvbiBmYXVsdCB3aXRoICVleHRlbmQgZGlyZWN0aXZlLgogICAgICAgICAgICAgICAgLSBUeXBlbWFwIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBidWcuCiAgICAgICAgICAgICAgICAtIEV4cHJlc3Npb24gZXZhbHVhdGlvbiBidWcuCiAgICAgICAgICAgICAgICAtIExhcmdlIG1lbW9yeSBsZWFrIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uLgoKVmVyc2lvbiAxLjMuMTggKE1hcmNoIDIzLCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMy8yMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHR3byBwcm9ibGVtcyB3aXRoIHRoZSAlZXh0ZW5kIGRpcmVjdGl2ZSwgb3ZlcmxvYWRpbmcsIGFuZAogICAgICAgICAgICB0ZW1wbGF0ZSBleHBhbnNpb24uICBTZWUgdGhlICd0ZW1wbGF0ZV9leHRlbmRfb3ZlcmxvYWQnIGFuZAogICAgICAgICAgICAndGVtcGxhdGVfZXh0ZW5kX292ZXJsb2FkXzInIHRlc3RzIGluIEV4YW1wbGVzL3Rlc3Qtc3VpdGUgZm9yCiAgICAgICAgICAgIGRldGFpbHMuCgowMy8yMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBBZGRlZCBzb21lIHR5cGVtYXBzIGFzIHN1Z2dlc3RlZCBieSBBbmRyZWFzIFNjaG9lcmsgZm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIGFzIHBvaW50ZXJzIG9yIGJ5IHJlZmVyZW5jZS4gVGhlc2UgaGF2ZQogICAgICAgICAgICBiZWVuIHB1dCBpbiB0eXBlbWFwcy5pLgoKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIEMrKyBzY29waW5nIGJ1ZyByZWxhdGVkIHRvIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBGb286OmJhcigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFByZXZpb3VzbHksIFNXSUcganVzdCB0b3NzZWQgb3V0IHRoZSBGb286OmJhcigpIGRlY2xhcmF0aW9uLiBOb3csCiAgICAgICAgICAgIHRoZSBkZWNsYXJhdGlvbiBpcyB3cmFwcGVkIHByb3ZpZGVkIHRoYXQgdGhlIHByZWZpeCBpcyBleGFjdGx5IHRoZQogICAgICAgICAgICBzYW1lIGFzIHRoZSBjdXJyZW50IHNjb3BlIChpbmNsdWRpbmcgYW55IGVuY2xvc2luZyBuYW1lc3BhY2VzKS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJ1Y2UgTG93ZXJ5LgoKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgWyA2OTY1MTYgXSBFbmFibGluZyBleGNlcHRpb24gcHJvY2Vzc2luZyBmb3IgZGF0YSBtZW1iZXIgYWNjZXNzLgogICAgICAgICAgICBJbiBzb21lIGNvbXBpbGVycywgYXR0cmlidXRlIGFjY2VzcyBjYW4gZ2VuZXJhdGUgZXhjZXB0aW9ucy4gIEhvd2V2ZXIsCiAgICAgICAgICAgIFNXSUcgb3JkaW5hcmlseSBhc3N1bWVzIHRoYXQgbm8gZXhjZXB0aW9ucyB3aWxsIGJlIHJhaXNlZC4gIFRvIGRpc2FibGUgdGhpcywKICAgICAgICAgICAgdXNlIHRoZSAlZmVhdHVyZSgiYWxsb3dleGNlcHQiKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoImFsbG93ZXhjZXB0IikgRm9vOjp4OwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgaW50IHg7ICAgICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgZW5hYmxlZCAqLwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBZYWtvdiBNYXJrb3ZpdGNoLiAKIAowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBQYXRjaC4gWyA3MDE4NjAgXSBJbXByb3ZlIFBlcmZvcm1hbmNlIChweXRob24gcHJveGllcykuCiAgICAgICAgICAgIEdpdmVzIGEgcGVyZm9ybWFuY2UgYm9vc3QgdG8gcHJveHkgY2xhc3MgY29kZSBhbmQgdGhlIG1hbmFnZW1lbnQgb2YgdGhlCiAgICAgICAgICAgIC50aGlzIGFuZCAudGhpc293biBhdHRyaWJ1dGVzLiAgQ29udHJpYnV0ZWQgYnkgTWlrZSBSb21iZXJnLgoKMDMvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gQWRkZWQgbWlzc2luZyB2YXJhcmcgc3VwcG9ydC4KCjAzLzE4LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFJlbW92ZWQgY29kZSByZWxhdGVkIHRvIHRhZ2dpbmcgaW5kaXZpZHVhbCBtZXRob2RzIGZvciBkaXJlY3RvcnMuCgkgICAgVGhlIGNvbmNlcHQgb2YgaGF2aW5nIGRpcmVjdG9ycyBmb3Igc29tZSBidXQgbm90IGFsbCB2aXJ0dWFsIG1ldGhvZHMKCSAgICBvZiBhIGNsYXNzIGlzIGRlZXBseSBmbGF3ZWQuICBUaGUgJWZlYXR1cmUoIm5vZGlyZWN0b3IiKSB0YWcgaXMgYWxzbwoJICAgIGdvbmUuICAKCSAgICAKCSAgICBEaXJlY3RvcnMgYXJlIG9mZiBieSBkZWZhdWx0LiAgVG8gZW5hYmxlIHRoZW0gZm9yIGEgY2xhc3MsIGlzc3VlCgkgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgY2xhc3NuYW1lOyB3aGljaCB3aWxsIGNyZWF0ZSBkaXJlY3RvciBtZXRob2RzCgkgICAgZm9yIGV2ZXJ5IHZpcnR1YWwgbWV0aG9kIGluIHRoZSBoaWVyYXJjaHkgb2YgdGhlIGNsYXNzLgoKMDMvMTcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggcGFzc2luZyBhcmd1bWVudHMgb2YgdHlwZSBmdW5jdGlvbi4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQgeChpbnQsIGludCkpOwoKICAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IGJpbm9wX3QoaW50LCBpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGJpbm9wX3QgeCk7CgogICAgICAgICAgICBJbiBvbGQgdmVyc2lvbnMsIHRoaXMgd291bGQgcHJvZHVjZSBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZS4gIE5vdywKICAgICAgICAgICAgU1dJRyBtZXJlbHkgYWRkcyBhbiBleHRyYSBwb2ludGVyLCBtYWtpbmcgdGhlc2UgZGVjbGFyYXRpb25zIHRoZSBzYW1lCiAgICAgICAgICAgIGFzOgoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQgKCp4KShpbnQsIGludCkpOwoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgYmlub3BfdChpbnQsIGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oYmlub3BfdCAqeCk7CgogICAgICAgICAgICBSZXBvcnRlZCBieSBHYXJ0aCBCdXNoZWxsLgoKMDMvMTcvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgdGhlIHJldHVybiBzdGF0ZW1lbnQgZm9yIGRpcmVjdG9yIGJhc2UgY2xhc3MgY2FsbHMgdGhhdCBoYXZlIG5vCiAgICAgICAgICAgIHJldHVybiB2YWx1ZS4KCjAzLzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggY29uc3Qgc21hcnQtcG9pbnRlciB3cmFwcGluZy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcigpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbSgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgY29uc3QgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIG9ubHkgIngiIGFuZCAiYmFyIiBhcmUgdmlzaWJsZSBmcm9tIEJsYWggKHNpbmNlIGFwcGxpY2F0aW9uCiAgICAgICAgICAgIG9mIHNwYW0gdmlvbGF0ZXMgY29uc3RuZXNzKS4gIE1vcmVvdmVyLCBhY2Nlc3MgdG8gIngiIGlzIHJlYWQtb25seS4KICAgICAgICAgICAKMDMvMTUvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQ2xlYW5lZCB1cCB0d28gc2lnbmVkIHZlcnN1cyB1bnNpZ25lZCBjb21wYXJpc29ucyBpbiBweXRob24vc3RkX3ZlY3Rvci5pLgoJICAgIAowMy8xNS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBHbG9iYWwgdmFyaWFibGVzIGFyZSB3cmFwcGVkIHVzaW5nIHByb3BlcnRpZXMgaW5zdGVhZCBvZiBnZXQgYW5kIHNldCBtZXRob2RzLgogICAgICAgICAgICBNZW1iZXIgdmFyaWFibGUgd3JhcHBpbmcgYnVnIGZpeGVzLCBmb3IgZXhhbXBsZSB3cmFwcGluZyBwb2ludGVycyB3b3JrIG5vdy4KICAgICAgICAgICAgVHlwZW1hcHMgYXJlIHVzZWQgZm9yIGFsbCB2YXJpYWJsZSB3cmFwcGluZyB0byBnZW5lcmF0ZSB0aGUgcHJvcGVydHkgY29kZS4KCjAzLzEzLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIGEgYnVnIGluIHRoZSB2aXJ0dWFsIG1ldGhvZCB1bnJvbGxpbmcgZm9yIGRpcmVjdG9ycy4gCgkgICAgVGhlIG9yZGVyIG9mIHVucm9sbGluZyBpcyBub3cgZnJvbSBiYXNlIHRvIGRlcml2ZWQsIHRvIGVuc3VyZQoJICAgIHRoYXQgdGhlIG1vc3QgZGVyaXZlZCBpbXBsZW1lbnRhdGlvbiBvZiBhIGRpcmVjdG9yIG1ldGhvZCBpcwoJICAgIGZvdW5kLgoKCSAgICBEaXJlY3RvciBtZXRob2RzIGZvciBwdXJlIHZpcnR1YWwgbWV0aG9kcyBub3cgdGhyb3cKCSAgICBESVJFQ1RPUl9QVVJFX1ZJUlRVQUxfRVhDRVBUSU9OIGlmIF91cCBpcyBzZXQuCgowMy8xMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBQb2x5bW9ycGhpc20gZml4OiB2aXJ0dWFsIGZ1bmN0aW9ucyBub3cgdXNlIHRoZSBhcHByb3ByaWF0ZQogICAgICAgICAgICBrZXl3b3JkIGluIHRoZSBDIyBwcm94eSBjbGFzcywgdmlydHVhbCBvciBvdmVycmlkZS4KICAgICAgICAgICAgU29tZSAndXNpbmcgU3lzdGVtOycgc3RhdGVtZW50IGZpeGVzIG5lZWRlZCBieSB0aGUgTW9ubyBjb21waWxlci4KCjAzLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIGJ1ZyBpbiB0aGUgYXBwbGljYXRpb24gb2YgU3dpZ1ZhbHVlV3JhcHBlcjw+IHRvCiAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzZXMgd2l0aCBkZWZhdWx0IGNvbnN0cnVjdG9ycy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJydWNlIExvd2VyeS4KCjAzLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICRkZXNjcmlwdG9yKHR5cGUpIHZhcmlhYmxlIGlzIG5vdyBleHBhbmRlZCBpbiBjb2RlIHN1cHBsaWVkIHRvCiAgICAgICAgICAgICVleHRlbmQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2VydGFpbiBraW5kcyBvZiBhZHZhbmNlZCB3cmFwcGluZyAKICAgICAgICAgICAgKGVzcGVjaWFsbHkgY29udGFpbmVyIGNsYXNzZXMpLgoKMDMvMTEvMjAwMzogbHVpZ2kKICAgICAgICAgICAgU3VwcG9ydCBmb3Igc3RkOjptYXAuCiAgICAgICAgICAgIChhKSBJbnRlZ3JhdGlvbiB3aXRoIHNjcmlwdGluZyBsYW5ndWFnZSAoYSBsYSBzdGQ6OnZlY3RvcikgZm9yCiAgICAgICAgICAgICAgICBQeXRob24sIFJ1YnksIE16U2NoZW1lLCBhbmQgR3VpbGU7CiAgICAgICAgICAgIChiKSBTaW1wbGUgd3JhcHBlciBmb3Igb3RoZXIgbGFuZ3VhZ2VzCgowMy8xMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBlc2NhcGUgc2VxdWVuY2VzIGluIHN0cmluZyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gIFNXSUcKICAgICAgICAgICAgd2Fzbid0IHBhcnNpbmcgY2VydGFpbiBvY3RhbCBjb2RlcyBjb3JyZWN0bHkuCgowMy8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgdmFyaWV0eSBvZiBzdWJ0bGUgcHJlcHJvY2Vzc29yIHByb2JsZW1zIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFNlYmFzdGllbiBSZWNpby4KCiAgICAgICAgICAgIChhKSBFbXB0eSBwcmVwcm9jZXNzb3IgdmFsdWVzIG5vIGxvbmdlciBnZW5lcmF0ZSAiYmFkIGNvbnN0YW50CiAgICAgICAgICAgIHZhbHVlIiBlcnJvcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PIEJBUgoKICAgICAgICAgICAgKGIpIE1hY3JvIG5hbWVzIGNhbiBub3cgc3BhbiBtdWx0aXBsZSBsaW5lcyAodGVjaG5pY2FsbHkgdmFsaWQsCiAgICAgICAgICAgIGFsdGhvdWdoIHF1ZXN0aW9uYWJsZSBwcmFjdGljZSkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgQV9MT05HX01BQ1JPX1wKICAgICAgICAgICAgICAgICAgTkFNRSA0MgoKICAgICAgICAgICAgKGMpIFdoaXRlc3BhY2UgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGJlZm9yZSBjZXJ0YWluIG1hY3JvIHZhbHVlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyJIZWxsbyIKICAgICAgICAgICAgICAgICAgI2RlZmluZSBCQVJcCiAgICAgICAgICAgICAgICAgICJIZWxsbyIKIAowMy8wNy8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbWlzc2luZyBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlbWFwcwogICAgICAgICAgICBpbiB0aGUgTGliL3J1YnkvdHlwZW1hcHMuaSBsaWJyYXJ5IGZpbGUuCgowMy8wNy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9weXRob24vY2FsbGJhY2sgdG8gZGVtb3N0cmF0ZSBob3cgZGlyZWN0b3JzIGNhbgoJICAgIGJlIHVzZWQgdG8gaW1wbGVtZW50IGNhbGxiYWNrcyBpbiBQeXRob24KCSAgICBBZGRlZCBFeGFtcGxlcy9weXRob24vZXh0ZW5kIHRvIGRlbW9uc3RyYXRlIHZpcnR1YWwgbWV0aG9kCgkgICAgY2FsbHMgZnJvbSBDKysgdG8gUHl0aG9uIChyZWFsbHkgdGhlIHNhbWUgYXMgdGhlIGNhbGxiYWNrCgkgICAgZXhhbXBsZSwganVzdCBhIGRpZmZlcmVudCBjb250ZXh0KS4KCSAgICBBZGRlZCBmb3VyIHRlc3RzIGZvciB2ZXJ5IGJhc2ljIGRpcmVjdG9yIGZ1bmN0aW9uYWxpdHkuICBUaGVzZQoJICAgIGhhdmUgcnVudGltZSB0ZXN0cyB1bmRlciBweXRob24uCgkgICAgVGhlIFB5dGhvbiBtb2R1bGUgbm93IGVtaXRzICNkZWZpbmUgU1dJR19ESVJFQ1RPUlMgbmVhciB0aGUKCSAgICB0b3Agb2YgdGhlIG91dHB1dCBmaWxlIGlmIGRpcmVjdG9ycyBhcmUgZW5hYmxlZC4gIFRoaXMgaXMgdXNlZnVsCgkgICAgZm9yIGRpc2FibGluZyBwYXJ0cyBvZiB0ZXN0cyBpbiB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgZG9uJ3QKCSAgICBzdXBwb3J0IGRpcmVjdG9ycy4KCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIGEgc2VjdGlvbiB0byBEb2MvTWFudWFsL1B5dGhvbi5odG1sIG9uIGNyb3NzIGxhbmd1YWdlCgkgICAgcG9seW1vcnBoaXNtIChkaXJlY3RvcnMpLgoKMDMvMDYvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgVGhlIHNob3J0LWxpdmVkICItZmRpcmVjdG9ycyIgY29tbWFuZCBsaW5lIG9wdGlvbiBoYXMgYmVlbgoJICAgIHJlbW92ZWQuICBUbyBlbmFibGUgZGlyZWN0b3JzLCBpbnN0ZWFkIHVzZSB0aGUgZXh0ZW5kZWQgJW1vZHVsZSAKCSAgICBkaXJlY3RpdmUgYXMgZm9sbG93czoKCgkgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIikgbW9kdWxlbmFtZQoKMDMvMDYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRoZSBsb25nIGxvbmcgdHlwZW1hcHMgaGF2ZSBiZWVuIHJld3JpdHRlbiBzbyB0aGF0IHRoZXkgY2FuIGJlIG1vcmUKICAgICAgICAgICAgZWFzaWx5IHVzZWQgd2l0aCBub24gSVNPIGNvbXBpbGVycywgbGlrZSBWaXN1YWwgQysrLiBGb3IgZXhhbXBsZQogICAgICAgICAgICBpZiB5b3UgYXJlIHdyYXBwaW5nIHRoZSBXaW5kb3dzIDY0IGJpdCB0eXBlIF9faW50NjQgdGhlIGxvbmcgbG9uZwogICAgICAgICAgICB0eXBlbWFwcyBjYW4gYmUgdXNlZCB3aXRoICVhcHBseToKCiAgICAgICAgICAgICAgICAlYXBwbHkgbG9uZyBsb25nIHsgX19pbnQ2NCB9OwogICAgICAgICAgICAgICAgX19pbnQ2NCB2YWx1ZTEoX19pbnQ2NCB4KTsKCiAgICAgICAgICAgIF9faW50NjQgd2lsbCBub3cgYXBwZWFyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBpbnN0ZWFkIG9mIGxvbmcgbG9uZy4KICAgICAgICAgICAgCjAzLzA2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgKioqIERFVkVMT1BFUiBDSEFOR0UgKioqCiAgICAgICAgICAgIFN3aWcgbW9kdWxlIG11dGF0aW9uIGhhcyBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkuICBXaGVuIGEgbGFuZ3VhZ2UKICAgICAgICAgICAgY2xhc3MgbWV0aG9kIHdhbnRzIHRvIHNhdmUgbm9kZSBhdHRyaWJ1dGVzLCBpdCBub3cgdXNlcyBvbmUgb2YgdGhlCiAgICAgICAgICAgIGZvbGxvd2luZyBmdW5jdGlvbnM6CgogICAgICAgICAgICAgICAgICBTd2lnX3JlcXVpcmUoKQogICAgICAgICAgICAgICAgICBTd2lnX3NhdmUoKQoKICAgICAgICAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZXNlIGZ1bmN0aW9ucyBpcyBhIG5hbWVzcGFjZSBpbiB3aGljaAogICAgICAgICAgICBzYXZlZCBhdHRyaWJ1dGVzIGFyZSBwbGFjZWQuICBGb3IgZXhhbXBsZSx0aGlzIGNvZGUKCiAgICAgICAgICAgICAgICAgIE5vZGUgKm47CiAgICAgICAgICAgICAgICAgIFN3aWdfc2F2ZSgiY0RlY2xhcmF0aW9uIixuLCJ0eXBlIiwicGFybXMiLCJuYW1lIixOSUwpOwoKICAgICAgICAgICAgc2F2ZXMgdGhlIGF0dHJpYnV0ZXMgYXMgImNEZWNsYXJhdGlvbjp0eXBlIiwgImNEZWNsYXJhdGlvbjpwYXJtcyIsCiAgICAgICAgICAgIGFuZCBzbyBmb3J0aC4gICBJZiBuZWNlc3NhcnksIGEgbGFuZ3VhZ2UgbW9kdWxlIGNhbiByZWZlciB0bwogICAgICAgICAgICBvbGQgdmFsdWVzIGJ5IHVzaW5nIHRoaXMgc3BlY2lhbCBuYW1lc3BhY2UgcXVhbGlmaWVyLgoKICAgICAgICAgICAgSW4gYWRkaXRpb24gdG8gdGhpcywgYSBzcGVjaWFsIGF0dHJpYnV0ZSAidmlldyIgY29udGFpbnMgdGhlIG5hbWUKICAgICAgICAgICAgb2YgdGhlIGxhc3QgbmFtZXNwYWNlIHVzZWQgdG8gc2F2ZSBhdHRyaWJ1dGVzLiAgSW4gdGhlIGFib3ZlIAogICAgICAgICAgICBleGFtcGxlLCAidmlldyIgd291bGQgaGF2ZSB0aGUgdmFsdWUgImNEZWNsYXJhdGlvbiIuICAgVGhlIHZhbHVlCiAgICAgICAgICAgIG9mICJjRGVjbGFyYXRpb246dmlldyIgd291bGQgaGF2ZSB0aGUgcHJldmlvdXMgdmlldyBhbmQgc28gZm9ydGguCgogICAgICAgICAgICBTd2lnX3Jlc3RvcmUobikgcmVzdG9yZXMgYSBub2RlIHRvIHRoZSBzdGF0ZSBiZWZvcmUgdGhlIGxhc3QKICAgICAgICAgICAgU3dpZ19yZXF1aXJlKCkgb3IgU3dpZ19zYXZlKCkgY2FsbC4KCiAgICAgICAgICAgIE5vdGU6ICBUaGlzIGNoYW5nZSBtYWtlcyBpdCBlYXNpZXIgZm9yIGxhbmd1YWdlIG1vZHVsZXMgdG8gcmVmZXIKICAgICAgICAgICAgdG8gb2xkIHZhbHVlcyBvZiBhdHRyaWJ1dGVzLiAgCgoKMDMvMDYvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgTWVyZ2VkIHRoZSBjcm9zcy1sYW5ndWFnZSBwb2x5bW9ycGhpc20gcGF0Y2guICBXaGVuIGVuYWJsZWQsIEMrKyAKCSAgICAicHJveHkiIGNsYXNzZXMgKGNhbGxlZCBkaXJlY3RvcnMpIGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggc3BlY2lmaWVkIAoJICAgIEMrKyBjbGFzcy4gIERpcmVjdG9ycyBwYXNzIG1ldGhvZCBjYWxscyBmcm9tIEMrKyB0byBQeXRob24sIHNpbWlsYXIgCgkgICAgdG8gdGhlIHdheSB0aGUgdXN1YWwgcHJveHkgKHNoYWRvdykgY2xhc3NlcyBwYXNzIG1ldGhvZCBjYWxscyBmcm9tIAoJICAgIFB5dGhvbiB0byBDKysuICBUb2dldGhlciwgdGhlc2UgdHdvIHR5cGVzIG9mIHByb3hpZXMgYWxsb3cgQysrIAoJICAgIGNsYXNzZXMgdGhhdCBhcmUgZXh0ZW5kZWQgaW4gUHl0aG9uIHRvIGJlaGF2ZSBqdXN0IGxpa2Ugb3JkaW5hcnkgCgkgICAgQysrIGNsYXNzZXMgYW5kIGJlIHVzZWQgaW4gQysrIGxpa2UgbmF0aXZlIG9iamVjdHMuICAKCSAgICAKCSAgICBUaGlzIGZlYXR1cmUgaXMgc3RpbGwgdmVyeSBleHBlcmltZW50YWwgYW5kIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCgkgICAgVG8gZW5hYmxlIGRpcmVjdG9yIHN1cHBvcnQsIHNwZWNpZnkgJy1mZGlyZWN0b3JzJyBvbiB0aGUgU1dJRyBjb21tYW5kCgkgICAgbGluZSBvciBpbiB0aGUgU1dJR19GRUFUVVJFUyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEluIHRoZSBpbnRlcmZhY2UKCSAgICBmaWxlLCBhZGQgJWZlYXR1cmUoImRpcmVjdG9yIikgdG8gZ2VuZXJhdGUgZGlyZWN0b3JzIGZvciBhbGwgY2xhc3NlcwoJICAgIHRoYXQgaGF2ZSB2aXJ0dWFsIG1ldGhvZHMuICAKCSAgICAKCSAgICBTZWUgaHR0cDovL3N0bS5sYmwuZ292L350bTIvc3dpZy9Qcm94eURvYy5odG1sIGZvciBtb3JlIGRldGFpbHMuCgkgICAgCgowMy8wMy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc21hbGwgZ2xpdGNoIGluIHR5cGVtYXAgbG9jYWwgdmFyaWFibGUgcmVwbGFjZW1lbnQuICBJZiB5b3UgaGFkCiAgICAgICAgICAgIGEgdHlwZW1hcCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB0eXBlICgkMV90eXBlIHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IC4uLjsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFuZCBubyBvY2N1cnJlbmNlIG9mICIkMV90eXBlIiBhcHBlYXJlZCBpbiB0aGUgYm9keSwgdGhlbiB0aGUgbG9jYWwKICAgICAgICAgICAgdmFyaWFibGUgdHlwZSB3b3VsZG4ndCBiZSBzdWJzdGl0dXRlZC4KCjAzLzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIE5ldyB2ZXJzaW9uIG9mIHRoZSBDU2hhcnAgbW9kdWxlIHdoaWNoIGlzIHR5cGVtYXAgYmFzZWQuCiAgICAgICAgICAgIEl0IGFsc28gdXNlcyBFQ01BIEMjIGFuZCBubyBsb25nZXIgdXNlcyBNaWNyb3NvZnQgVmlzdWFsIEMrKy5ORVQgCiAgICAgICAgICAgIGdsdWUuIFRoaXMgbWVhbnMgdGhhdCBpdCB3aWxsIHdvcmsgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBOZWlsIENhd3NlLgoKMDIvMjcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY1MzU0OCBdIGVycm9yIHBhcnNpbmcgY2FzdGluZyBvcGVyYXRvciBkZWZpbml0aW9uLgogICAgICAgICAgICBTV0lHIG5vdyBpZ25vcmVzIGNhc3Rpbmcgb3BlcmF0b3JzIGRlY2xhcmVkIG91dHNpZGUgb2YgYSBjbGFzcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgaW5saW5lIEE6Om9wZXJhdG9yIGNoYXIgKigpIHsgLi4uIH0KCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJ0aW4gQ2FzYWRvLgoKMDIvMjcvMjAwMzogYmVhemxleQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBhbm9ueW1vdXMgYml0LWZpZWxkcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgIGludCB4IDogNDsKICAgICAgICAgICAgICAgICAgICAgIGludCAgIDogNDsKICAgICAgICAgICAgICAgICAgICAgIGludCB5IDogODsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQW5vbnltb3VzIGJpdC1maWVsZHMgYXJlIGlnbm9yZWQgYnkgU1dJRy4gICBQcm9ibGVtCiAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEZyYW56IEj2cGZpbmdlci4KCjAyLzI2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQmV0dGVyIHR5cGVtYXBzIGluIHRoZSBFeGFtcGxlcy9qYXZhL3R5cGVtYXAgZXhhbXBsZSBhbmQgYWxzbyAKICAgICAgICAgICAgZml4ZXMgc3VidGxlIGJ1ZyB3aGVuIHVzaW5nIHRoZSBTdHJpbmdCdWZmZXIgdHlwZW1hcHMgbW9yZSB0aGFuIG9uY2UuCgowMi8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjQyMTEyIF0gQ29uc3RhbnRzIGNoYXIgYnVnLgoKMDIvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY3NTMzNyBdIFBhcnRpYWwgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gbm90IGVudGlyZWx5IHdvcmtpbmcuCiAgICAgICAgICAgIFRoZXJlIHdhcyBhIHN1YnRsZSBwcm9ibGVtIHJlbGF0ZWQgdG8gdGhlIG5hbWluZyBhbmQgb3JkZXJpbmcgb2YKICAgICAgICAgICAgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhcmd1bWVudHMuICBNYXRjaGluZyB3b3JrZWQgb2theSwKICAgICAgICAgICAgdGhlIHJlc3VsdGluZyB0ZW1wbGF0ZXMgd2VyZW4ndCBleHBhbmRlZCBjb3JyZWN0bHkuCgowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBwYXJzaW5nIChhbmQgZ2VuZXJhdGluZyBjb2RlKSBmb3IgCiAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gYXJyYXlzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgaW50IGZvbyhpbnQgKCZ4KVsxMF0pOwogIAowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjM1MzQ3IF0gQ29tcGlsYXRpb24gd2FybmluZyBmcm9tIGxpYnB5LmMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERhbmllbCBMLiBSYWxsLgogCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHZpcnR1YWwgbWV0aG9kIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIGNoZWNraW5nIGFuZCB0eXBlZGVmLgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAqaW50cHRyOwoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgKmZvbygpID0gMDsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50cHRyIGZvbygpIHsgfTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgdHJlYXRpbmcgdGhlc2UgZGVjbGFyYXRpb25zIGFzIGRpZmZlcmVudCBldmVuIHRob3VnaAogICAgICAgICAgICB0aGV5IGFyZSB0aGUgc2FtZSAodmlhIHR5cGVkZWYpLgoKMDIvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHJhbmdlIGNoZWNraW5nIGZvciB0aGUgTlVNMlVTSFJUIG1hY3JvLCBwZXIgWyA2NzUzNTMgXS4KCjAyLzI0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHRoZSBjb2RlIHRoYXQgZGV0ZXJtaW5lZCBpZiBhIGNsYXNzIGlzIGFic3RyYWN0CiAgICAgICAgICAgIGFuZCBjYW4gYmUgaW5zdGFudGlhdGVkLiAgICBJZiB5b3UgaGFkIGNsYXNzZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmb28oaW50KSA9IDA7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogdmlydHVhbCBBIHsKICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQyA6IHZpcnR1YWwgQSB7IAogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgLyogTm90ZSBvcmRlciBvZiBiYXNlIGNsYXNzZXMgKi8JCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBEIDogQiwgQyB7IH07ICAgIC8qIE9rICovCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBFIDogQywgQiB7IH07ICAgIC8qIEJyb2tlbiAqLwoKICAgICAgICAgICAgdGhlbiBTV0lHIGRldGVybWluZWQgdGhhdCBpdCBjb3VsZCBpbnN0YW50aWF0ZSBEKCksIGJ1dCBub3QgRSgpLgogICAgICAgICAgICBUaGlzIGluY29uc2lzdGVuY3kgYXJvc2UgZnJvbSB0aGUgZGVwdGgtZmlyc3Qgc2VhcmNoIG9mIHRoZSAKICAgICAgICAgICAgaW5oZXJpdGFuY2UgaGllcmFyY2h5IHRvIGxvY2F0ZSB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHZpcnR1YWwKICAgICAgICAgICAgbWV0aG9kcy4gICBUaGlzIHByb2JsZW0gc2hvdWxkIG5vdyBiZSBmaXhlZC0tLVNXSUcgd2lsbCBhdHRlbXB0CiAgICAgICAgICAgIHRvIGxvY2F0ZSBhbnkgdmFsaWQgaW1wbGVtZW50YXRpb24gb2YgYSB2aXJ0dWFsIG1ldGhvZCBieQogICAgICAgICAgICB0cmF2ZXJzaW5nIG92ZXIgdGhlIGVudGlyZSBoaWVyYXJjaHkuCgowMi8yMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdXNpbmcgZW51bSB0eXBlbWFwcy4gVGhlIEphdmEgZmluYWwgc3RhdGljIHZhcmlhYmxlIHR5cGUKICAgICAgICAgICAgY2FuIGJlIHNldCB1c2luZyB0aGUganN0eXBlIHR5cGVtYXAsIGVuYWJsaW5nIGVudW1zIHRvIGJlIG1hcHBlZCB0byAKICAgICAgICAgICAgc29tZXRoaW5nIG90aGVyIHRoYW4gaW50LiBCdWcgcmVwb3J0ZWQgYnkgSGVpbmVyIFBldGl0aC4KCjAyLzIxLzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgQ1NoYXJwIChDIykgbW9kdWxlIHByb3RvdHlwZQogICAgICAgICAgICBpLmUuIGNzaGFycC5jeHggJiBjc2hhcnAuaCBhdCBTb3VyY2UvTW9kdWxlcy8uCiAgICAgICAgICAgIFRoZXkgYXJlIGZvciB0ZXN0IHVzYWdlIG9ubHkgbm93IGFuZCBuZWVkIGltcHJvdmVtZW50LgogICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGFsc28gbmVlZCB0byBiZSBtb2RpZmllZC4KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAKMDIvMjAvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZWRlZiB3aXRoIC1mdmlydHVhbC4KICAgICAgICAgICAgU2ltaWxhciBhcyBiZWF6bGV5J3MgbW9kaWZpY2F0aW9uIHRvZGF5LgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBnY2Mtc3R5bGUgdmFyaWFkaWMgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gIAogICAgICAgICAgICBQYXRjaCBbIDYyMzI1OCBdIEdDQy1zdHlsZSB2YXJhcmcgbWFjcm8gc3VwcG9ydC4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgSm9lIE1hc29uLgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYwNTE2MiBdIFR5cGVtYXAgbG9jYWwgdmFyaWFibGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBMeWxlIEpvaG5zb24uCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBhYnN0cmFjdCBjbGFzc2VzIGFuZCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oaW50IHgpID0gMDsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oSW50ZWdlciB4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIGdldHRpbmcgY29uZnVzZWQgYWJvdXQgdGhlIGxhdHRlciBtZXRob2QtLS1tYWtpbmcgQmFyCiAgICAgICAgICAgIGFic3RyYWN0LiAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjAyLzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gJWphdmFjb25zdChmbGFnKSBjYW4gYWxzbyBiZSB1c2VkIG9uIGVudW1zIGFzIHdlbGwgYXMgY29uc3RhbnRzLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgZW5hYmxlcyB0cnVlIEphdmEgY29tcGlsZXIgY29uc3RhbnRzIHNvIHRoYXQgdGhleSBjYW4gYmUgCiAgICAgICAgICAgIHVzZWQgaW4gSmF2YSBzd2l0Y2ggc3RhdGVtZW50cy4gVGhhbmtzIHRvIEhlaW5lciBQZXRpdGggZm9yIHBhdGNoZXMuCgowMi8xOS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIE1vZGlmaWVkIC1mY29tcGFjdCBmZWF0dXJlIHRvIGRlYWwgd2l0aCBQUCBsaW5lcwoKMDIvMTgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY4OTA0MCBdIE1pc3NpbmcgcmV0dXJuIHZhbHVlIGluIHN0ZF92ZWN0b3IuaS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUm9iZXJ0IEguIGRlIFZyaWVzLgoKMDIvMTgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGZldyBldmlsIHNjb3BpbmcgcHJvYmxlbXMgd2l0aCB0ZW1wbGF0ZXMsIG5hbWVzcGFjZXMsIGFuZCB0aGUKICAgICAgICAgICAgJWV4dGVuZCBkaXJlY3RpdmUuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKCjAyLzE4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbUnVieV0gSW1wcm92ZWQgc3VwcG9ydCBmb3IgVmlzdWFsIEMrKyBhbmQgb3RoZXIgbmF0aXZlIFdpbmRvd3MgY29tcGlsZXJzLiAKICAgICAgICAgICAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBzcGVjaWZ5ICIvRVhQT1JUOkluaXRfPG1vZHVsZT4iLCB3aGVyZSA8bW9kdWxlPiBpcyB0aGUKICAgICAgICAgICAgc3dpZyBtb2R1bGUgbmFtZSB3aGVuIGxpbmtpbmcgdXNpbmcgdGhlc2UgbmF0aXZlIFdpbmRvd3MgY29tcGlsZXJzLgoKMDIvMTUvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCAtZnZpcnR1YWwgb3B0aW9uLgogICAgICAgICAgICBSZWR1Y2UgdGhlIGxpbmVzIGFuZCBzaXplIG9mIHRoZSB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgYnkgb21pdHRpbmcgcmVkaWZpbmVkIHZpcnR1YWwgZnVuY3Rpb24gaW4gY2hpbGRyZW4gY2xhc3Nlcy4KCiAgICAgICAgICAgIE1vZGlmaWVkIC1jb21wYWN0IG9wdGlvbiB0byAtZmNvbXBhY3Qgb3B0aW9uCgogICAgICAgICAgICBBZGRlZCAtc21hbGwgb3B0aW9uLgogICAgICAgICAgICAtc21hbGwgPSAtZnZpcnR1YWwgLWZjb21wYWN0CiAgICAgICAgICAgIEFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgZnV0dXJlIGZlYXR1cmUgb3B0aW9ucywKICAgICAgICAgICAgd2hpY2ggYXJlIHVzZWQgdG8gcmVkdWNlIHdyYXBwZXIgZmlsZSBzemllLgoKICAgICAgICAgICAgQWRkZWQgU1dJR19GRUFUVVJFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjaGVjay4KICAgICAgICAgICAgVG8gZHluYW1pY2FsbHkgc2V0IHRoZSBmZWF0dXJlIG9wdGlvbnMgc3VjaCBhcyAtZmNvbXBhY3QgJiAtZnZpcnR1YWwKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDIvMTMvMjAwMzogbGVuegogICAgICAgICAgICBVcGRhdGVkIERvYy9NYW51YWwvUGVybDUuaHRtbCB0byB0YWxrIGFib3V0IEMrKyBjb21waWxlIHByb2JsZW1zCiAgICAgICAgICAgIGNvbmZpZ3VyZS5pbiBub3cgY2hlY2tzIGZvciBQRVJMNV9DQ0ZMQUdTCiAgICAgICAgICAgIFJ1bnRpbWUvTWFrZWZpbGUuaW4gYW5kIEV4YW1wbGUvTWFrZWZpbGUuaW4gbm93IHVzZSBQRVJMNV9DQ0ZMQUdTCiAgICAgICAgICAgIEFkZGVkIExpYi9wZXJsNS9ub2VtYmVkLmggd2hpY2ggY29udGFpbnMgYWxsIHRoZSBrbm93biBtYWNybyBjb25mbGljdHMKCjAyLzEyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2ODU0MTAgXSBDKysgRXhwbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBjYXVzZXMgU1dJRyB0byBleGl0LgogICAgICAgICAgICBGaXhlcyBhIHN5bnRheCBlcnJvciB3aXRoIGRlY2xhcmF0aW9ucyBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICBTV0lHIG5vdyBpZ25vcmVzIHRoZSBpbnN0YW50aWF0aW9uIGFuZCBnZW5lcmF0ZXMgYSB3YXJuaW5nIG1lc3NhZ2UuCiAgICAgICAgICAgIFdlIG1pZ2h0IGRvIG1vcmUgbGF0ZXIuICBSZXBvcnRlZCBieSBUaG9tYXMgV2lsbGlhbXNvbi4KCjAyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBSZXdyb3RlIGJvb2wgdHlwZW1hcHMgdG8gcmVtb3ZlIHBlcmZvcm1hbmNlIHdhcm5pbmcgZm9yIGNvbXBpbGluZyBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICB1bmRlciBWaXN1YWwgQysrLgoKMDIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBmb3Igd3JhcHBpbmcgcmVmZXJlbmNlIHZhcmlhYmxlcyAoY29uc3Qgbm9uLXByaW1pdGl2ZSBhbmQgYWxsIG5vbi1jb25zdCB0eXBlcykgCiAgICAgICAgICAgIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIGludCYgaTsKICAgICAgICAgICAgICBDbGFzcyYgYzsKICAgICAgICAgICAgICBjb25zdCBDbGFzcyYgYzsKCjAyLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgbW9yZSB2ZXJ5IHN1YnRsZSBwcmVwcm9jZXNzb3IgY29ybmVyIGNhc2VzIHJlbGF0ZWQgdG8gcmVjdXJzaXZlCiAgICAgICAgICAgIG1hY3JvIGV4cGFuc2lvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgY2F0KHgseSkgeCAjIyB5CgogICAgICAgICAgICAgICAgICAgY2F0KGNhdCgxLDIpLDMpICAgIC8vIFByb2R1Y2VzOiBjYXQoMSwyKTMKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgI2RlZmluZSB4Y2F0KHgseSkgY2F0KHgseSkKCiAgICAgICAgICAgICAgICAgICB4Y2F0KHhjYXQoMSwyKSwzKSAgLy8gUHJvZHVjZXMgMTIzCgogICAgICAgICAgICBTZWUgSyZSLCAybmQgRWQuIHAuIDIzMS4KCjAyLzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlZCBbIDY4Mzg4MiBdIC0gcGF0Y2ggc3VibWl0dGVkIGJ5IEYuIFBvc3RtYSBmb3IgU1dJRyB0byBjb21waWxlIG9uIEhQLVVYLgoKMDIvMTAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgcHJlcHJvY2Vzc29yIGFyZ3VtZW50IGV4cGFuc2lvbiBidWcuIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowMi8xMC8yMDAzOiBzb25neWFuZgogICAgICAgICAgICBBZGRlZCAtY29tcGFjdCBvcHRpb24uCiAgICAgICAgICAgIFJlZHVjZSB0aGUgbGluZXMgYW5kIHNpemUgb2YgdGhlIHdyYXBwZXIgZmlsZQogICAgICAgICAgICBieSBvbWl0dGluZyBjb21tZW50cyBhbmQgY29tYmluaW5nIHNob3J0IGxpbmVzLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAKMDIvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY1MTM1NSBdIFN5bnRheCBlcnJvciB3aXRoIGNzdHJpbmcuaQogICAgICAgICAgICBSZXBvcnRlZCBieSBPbXJpIEJhcmVsLgoKMDIvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY2MzYzMiBdIGluY29tcGF0aWJpbGl0eSB3aXRoIHN0YW5kYXJkIGNwcC4KICAgICAgICAgICAgVGhpcyBpcyBhIHJlZmluZW1lbnQgdGhhdCBmaXhlcyB0aGlzIHByb2JsZW06CgogICAgICAgICAgICAgICAgIC8vIFNvbWUgbWFjcm8gd2l0aCBhbiBhcmd1bWVudAogICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PKHgpICAgICAgIHgKCiAgICAgICAgICAgICAgICAgaW50IEZPTzsgICAgICAgIC8qIE5vdCBhIG1hY3JvLS0tbm8gYXJndW1lbnRzICovCiAKMDIvMDUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY3NTQ5MSBdIHBhcnNlIGVycm9yIHdpdGggZ2xvYmFsIG5hbWVzcGFjZSBxdWFsaWZpY2F0aW9uLgogICAgICAgICAgICBTdWJtaXR0ZWQgYnkgSmVyZW15IFlhbGxvcC4KCjAyLzA0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIGluIHZhcmFyZ3MgcHJvY2Vzc2luZyBpbnRyb2R1Y2VkIGJ5IHRoZSBudW1pbnB1dHMgdHlwZW1hcCBwYXJhbWV0ZXIuCgowMS8wOC8yMDAzOiB0dG4KCSAgICBbeG1sXSBGaXggc3RyaW5nLXJlcGxhY2VtZW50IG9yZGVyaW5nIGJ1Z2xldC4KCSAgICBUaGFua3MgdG8gR2FyeSBIZXJyb24uCgoxMi8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRnVydGhlciBidWlsZCBjaGFuZ2VzOgogICAgICAgICAgICAtIFRoZSBTV0lHIGV4ZWN1dGFibGUgaXMgbm93IGJ1aWx0IHVzaW5nIGEgc2luZ2xlIE1ha2VmaWxlLgogICAgICAgICAgICAtIFRoaXMgbWFrZWZpbGUgaXMgZ2VuZXJhdGVkIGJ5IEF1dG9tYWtlIChTb3VyY2UvTWFrZWZpbGUuYW0pLgogICAgICAgICAgICAtIERlcGVuZGVuY3kgdHJhY2tpbmcgYW5kIHRhZ3Mgc3VwcG9ydCBhcmUgaW4gdGhpcyBtYWtlZmlsZS4KICAgICAgICAgICAgLSBBdXRvbWFrZSAxLjcuMiBhbmQgQXV0b2NvbmYgMi41NCBtaW5pbXVtIHZlcnNpb25zIGFyZSBuZWVkZWQgdG8gYnVpbGQgU1dJRyBmcm9tIENWUy4KICAgICAgICAgICAgLSBSdW5uaW5nIC4vYXV0b2dlbi5zaCBub3cgaW5zdGFsbHMgQXV0b2NvbmYvQXV0b21ha2Ugc3VwcG9ydCBmaWxlcyBpbnRvCiAgICAgICAgICAgICAgVG9vbHMvY29uZmlnIGFuZCB0aGVzZSBmaWxlcyBhcmUgbm8gbG9uZ2VyIHN0b3JlZCBpbiBDVlMuCiAgICAgICAgICAgIC0gQnVnIGZpeGVzIGluICdtYWtlIGluc3RhbGwnIGZvciBzeXN0ZW1zIHVzaW5nIC5leGUgZXhlY3V0YWJsZSBleHRlbnNpb24gYW5kCiAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXJlbGVhc2Utc3VmZml4PXdoYXRldmVyCgoxMi8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTW9yZSBidWlsZCBjaGFuZ2VzOgogICAgICAgICAgICAtIEF1dG9jb25mJ3MgQUNfQ0FOT05JQ0FMX0hPU1QgcmVwbGFjZXMgcHJvcHJpZXRhcnkgYXBwcm9hY2ggZm9yIGRldGVjdGluZyBidWlsZCBob3N0LgogICAgICAgICAgICAtIEF1dG9jb25mIHN1cHBvcnQgZmlsZXMgbW92ZWQgdG8gVG9vbHMvY29uZmlnLgoKMTIvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgdG8gcnVuIG9uIE1hY09TLCBzdWJtaXR0ZWQgYnkgQmVybmFyZCBEZXNncmF1cGVzLgogICAgICAgICAgICBNYWlubHkgZW5zdXJpbmcgZ2VuZXJhdGVkIGZpbGVzIGFyZSBvdXRwdXQgaW4gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBmb3IKICAgICAgICAgICAgc29tZSBtb2R1bGVzLgoKMTIvMTEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFZhcmlvdXMgYnVpbGQgbW9kaWZpY2F0aW9ucyBhbmQgYnVnIGZpeGVzOgogICAgICAgICAgICAtIFNpbXBsaWZpY2F0aW9uIG9mIHZlcnNpb24gc3RyaW5nLiBVc2UgYXV0b2NvbmYncyBQQUNLQUdFX1ZFUlNJT04gaW5zdGVhZC4KICAgICAgICAgICAgLSBCdWlsZCB0aW1lIHJlbW92ZWQgZnJvbSBTV0lHIHZlcnNpb24uCiAgICAgICAgICAgIC0gVXNpbmcgc3RhbmRhcmQgYXV0b2NvbmYgY29uZmlnIGhlYWRlciBnZW5lcmF0aW9uLgogICAgICAgICAgICAtIFVwZGF0ZWQgb2xkIGF1dG9jb25mIG1hY3JvcyBhcyByZXBvcnRlZCBieSBhdXRvdXBkYXRlLgogICAgICAgICAgICAtIFJlbW92ZWQgJHByZWZpeCBpbiBhdXRvY29uZiBmcm9tIHNlYXJjaCBwYXRocyBhcyBhdXRvY29uZiB3b24ndCBleHBhbmQgdGhlbS4KICAgICAgICAgICAgLSBTdWJ0bGUgYnVnIGZpeCB3aGVyZSAnbWFrZSBwcmVmaXg9L3NvbWV3aGVyZTsgbWFrZSBjbGVhbjsgbWFrZSBwcmVmaXg9L3NvbXdoZXJlL2Vsc2UnCiAgICAgICAgICAgICAgcHJvZHVjZWQgYW4gZXhlY3V0YWJsZSB1c2luZyB0aGUgaW5jb3JyZWN0IGxpYnJhcnkgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIC0gQWRkZWQgLWxkZmxhZ3MgY29tbWFuZGxpbmUgb3B0aW9uIGZvciBNelNjaGVtZSwgT2NhbWwsIFBpa2UgYW5kIFBIUC4KICAgICAgICAgICAgLSBGaXhlZCByZXBvcnRpbmcgb2YgY29tcGlsZXIgdXNlZCB3aGVuIHVzaW5nIC12ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbi4KICAgICAgICAgICAgLSBTV0lHIHdlYiBhZGRyZXNzIGFkZGVkIHRvIC12ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbi4KCjEyLzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZml4IHRvIFRjbCBkeW5hbWljIGNhc3QgdHlwZW1hcHMuIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEtyaXN0b3BoZXIgQmxvbS4KCjEyLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHRlbXBsYXRlIGFyZ3VtZW50IHJlcGxhY2UgYnVnLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQ2hyaXMgRmxhdGxleS4KCjEyLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV2ZXJ0ZWQgQ0hBTkdFUyAwOS8wMy8yMDAyLCBwcmVwcm9jZXNzb3IgYXJndW1lbnQgZXZhbHVhdGlvbi4gIEFyZ3VtZW50cwogICAgICAgICAgICBhcmUgbm90IGV2YWx1YXRlZCBkdXJpbmcgY29sbGVjdGlvbiwgSyZSLCBwLiAyMzAuCgoxMi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjQ5MDIyIF0gQ29tcGlsYXRpb24gcHJvYmxlbXMgd2l0aCBLQUkvS0NDCgoxMi8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgJ3JlbC0xLTMnIENWUyBicmFuY2ggbWVyZ2VkIGJhY2sgaW50byB0aGUgbWFpbiBicmFuY2guCgoKVmVyc2lvbiAxLjMuMTcgKE5vdmVtYmVyIDIyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjEzOTIyIF0gcHJlcHJvY2Vzc29yIGVycm9ycyB3aXRoIEhBVkVfTE9OR19MT05HLgogICAgICAgICAgICAKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYxNTQ4MCBdIG16c2NoZW1lIFNXSUdfTXVzdEdldFB0cl8uCgoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjM1MTE5IF0gU1dJR19jcm9hayBjYXVzZXMgY29tcGlsZXIgd2FybmluZy4KCjExLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdHlwZW1hcHMgZm9yIHBvaW50ZXJzIHRvIGNsYXNzIG1lbWJlcnMuCgoxMS8xNS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE92ZXJsb2FkZWQgQysrIGZ1bmN0aW9ucyB3aGljaCBjYW5ub3QgYmUgb3ZlcmxvYWRlZCBpbiBKYXZhIAogICAgICAgICAgICBvbmNlIGFnYWluIGlzc3VlIGEgd2FybmluZy4KCjExLzE0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSGFuZGxpbmcgb2YgTlVMTCBwb2ludGVycyBpcyBpbXByb3ZlZC4gQSBqYXZhIG51bGwgb2JqZWN0IHdpbGwgbm93CiAgICAgICAgICAgIGJlIHRyYW5zbGF0ZWQgdG8gYW5kIGZyb20gYSBOVUxMIEMvQysrIHBvaW50ZXIgYnkgZGVmYXVsdC4gUHJldmlvdXNseSB3aGVuIAogICAgICAgICAgICB3cmFwcGluZzoKCiAgICAgICAgICAgICAgICBjbGFzcyBTb21lQ2xhc3Mgey4uLn07CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhTb21lQ2xhc3MgKnMpOwoKICAgICAgICAgICAgYW5kIGl0IHdhcyBjYWxsZWQgZnJvbSBKYXZhIHdpdGggbnVsbDoKCiAgICAgICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhudWxsKQoKICAgICAgICAgICAgYSBKYXZhIE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24uIEV4dHJhIHR5cGVtYXBzIGhhZCB0byBiZSB3cml0dGVuIGluCiAgICAgICAgICAgIG9yZGVyIHRvIG9idGFpbiBhIE5VTEwgcG9pbnRlciB0byBwYXNzIHRvIGZ1bmN0aW9ucyBsaWtlIHRoaXMgb25lLiBOb3cgdGhlIAogICAgICAgICAgICBkZWZhdWx0IHdyYXBwaW5nIHdpbGwgZGV0ZWN0ICdudWxsJyBhbmQgdHJhbnNsYXRlIGl0IGludG8gYSBOVUxMIHBvaW50ZXIuCiAgICAgICAgICAgIEFsc28gaWYgYSBmdW5jdGlvbiByZXR1cm5zIGEgTlVMTCBwb2ludGVyLCBlZzoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBTb21lQ2xhc3MgKmJhcigpIHsgcmV0dXJuIE5VTEw7IH0KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZW4gdGhpcyB1c2VkIHRvIGJlIHdyYXBwZWQgd2l0aCBhIFNvbWVDbGFzcyBwcm94eSBjbGFzcyBob2xkaW5nIGEgTlVMTAogICAgICAgICAgICBwb2ludGVyLiBOb3cgbnVsbCBpcyByZXR1cm5lZCBpbnN0ZWFkLiBUaGVzZSBjaGFuZ2VzIGFyZSBzdWJ0bGUgYnV0IHVzZWZ1bC4KICAgICAgICAgICAgVGhlIG9yaWdpbmFsIGJlaGF2aW91ciBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcgdGhlIG9yaWdpbmFsIHR5cGVtYXBzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICQmamF2YWNsYXNzbmFtZSgkam5pY2FsbCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICRqYXZhY2xhc3NuYW1lKCRqbmljYWxsLCAkb3duZXIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhZ2V0Y3B0cikgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICV7CiAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoKMTEvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggYWJzdHJhY3QgbWV0aG9kcyBhbmQgc2lnbmF0dXJlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgY2xhc3MgYWJzdHJhY3RfZm9vIHsgCiAgICAgICAgICAgIHB1YmxpYzogCiAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCAgIG1ldGgoaW50IG1ldGhfcGFyYW0pID0gMDsgCiAgICAgICAgICAgIH07IAogCiAKICAgICAgICAgICAgY2xhc3MgYWJzdHJhY3RfYmFyIDogcHVibGljIGFic3RyYWN0X2ZvbyB7IAogICAgICAgICAgICBwdWJsaWM6IAogICAgICAgICAgICAgICAgaW50IG1ldGgoaW50IG1ldGhfcGFyYW1fMSwgaW50IG1ldGhfcGFyYW1fMikgeyByZXR1cm4gMDsgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhYnN0cmFjdF9iYXIgaXMgc3RpbGwgYWJzdHJhY3QuCgogICAgICAgICAgICBGaXhlcyBbIDYyODQzOCBdIERlcml2ZWQgYWJzdHJhY3QgY2xhc3Mgbm90IGFic3RyYWN0LgogICAgICAgICAgICBSZXBvcnRlZCBhbmQgcGF0Y2hlZCBieSBTY290dCBNaWNoZWwuCgoxMS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgbWF0Y2hpbmcgcHJvYmxlbSB3aXRoIHR5cGVtYXBzIGFuZCBhcnJheSBkaW1lbnNpb25zLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgICBoYWQgdGhpczoKCiAgICAgICAgICAgICAgIHR5cGVkZWYgY2hhciBibGFoWzIwXTsKCiAgICAgICAgICAgIGFuZCBhIHR5cGVtYXA6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIGNoYXIgW0FOWV0gewogICAgICAgICAgICAgICAgICAgLi4uICQxX2RpbTAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZW4gJDFfZGltKiB2YXJpYWJsZXMgd2VyZW4ndCBiZSBleHBhbmRlZCBwcm9wZXJseS4gIEl0IHNob3VsZCB3b3JrIG5vdy4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBQYW5rYWogS3VtYXIgR29lbC4KICAgICAgICAgICAgICAgCjExLzA3LzIwMDI6IG1rb2VwcGUKCSAgICBBZGRlZCBhbiBleHBlcmltZW50YWwgbmV3IG1vZHVsZSB0aGF0IGR1bXBzIFNXSUcncyBwYXJzZQoJICAgIHRyZWUgYXMgKENvbW1vbikgTGlzcCBzLWV4cHJlc3Npb25zLiAgVGhlIG1vZHVsZSBpcwoJICAgIGludm9rZWQgd2l0aCBTV0lHJ3MgLXNleHAgY29tbWFuZC1saW5lIHN3aXRjaC4gIFRoZSBvdXRwdXQKCSAgICBjYW4gYmUgcmVhZCBpbnRvIENvbW1vbiBMaXNwLiAgVGhlcmUgaXMgKHByb3RvdHlwZSkKCSAgICBleGFtcGxlIExpc3AgY29kZSB0aGF0IGdlbmVyYXRlcyBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQoJICAgIGRlZmluaXRpb25zIGZvciB1c2Ugd2l0aCBLZXZpbiBSb3NlbmJlcmcncyBVRkZJLgoKCSAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMTEvMDcvMjAwMjogbWtvZXBwZQoJICAgIFJlbW92ZWQgZHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mICJjcHBfdGVtcGxhdGVfZGVjbCIgaW4KCSAgICBwYXJzZXIueTsgYmlzb24gMS43NSBjb21wbGFpbmVkLgoKMTEvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEZWZhdWx0IHByaW1pdGl2ZSBhcnJheSBoYW5kbGluZyBoYXMgY2hhbmdlZCBsaWtlIGFycmF5cyBvZiBjbGFzc2VzLiAKICAgICAgICAgICAgQyBwcmltaXRpdmUgYXJyYXlzIGFyZSBubyBsb25nZXIgd3JhcHBlZCBieSBhIEphdmEgYXJyYXkgYnV0IHdpdGggYSBwb2ludGVyIAogICAgICAgICAgICAodHlwZSB3cmFwcGVyIGNsYXNzKS4gQWdhaW4gdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgZm9yIGVmZmljaWVuY3kgcmVhc29ucy4gCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCB0eXBlbWFwcyBoYXZlIGJlZW4gbW92ZWQgaW50byBhcnJheXNfamF2YS5pLCBzbyB0aGUgb3JpZ2luYWwgCiAgICAgICAgICAgIGJlaGF2aW91ciBjYW4gYmUgb2J0YWluZWQgbWVyZWx5IGluY2x1ZGluZyB0aGlzIGZpbGU6CgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCgogICAgICAgICAgICBUaGUgYXJyYXkgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIG5vIGxvbmdlciBnZW5lcmF0ZWQgYnkgZGVmYXVsdC4gVGhleSBhcmUgb25seQogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBpbmNsdWRpbmcgdGhpcyBmaWxlLCB0aHVzIHRoaXMgb2Z0ZW4gdW51c2VkIGNvZGUgaXMgb25seQogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBzcGVjaWZpY2FsbHkgcmVxdWlyaW5nIHRoaXMgdHlwZSBvZiBhcnJheSBzdXBwb3J0LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTEvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHN1cHBvcnQgZm9yIG5lc3RlZCBtb2R1bGUgZGVjbGFyYXRpb25zIChhcyB3YXMKICAgICAgICAgICAgcHJldmlvdXNseSBhZGRlZCBmb3IgdGhlIFBlcmwgbW9kdWxlKS4gU28gYSAlbW9kdWxlIGRpcmVjdGl2ZQogICAgICAgICAgICBvZiB0aGUgZm9ybToKCiAgICAgICAgICAgICAgICAlbW9kdWxlICJPdXRlcjo6SW5uZXI6OkZvbyIKCiAgICAgICAgICAgIHdpbGwgbmVzdCBldmVyeXRoaW5nIGFzIChpbiBSdWJ5IGNvZGUpOgoKICAgICAgICAgICAgICAgIG1vZHVsZSBPdXRlcgogICAgICAgICAgICAgICAgICBtb2R1bGUgSW5uZXIKICAgICAgICAgICAgICAgICAgICBtb2R1bGUgRm9vCiAgICAgICAgICAgICAgICAgICAgICAjIHN0dWZmIGdvZXMgaGVyZQogICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgIGVuZAogCjExLzA1LzIwMDI6IG1rb2VwcGUgCgkgICAgW016U2NoZW1lXSBBZGQgYW4gYXJndW1lbnQgKC1kZWNsYXJlbW9kdWxlKSB0aGF0IGdlbmVyYXRlcwoJICAgIGNvZGUgdG8gY29ycmVjdGx5IGRlY2xhcmUgYSBwcmltaXRpdmUgbW9kdWxlIGV4dGVuc2lvbi4KCSAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgQnJ1Y2UgQnV0dGVyZmllbGQuCgoxMS8wMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHBhdGNoIHN1Ym1pdHRlZCBieSBNaWNoYWVsIENhaGlsbCB0byByZW1vdmUgdW51c2VkIHBhcmFtZXRlcgogICAgICAgICAgICB3YXJuaW5ncyBmb3IgdGhlIGplbnYgYW5kIGNscyBwYXJhbWV0ZXJzLiBUaGlzIHBhdGNoIGFsc28gYWxzbyBhbGxvd3Mgb25lCiAgICAgICAgICAgIHRvIHVzZSAidm9pZCIgaW4gdGhlIGpuaSB0eXBlbWFwIGZvciBhbnkgdHlwZSB3aXRob3V0IGNvZGUgYmVpbmcgZ2VuZXJhdGVkCiAgICAgICAgICAgIGF0dGVtcHRpbmcgdG8gcmV0dXJuIGEgdmFsdWUuCgoxMC8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFycmF5IGhhbmRsaW5nIGlzIGRpZmZlcmVudC4gQXJyYXlzIG9mIGNsYXNzZXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkCiAgICAgICAgICAgIHdpdGggcHJveHkgYXJyYXlzLCBlZyB3cmFwcGluZwoKICAgICAgICAgICAgICAgIGNsYXNzIFggey4uLn07CiAgICAgICAgICAgICAgICBYIGZvb1sxMF07CiAgICAgICAgICAgIAogICAgICAgICAgICB1c2VkIHRvIGJlIHdyYXBwZWQgd2l0aCB0aGVzZSBKYXZhIGdldHRlcnMgYW5kIHNldHRlcnM6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhYW10gdmFsdWUpIHsuLi59CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFhbXSBnZXRGb28oKSB7Li4ufQoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBpcyB2ZXJ5IGluZWZmaWNpZW50IGFzIHRoZSBlbnRpcmUgYXJyYXkgaXMgY29waWVkIG51bWVyb3VzCiAgICAgICAgICAgIHRpbWVzIG9uIGVhY2ggaW52b2NhdGlvbiBvZiB0aGUgZ2V0dGVyIG9yIHNldHRlci4gVGhlc2UgYXJyYXlzIGFyZSBub3cKICAgICAgICAgICAgd3JhcHBlZCB3aXRoIGEgcG9pbnRlciBzbyBpdCBpcyBvbmx5IHBvc3NpYmxlIHRvIGFjY2VzcyB0aGUgZmlyc3QgYXJyYXkgZWxlbWVudCAKICAgICAgICAgICAgdXNpbmcgYSBwcm94eSBjbGFzczoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKFggdmFsdWUpIHsuLi59CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFggZ2V0Rm9vKCkgey4uLn0KCiAgICAgICAgICAgIEFycmF5cyBvZiBlbnVtcyBoYXZlIGFsc28gYmVlbiBzaW1pbGFybHkgY2hhbmdlZC4gVGhpcyBiZWhhdmlvdXIgaXMgbm93IGxpa2UgdGhlIAogICAgICAgICAgICBvdGhlciBTV0lHIGxhbmd1YWdlJ3MgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBhcnJheSBsaWJyYXJ5IHNob3VsZCBiZSB1c2VkIHRvIAogICAgICAgICAgICBhY2Nlc3MgdGhlIG90aGVyIGVsZW1lbnRzLiBUaGUgb3JpZ2luYWwgYmVoYXZpb3VyIGNhbiBiZSBhY2hpZXZlZCB1c2luZyB0aGUgCiAgICAgICAgICAgIG1hY3JvcyBhbmQgdHlwZW1hcHMgaW4gYXJyYXlzX2phdmEuaSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCiAgICAgICAgICAgICAgICBKQVZBX0FSUkFZU09GQ0xBU1NFUyhYKQogICAgICAgICAgICAgICAgY2xhc3MgWCB7Li4ufTsKICAgICAgICAgICAgICAgIFggZm9vWzEwXTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjEwLzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVHdvIG5ldyB0eXBlbWFwcyBqYXZhaW4gYW5kIGphdmFvdXQgZm9yIGdlbmVyYXRpbmcgdGhlIHByb3h5IGNsYXNzIAogICAgICAgICAgICBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzIG1ldGhvZCBjYWxscyB0byB0aGUgSk5JIGNsYXNzLiBUaGUgbmV3IHR5cGVtYXBzIGFyZSAKICAgICAgICAgICAgcmVhbGx5IHVzZWQgZm9yIHRyYW5zZm9ybWluZyB0aGUganN0eXBlICh1c2VkIGluIHByb3h5IGNsYXNzIGFuZCB0eXBlIHdyYXBwZXIKICAgICAgICAgICAgY2xhc3NlcykgdG8gdGhlIGp0eXBlICh1c2VkIGluIHRoZSBKTkkgY2xhc3MpIGFuZCB2aXNhIHZlcnNhLiBBIGphdmFpbiB0eXBlbWFwCiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHdoZW5ldmVyIGFuIGluIHR5cGVtYXAgaXMgd3JpdHRlbiBhbmQgc2ltaWxhcmx5IGphdmFvdXQgZm9yIGFuIG91dAogICAgICAgICAgICB0eXBlbWFwLiBBbiBleGFtcGxlIGlzIHByb2JhYmx5IGJlc3QgdG8gc2hvdyB0aGVtIHdvcmtpbmc6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWluKSBDbGFzcyAiQ2xhc3MuZ2V0Q1B0cigkamF2YWlucHV0KSIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbikgdW5zaWduZWQgc2hvcnQgIiRqYXZhaW5wdXQiCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBDbGFzcyAqIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzKCRqbmljYWxsLCAkb3duZXIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzIHt9OwogICAgICAgICAgICAgICAgICAgIENsYXNzICogYmFyKENsYXNzIGNscywgdW5zaWduZWQgc2hvcnQgdXNoKSB7IHJldHVybiBuZXcgQ2xhc3MoKTsgfTsKICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgZ2VuZXJhdGVkIHByb3h5IGNvZGUgaXMgdGhlbjoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIENsYXNzIGJhcihDbGFzcyBjbHMsIGludCB1c2gpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzcyhleGFtcGxlSk5JLmJhcihDbGFzcy5nZXRDUHRyKGNscyksIHVzaCksIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICBTb21lIG5ldyBzcGVjaWFsIHZhcmlhYmxlcyBoYXZlIGJlZW4gaW50cm9kdWNlZCBpbiBvcmRlciB0byB1c2UgdGhlc2UgdHlwZW1hcHMuCiAgICAgICAgICAgIEhlcmUgJGphdmFpbnB1dCBoYXMgYmVlbiByZXBsYWNlZCBieSAnY2xzJyBhbmQgJ3VzaCcuICRqbmljYWxsIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IAogICAgICAgICAgICB0aGUgbmF0aXZlIG1ldGhvZCBjYWxsLCAnZXhhbXBsZUpOSS5iYXIoLi4uKScgYW5kICRvd25lciBoYXMgYmVlbiByZXBsYWNlZCBieSAnZmFsc2UnLgogICAgICAgICAgICAkamF2YWlucHV0IGlzIGFuYWxvZ291cyB0byB0aGUgJGlucHV0IHNwZWNpYWwgdmFyaWFibGUuIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgICAgICAgJGpuaWNhbGwgaXMgYW5hbG9nb3VzIHRvICRhY3Rpb24gaW4gJWV4Y2VwdGlvbi4gSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNhbGwgdG8gdGhlIG5hdGl2ZQogICAgICAgICAgICBtZXRob2QgaW4gdGhlIEpOSSBjbGFzcy4KICAgICAgICAgICAgJG93bmVyIGlzIHJlcGxhY2VkIGJ5IGVpdGhlciB0cnVlIGlmICVuZXdvYmplY3QgaGFzIGJlZW4gdXNlZCBvdGhlcndpc2UgZmFsc2UuCgogICAgICAgICAgICBUaGUgamF2YS5zd2cgZmlsZSBjb250YWlucyBkZWZhdWx0IGphdmFpbiBhbmQgamF2b3V0IHR5cGVtYXBzIHdoaWNoIHdpbGwgcHJvZHVjZSB0aGUgc2FtZSBjb2RlCiAgICAgICAgICAgIGFzIHByZXZpb3VzbHkuIFRoaXMgY2hhbmdlIGlzIG9ubHkgb2YgY29uY2VybiB0byB0aG9zZSB3aG8gaGF2ZSB3cml0dGVuIHRoZWlyIG93biB0eXBlbWFwcyBhcwogICAgICAgICAgICB5b3Ugd2lsbCB0aGVuIG1vc3QgbGlrZWx5IGhhdmUgdG8gd3JpdGUgeW91ciBvd24gamF2YWluIGFuZCBqYXZhb3V0IHR5cGVtYXBzLgoKICAgICAgICAgICAgVGhlIGphdmFvdXQgdHlwZW1hcCBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBhIEphdmEgZG93bmNhc3QgdG8gYmUgdXNlZCBvbiBhYnN0cmFjdCAKICAgICAgICAgICAgcHJveHkgYmFzZSBjbGFzc2VzLiBTZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBvbiBkeW5hbWljX2Nhc3QuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMC8yNC8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFVwZ2FkZWQgdG8gbGlidG9vbCAxLjQuMywgcHJlc3VtYWJseSB3LyBiZXR0ZXIKCSAgICBzdXBwb3J0IGZvciBuZXdpc2ggcGxhdGZvcm1zIChsaWtlIE1hY09TIFgpLgoKMTAvMjEvMjAwMjogdHRuCgkgICAgRml4ZWQgUnVudGltZS9NYWtlZmlsZS5pbiBidWcgLS0gdGhhbmtzIHRvIFJpY2hhcmQgQ2FsbWJhY2guCgoxMC8xOC8yMDAyOiB0dG4KCSAgICBGaXhlZCB0eXBvIGluIGRvaC5oIC0tIHRoYW5rcyB0byBNYXggSG9ybi4KClZlcnNpb24gMS4zLjE2IChPY3RvYmVyIDE0LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggJWV4dGVuZCBkaXJlY3RpdmUgYW5kICVmZWF0dXJlIHJlcG9ydGVkCiAgICAgICAgICAgIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMTAvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBPcGVuVk1TIGJ1aWxkIGRpcmVjdG9yeSAodm1zKS4gIENvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBKZWFuLUZyYW7nb2lzIFBpZXJvbm5lLgoKMTAvMDkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0aHJvd3MgY2xhdXNlIHRvIHRoZSBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBKTkkgY2xhc3MuCiAgICAgICAgICAgIFRoZSB0aHJvd3MgY2xhdXNlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZ2VuZXJhdGVkIGZvciBwcm94eSBmdW5jdGlvbnMKICAgICAgICAgICAgYW5kIG1vZHVsZSBjbGFzcyBmdW5jdGlvbnMuCgowOS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUgYW5kIGNsYXNzZXMgdGhhdAogICAgICAgICAgICB3ZXJlIGRlZmluZWQgYnV0IG5vdCB3cmFwcGVkLiAgUHJvYmxlbSByZXBvcnRlZCBieSBMZXNsaWUgQnJvb2tzLAogICAgICAgICAgICBHZXJyeSBXb29kcywgYW5kIG90aGVycy4KCjA5LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU29tZSBlcnJvciBjaGVja2luZyBhZGRlZDoKICAgICAgICAgICAgMSkgT3V0T2ZNZW1vcnlFeGNlcHRpb24gY2hlY2sgaW4gdGhlIGNoYXIgKiB0eXBlbWFwcy4gCiAgICAgICAgICAgIDIpIEFzIFNXSUcgdHJlYXRzIHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwYXNzaW5nIGJ5IHZhbHVlIGFsbCB0aGUKICAgICAgICAgICAgc2FtZSwgaXQgaXMgcG9zc2libGUgdG8gcGFzcyBhIE5VTEwgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgZXhwZWN0cwogICAgICAgICAgICBhbiBvYmplY3QgcGFzc2VkIGJ5IHZhbHVlIG9yIGJ5IHJlZmVyZW5jZS4gQSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyAKICAgICAgICAgICAgbm93IHRocm93biB1bmRlciB0aGlzIHNjZW5hcmlvLgoKMDkvMjAvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBSZXdvcmtlZCAibWFrZSBjbGVhbiIgYW5kICJtYWtlIGluc3RhbGwiCgkJCSAgdG8gYmUgbW9yZSB0YWJsZSBkcml2ZW4uCgkgICAgW0RvY3NdIEV4cGxhaW4gaG93IHRvIGV4dGVuZCAibWFrZSBpbnN0YWxsIiB3LyBleHRyYS1pbnN0YWxsLmxpc3QuCgowOS8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0aW9uIG9mIHRoZSAiaWdub3JlIiB0eXBlbWFwLiAgIFRoZSAiaWdub3JlIiB0eXBlbWFwIGhhcwogICAgICAgICAgICBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgImluIiB0eXBlbWFwLgogICAgICAgICAgICBUbyBpZ25vcmUgYW4gYXJndW1lbnQsIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIGluc3RlYWQ6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApIGludCAqb3V0cHV0IChpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgZml4ZXMgYSBudW1iZXIgb2Ygc3VidGxlIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24KICAgICAgICAgICAgb2YgdGhlICJpbiIgYW5kICJpZ25vcmUiIHR5cGVtYXBzICh3aGljaCB3ZXJlIHN1cHBvc2VkIHRvIGJlCiAgICAgICAgICAgIG11dHVhbGx5IGV4Y2x1c2l2ZSkuCgogICAgICAgICAgICBUaGUgdXNlIG9mIHRoZSBudW1pbnB1dHMgYXJndW1lbnQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24uCiAgICAgICAgICAgIEN1cnJlbnRseSwgdmFsdWVzID4xIHdpbGwgZ2VuZXJhdGUgYW4gZXJyb3IuICBIb3dldmVyLCBmdXR1cmUKICAgICAgICAgICAgcmVsZWFzZXMgb2YgU1dJRyBtYXkgdXRpbGl6ZSB0aGF0IHRvIHN1cHBvcnQgbXVsdGktaW5wdXQgdHlwZW1hcHMuCgogICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIHN0aWxsIHdvcmtzLCBidXQgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIGFuZCBpcwogICAgICAgICAgICB0cmFuc2xhdGVkIHRvICV0eXBlbWFwKGluLG51bWlucHV0cz0wKS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOS8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNlZ21lbnRhdGlvbiBmYXVsdCBmb3IgdW5uYW1lZCBzdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgIH0gKmJsYWg7CgoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUm9nZXIgR2lic29uLgogICAgICAgICAgICBOb3RlOiB3ZSBtaWdodCBiZSBhYmxlIHRvIGdlbmVyYXRlIHdyYXBwZXJzIGluIHNwZWNpYWwgY2FzZXMuCgowOS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIG1vZGlmaWNhdGlvbiB0byBnZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbnMuICBQb2ludGVyIGFyZ3VtZW50cyBhcmUgbm93CiAgICAgICAgICAgIGFsd2F5cyBzZXQgdG8gYW4gaW5pdGlhbCB2YWx1ZSBvZiAwLiAgIFNpbXBsaWZpZXMgdHlwZW1hcCB3cml0aW5nIGFuZCBjbGVhbnVwCiAgICAgICAgICAgIGNvZGUgKHNpbmNlIHlvdSBjYW4gcmVseSBvbiB6ZXJvLXZhbHVlIGluaXRpYWxpemF0aW9uKS4gICBUaGlzIGFsc28gZ3JlYXRseQogICAgICAgICAgICByZWR1Y2VzIHRoZSBuZWVkIHRvIGV2ZXIgd3JpdGUgYW4gImFyZ2luaXQiIHR5cGVtYXAuCgowOS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHNtYXJ0LXBvaW50ZXIgc3VwcG9ydC4gIElmIG9wZXJhdG9yLT4oKQogICAgICAgICAgICBpcyBwYXJ0IG9mIGFuIGlnbm9yZWQgYmFzZSBjbGFzcyBsaWtlIHRoaXMsCgogICAgICAgICAgICAgICAgICVpZ25vcmUgQmFyOwoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgeyAgICAgICAgIC8qIElnbm9yZWQgKi8KICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBCYXIgeyB9OwoKICAgICAgICAgICAgdGhlbiBtZXRob2RzIGZyb20gRm9vIGFyZSBzdGlsbCBhdmFpbGFibGUuICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgPj4+IHMgPSBTcGFtKCkKICAgICAgICAgICAgICAgICA+Pj4gcy5ibGFoKCkKICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgPj4+CgogICAgICAgICAgICAgVGhlIG9ubHkgY2F0Y2ggaXMgdGhhdCB0aGUgb3BlcmF0b3ItPigpIGl0c2VsZiBpcyBub3QgYXZhaWxhYmxlCiAgICAgICAgICAgICAoc2luY2UgaXQgd2Fzbid0IHdyYXBwZWQpLiAgIFRoZXJlZm9yZSwgdGhlcmUgd29uJ3QgYmUgYW55CiAgICAgICAgICAgICBfX2RlcmVmX18oKSBvcGVyYXRpb24gdW5sZXNzIGl0IGlzIGV4cGxpY2l0bHkgYWRkZWQgdG8gU3BhbQogICAgICAgICAgICAgKGVpdGhlciB1c2luZyAlZXh0ZW5kIG9yIGp1c3QgcGxhY2luZyBvcGVyYXRvci0+KCkgaW4gdGhlCiAgICAgICAgICAgICBkZWZpbml0aW9uIG9mIFNwYW0pLgoKMDkvMTEvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBSZXdvcmtlZCAibWFrZSBjaGVjayIgdG8gYmUgbW9yZSB0YWJsZSBkcml2ZW4uCgkgICAgW0RvY3NdIERvY3VlbWVudGVkIG1ldGhvZG9sb2d5IGluIE1hbnVhbC9FeHRlbmRpbmcuaHRtbC4KCjA5LzExLzIwMDI6IHR0bgoJICAgIFtEb2NzXSBQcmVmaXhlZCBNYW51YWwvKi5odG1sIHdpdGggIjwhRE9DVFlQRSBodG1sIC4uLj4iIHRvCgkgICAgcGFuZGVyIGRvdGluZ2x5IHRvIChvdmVyLSlzZW5zaXRpdmUgZWRpdG9ycy4KCjA5LzEwLzIwMDI6IHR0bgoJICAgIFtHdWlsZV0gQ29udmVydGVkIEV4YW1wbGVzL2d1aWxlL3NpbXBsZSAibWFrZSBjaGVjayIKCSAgICBiZWhhdmlvciB0byBhY3R1YWxseSBjaGVjayBleGVjdXRpb24gcmVzdWx0cy4gIFJlZHVjZWQKCSAgICBpdGVyYXRpb24gY291bnRzIHNvIHRoYXQgdGhlIHRlc3QgZG9lc24ndCB0YWtlIHRvbyBsb25nLgoKMDkvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHLTEuMy4xNSByZWxlYXNlZC4KCgpWZXJzaW9uIDEuMy4xNSAoU2VwdGVtYmVyIDksIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA5LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgbmFzdHkgcnVudGltZSB0eXBlIGNoZWNraW5nIGJ1ZyB3aXRoIHN1YnR5cGVzIGFuZCBpbmhlcml0YW5jZQogICAgICAgICAgICBhbmQgdGVtcGxhdGVzLiAKCjA5LzA5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSmF2YSBleGNlcHRpb24gY2xhc3NlcyBmb3IgYSBtZXRob2QncyB0aHJvd3MgY2xhdXNlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgCiAgICAgICAgICAgIHNwZWNpZnlpbmcgdGhlbSBpbiBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IGluIHRoZSB0aHJvd3MgYXR0cmlidXRlIGluIGFueSBvbmUKICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB0eXBlbWFwczogaW4sIG91dCwgY2hlY2ssIGZyZWVhcmcsIGFyZ291dCBhbmQgdGhyb3dzLiBBIGNsYXNzaWMKICAgICAgICAgICAgZXhhbXBsZSB3b3VsZCBiZSB0byBjb252ZXJ0IEMrKyBleGNlcHRpb25zIGludG8gYSBzdGFuZGFyZCBKYXZhIGV4Y2VwdGlvbjoKCiAgICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MsIHRocm93cz0iamF2YS5pby5JT0V4Y2VwdGlvbiIpIGZpbGVfZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICBqY2xhc3MgZXhjZXAgPSBqZW52LT5GaW5kQ2xhc3MoImphdmEvaW8vSU9FeGNlcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXApCiAgICAgICAgICAgICAgICAgICAgICAgIGplbnYtPlRocm93TmV3KGV4Y2VwLCAkMS53aGF0KCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAkbnVsbDsgLy8gb3IgdXNlIFNXSUdfZmFpbAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsYXNzIGZpbGVfZXhjZXB0aW9uIHsuLi59OwogICAgICAgICAgICAgICAgdm9pZCBvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB0aHJvdyhmaWxlX2V4Y2VwdGlvbik7CgogICAgICAgICAgICBUaGUgSmF2YSBtZXRob2Qgd2lsbCB0aGVuIGJlIGRlY2xhcmVkIHdpdGggYSB0aHJvd3MgY2xhdXNlOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gey4uLn0KCjA5LzA4LzIwMDI6IG1rb2VwcGUKCSAgKiBbR3VpbGVdIEltcHJvdmVkIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFRoZSBhcmdsaXN0IG5vCgkgICAgbG9uZ2VyIGdldHMgY2x1dHRlcmVkIHdpdGggdHlwZSBzcGVjaWZpY2F0aW9uLCBtYWtpbmcgaXQKCSAgICBtb3JlIHJlYWRhYmxlLiAgKEFsc28gdGhlIElMSVNQIGZ1bmN0aW9uIEMtdSBNLXgKCSAgICBgYXJnbGlzdC1saXNwJyBSRVQgd29ya3MgYmV0dGVyIHRoaXMgd2F5LikgIFRoZSB0eXBlcyBvZgoJICAgIGFyZ3VtZW50cyBhcmUgZXhwbGFpbmVkIGluIGFuIGV4dHJhIHNlbnRlbmNlIGFmdGVyIHRoZQoJICAgIGFyZ2xpc3QuIAoJICAgIAoJICAgIFRoZXJlIGFyZSBub3cgdHdvIGRvY3VtZW50YXRpb24tcmVsYXRlZCB0eXBlbWFwIGFyZ3VtZW50czoKCgkgICAgICAgICV0eXBlbWFwKGluLCBkb2M9IiROQU1FIGlzIGEgdmVjdG9yIG9mIGludGVnZXJzIiwgCgkJCSBhcmdsaXN0PSIkbmFtZSIpICBpbnQgKlZFQ1RPUiB7IC4uLiB9CgkJCSAKICAgICAgICAgICAgVGhlICJhcmdsaXN0IiB0ZXh0cyBvZiBhbGwgYXJndW1lbnRzIG9mIGEgZnVuY3Rpb24gbWFrZSB1cAoJICAgIGl0cyBhcmdsaXN0IGluIHRoZSBkb2N1bWVudGF0aW9uLiAgVGhlICJkb2MiIHRleHRzIG9mIGFsbAoJICAgIGFyZ3VtZW50cyBhcmUgY29sbGVjdGVkIHRvIG1ha2UgYSBzZW50ZW5jZSB0aGF0IGRlc2NyaWJlcwoJICAgIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLiAgUmVhc29uYWJsZSBkZWZhdWx0cyBhcmUKCSAgICBwcm92aWRlZC4gCgoJICAgIEFzIHVzdWFsLCAkbmFtZSBpcyBzdWJzdGl0dXRlZCBieSB0aGUgbmFtZSBvZiB0aGUKCSAgICBhcmd1bWVudC4gVGhlIG5ldyB0eXBlbWFwIHZhcmlhYmxlICROQU1FIGlzIGxpa2UgJG5hbWUsCgkgICAgYnV0IG1hcmtlZC11cCBhcyBhIHZhcmlhYmxlLiAgVGhpcyBtZWFucyB0aGF0IGl0IGlzCgkgICAgdXBwZXItY2FzZWQ7IGluIFRlWGluZm8gbW9kZSAoIi1wcm9jZG9jZm9ybWF0IHRleGluZm8iKSBpdAoJICAgIGNvbWVzIG91dCBhcyBAdmFye25hbWV9LiAKCSAgICAKCSAgICBUaGUgZGlyZWN0aXZlcyAldmFsdWVzX2FzX2xpc3QsICV2YWx1ZXNfYXNfdmVjdG9yLAoJICAgICVtdWx0aXBsZV92YWx1ZXMgbm93IGFsc28gaGF2ZSBhbiBlZmZlY3Qgb24gdGhlCgkgICAgZG9jdW1lbnRhdGlvbi4gKFRoaXMgaXMgYWNoaWV2ZWQgdmlhIHRoZSBuZXcgcHJhZ21hcwoJICAgIHJldHVybl9ub3RoaW5nX2RvYywgcmV0dXJuX29uZV9kb2MsIHJldHVybl9tdWx0aV9kb2MuKQoKCSAgICBEb2N1bWVudGF0aW9uIGhhcyBhbHNvIGltcHJvdmVkIGZvciB2YXJpYWJsZXMgdGhhdCBhcmUKCSAgICB3cmFwcGVkIGFzIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzIChjb21tYW5kLWxpbmUgc3dpdGNoCgkgICAgIi1lbWl0LXNldHRlcnMiKS4KCiAgICAgICAgICAqIFtHdWlsZV0gRW1pdCBjb25zdGFudHMgYXMgX2ltbXV0YWJsZV8gdmFyaWFibGVzLiAgKFRoaXMKICAgICAgICAgICAgd2FzIGJyb2tlbiByZWNlbnRseS4pCgowOS8wNy8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBVcGRhdGVkIHRoZSB0eXBlbWFwcyBpbiBsaXN0LXZlY3Rvci5pLgoKMDkvMDcvMjAwMjogbWtvZXBwZQoJICAgIFNob3J0LWNpcmN1aXQgdGhlIHR5cGVjaGVja3MgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zLgoJICAgIChUaGUgY2hhbmdlcyBpbiBjb2RlIGdlbmVyYXRpb24gYXJlIHZpc2libGUgaW4gdGhlIG5ldwoJICAgIHRlc3RjYXNlICJvdmVybG9hZF9jb21wbGljYXRlZCIuKQoKMDkvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTb2x1dGlvbiBmb3IgWyA1OTY0MTMgXQogICAgICAgICAgICBOZXcgdHlwZW1hcCBzbyB0aGF0IHRoZSBKYXZhIHByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzCiAgICAgICAgICAgIHdyYXBwZXIgY29uc3RydWN0b3IgbW9kaWZpZXIgY2FuIGJlIHRhaWxvcmVkIGJ5IHVzZXJzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAKICAgICAgICAgICAgcHJvdGVjdGVkLiBOb3JtYWxseSBTV0lHIGdlbmVyYXRlcyBhIGNvbnN0cnVjdG9yIGxpa2UgdGhpcyB3aGljaCBjYW4gb25seSAKICAgICAgICAgICAgYmUgYWNjZXNzZWQgd2l0aGluIG9uZSBwYWNrYWdlOgoKICAgICAgICAgICAgICBwcm90ZWN0ZWQgQmFyKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgSWYgeW91IGFyZSB1c2luZyBTV0lHIGFjcm9zcyBtdWx0aXBsZSBwYWNrYWdlcyBvciB3YW50IHRvIHVzZSB0aGlzIGNvbnN0cnVjdG9yCiAgICAgICAgICAgIGFueXdheSwgaXQgY2FuIG5vdyBiZSBhY2Nlc3NlZCBvdXRzaWRlIHRoZSBwYWNrYWdlLiBUbyBtb2RpZnkgdXNlIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMpIFNXSUdUWVBFICJwdWJsaWMiCgogICAgICAgICAgICB0byBjaGFuZ2UgdG8gcHVibGljIGZvciBhbGwgcHJveHkgY2xhc3NlcyBhbmQgc2ltaWxhcmx5IGZvciBhbGwgdHlwZSB3cmFwcGVyIGNsYXNzZXM6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycykgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICJwdWJsaWMiCgowOS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHRocm93cyB0eXBlbWFwcyBmb3IgdGhlIEphdmEgbW9kdWxlLiBDKysgZXhjZXB0aW9ucyBnZXQgY29udmVydGVkIGludG8KICAgICAgICAgICAgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gSmF2YSBleGNlcHRpb25zLiAKICAgICAgICAgICAgCiAgICAgICAgICAgIFdhcm5pbmc6IFRoaXMgbWF5IGNoYW5nZSBmcm9tIGphdmEubGFuZy5SdW50aW1lIGV4Y2VwdGlvbiBpbiB0aGUgZnV0dXJlLgoKMDkvMDUvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHZhcmlhYmxlcyBkZWNsYXJlZCBhcyByZWZlcmVuY2VzLgoKMDkvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYwNTE2MiBdIFR5cGVtYXAgbG9jYWwgdmFyaWFibGVzLiBSZXBvcnRlZCBieSBMeWxlIEpvaG5zb24uCgowOS8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTW9yZSB1cGRhdGVzIHRvIHRoZSBSdWJ5IG1vZHVsZSBkb2N1bWVudGF0aW9uLCBpbmNsdWRpbmcKCSAgICBhIG5ldyB0eXBlbWFwIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIGNvbGxlY3Qga2V5LXZhbHVlCgkgICAgcGFpcnMgZnJvbSBhbiBhcmd1bWVudCBsaXN0IGludG8gYSBIYXNoLgoKMDkvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24gYW5kIGNvbnN0cnVjdG9ycy4KCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEZvbzxUPigpIHsgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBleHRyYSA8VD4gaW4gdGhlIGNvbnN0cnVjdG9yIHdhcyBjYXJyaWVkIHRocm91Z2ggaW4gdGhlCiAgICAgICAgICAgIG5hbWUtLWNhdXNpbmcgcnVudGltZSBwcm9ibGVtcyBpbiBnZW5lcmF0ZWQgbW9kdWxlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9yZGkgQXJuYWJhdCBCZW5lZGljdG8uCiAKMDkvMDUvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gU3VwcG9ydCBvdmVybG9hZGluZy4KCjA5LzA0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBVcGRhdGVkIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlcwoJICAgIHRvIHVzZSBSdWJ5IDEuNyBzdXBwb3J0IGZvciB0aGVzZSB0eXBlcyB3aGVuIGF2YWlsYWJsZS4KCjA5LzA0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBvdXRwdXQgdHlwZW1hcHMgZm9yIGNvbnN0IHJlZmVyZW5jZSB0byBwcmltaXRpdmUKCSAgICB0eXBlcy4KCjA5LzA0LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBwYXNzLWJ5LXZhbHVlIHR5cGVtYXBzLiAgUmVwb3J0ZWQgYnkgQXJubwoJICAgIFBldGVycyB2aWEgRGViaWFuIGJ1Z3RyYWNraW5nICgjMTU2OTAyKSwgcGF0Y2ggYnkgVG9yc3RlbgoJICAgIExhbmRzY2hvZmYgPHRvcnN0ZW5AZGViaWFuLm9yZz4uCgowOS8wMy8yMDAyOiBzYW1qYW0gKFNhbSBMaWRkaWNvdHQpCgkgICAgQmV0dGVyIHJlZmVyZW5jZSBzdXBwb3J0LgoJICAgIEZ1bmN0aW9ucyB0aGF0IHdhbnQgYSB2b2lkKiogY2FuIHRha2UgYSBOVUxMIGJ5IHJlZmVyZW5jZSBhbmQKCSAgICB0aGUgdm9pZCogd2lsbCBiZSBtYWRlIGZvciB5b3UgYW5kIHRoZW4gcGFzc2VkLWJ5LXJlZmVyZW5jZQoKCSAgICBBbHNvIGFsbCBpbnRlZ2VyLWNsYXNzIG5hdGl2ZSB0eXBlcyBjYW4gYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZQoJICAgIHdoZXJlIGFuIGludCogb3IgaW50JiBldGMgaXMgbmVlZGVkCgowOS8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZWQgdGhlIGV2YWx1YXRpb24gb3JkZXIgb2YgcHJlcHJvY2Vzc29yIG1hY3JvIGFyZ3VtZW50cy4KICAgICAgICAgICAgQXJndW1lbnRzIGFyZSBub3cgZXhwYW5kZWQgYnkgdGhlIHByZXByb2Nlc3NvciAqYmVmb3JlKiB0aGV5CiAgICAgICAgICAgIGFyZSBwYXNzZWQgdG8gbWFjcm8gZXhwYW5zaW9uLiAgVGhpcyBmaXhlcyBhIHN1YnRsZSBleHBhbnNpb24KICAgICAgICAgICAgYnVnIHJlcG9ydGVkIGJ5IEFudGhvbnkgSGVhZGluZy4KCjA5LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdGhlIGZpbGUgaW5jbHVkZSBvcmRlciAoYWdhaW4sIGFwcGFyZW50bHkpLiBTZWUgMi8yNy85OS4KCjA5LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1BlcmxdIEJldHRlciBleGNlcHRpb24gaGFuZGxpbmcgc3VwcG9ydC4gIFNpbmNlIFBlcmwgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgICAgcmVsaWVzIG9uIHNldGptcC9sb25nam1wLCB3cmFwcGVyIGZ1bmN0aW9ucyBoYXZlIGJlZW4gbW9kaWZpZWQgc2xpZ2h0bHkKICAgICAgICAgICAgdG8gcHJvdmlkZSBhbiBleHRyYSBibG9jayBzY29wZToKCiAgICAgICAgICAgICAgICBYUyhmb28pIHsKICAgICAgICAgICAgICAgICAgIGNoYXIgX3N3aWdtc2dbU1dJR19NQVhfRVJSTVNHXSA9ICIiOwogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqX3N3aWdlcnIgPSBfc3dpZ21zZzsKICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIC8qIE5vcm1hbCB3cmFwcGVyIGZ1bmN0aW9uIGhlcmUgKi8KICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgU1dJR19jcm9haygiQW4gZXJyb3Igb2NjdXJyZWRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICBYU1JFVFVSTihhcmd2aSk7ICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gKi8KICAgICAgICAgICAgICAgICAgICAgIGZhaWw6CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFudXAgY29kZSAqLwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgY3JvYWsoX3N3aWdfZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBtYWNybyBTV0lHX2Nyb2FrKHgpIHNldHMgdGhlIHZhbHVlIG9mIF9zd2lnZXJyIHRvIHggYW5kCiAgICAgICAgICAgIGV4ZWN1dGVzIGEgImdvdG8gZmFpbCIuICBUaGUgd2hvbGUgd3JhcHBlciBmdW5jdGlvbiBpcyBlbmNsb3NlZAogICAgICAgICAgICBibG9jayBzY29wZSB0byBwcm92aWRlIHByb3BlciBjbGVhbnVwIG9mIEMrKyBvYmplY3RzLiAgU2luY2UKICAgICAgICAgICAgY3JvYWsgZXhlY3V0ZXMgYSBsb25nam1wKCksIHRoZXJlIGlzIG5vIHdheSB0byBwcm9wZXJseSByZWNsYWltCiAgICAgICAgICAgIHJlc291cmNlcyBpZiB0aGlzIGV4ZWN1dGVzIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSB3cmFwcGVyCiAgICAgICAgICAgIGZ1bmN0aW9uLgoKICAgICAgICAgICAgVGhlIF9zd2lnbXNnW10gdmFyaWFibGUgaXMgbm9ybWFsbHkgdW51c2VkLCBidXQgY2FuIGJlIHVzZWQKICAgICAgICAgICAgdG8gc3RvcmUgc21hbGwgZXJyb3IgbWVzc2FnZXMgdXNpbmcgc3ByaW50ZiBvciBzbnByaW50Zi4gSXQKICAgICAgICAgICAgaGFzIGEgY2FwYWNpdHkgb2YgYXQgbGVhc3QgMjU2IGJ5dGVzIChTV0lHX01BWF9FUlJNU0cpLgogICAgICAgICAgICAKMDkvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBbVGNsXSBBZGRlZCBiZXR0ZXIgc3VwcG9ydCBmb3IgZXhjZXB0aW9ucy4gIEluc3RlYWQgb2YgcmV0dXJuaW5nIFRDTF9FUlJPUiwKICAgICAgICAgICAgdXNlIHRoZSBtYWNybyBTV0lHX2ZhaWwgdG8gcmV0dXJuIHdpdGggYW4gZXJyb3IuICBUaGlzIGVuc3VyZXMgdGhhdAogICAgICAgICAgICBhcmd1bWVudHMgYXJlIHByb3Blcmx5IGNsZWFuZWQgdXAuICBFeGNlcHRpb24gc3BlY2lmaWVycyBhcmUgbm93CiAgICAgICAgICAgIGhhbmRsZWQgYnkgZGVmYXVsdC4KCjA5LzAyLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBUaGUgdHlwZS1jaGVja2luZyBzeXN0ZW0gZm9yIHRoZSBSdWJ5IG1vZHVsZSBoYXMgaGFkIGEgZmxhdwoJICAgIGluIHRoYXQgc29tZSB0eXBlcyB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVpdmFsZW50CgkgICAgd2VyZW4ndC4gVGhpcyBidWcgd2FzIGJlc3QgZGVtb25zdHJhdGVkIGJ5IHRoZSBpbmhlcml0X21pc3NpbmcuaQoJICAgIHRlc3Qgc3VpdGUgY2FzZSwgd2hpY2ggZGVmaW5lcyBhIGJhc2UgY2xhc3MgIkZvbyIgdGhhdCBpcwoJICAgIHN1YmNsYXNzZWQgYnkgIkJhciIuIFRoZSAiRm9vIiBjbGFzcyBpc24ndCBhY3R1YWxseSB3cmFwcGVkIChpLmUuCgkgICAgaXQncyBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIFJ1YnkpIGJ1dCB3ZSdkIHN0aWxsIGxpa2UgdG8gYmUKCSAgICBhYmxlIHRvIHBhc3MgIkJhciIgaW5zdGFuY2VzIHRvIGZ1bmN0aW9ucyBleHBlY3RpbmcgRm9vcyBhbmQgaGF2ZQoJICAgIHRoYXQgd29yazsgaXQgd2Fzbid0LiBUaGUgcmV2aXNlZCBpbXBsZW1lbnRhdGlvbiAoc2ltaWxhciB0byB0aGF0CgkgICAgdXNlZCBmb3Igc29tZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzKSBhZGRzIGEgbmV3IGluc3RhbmNlIHZhcmlhYmxlCgkgICAgKF9fc3dpZ3R5cGVfXykgdG8gZWFjaCBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgaXRzIFNXSUcgdHlwZTsKCSAgICB0aGF0IGlzLCBlYWNoICJCYXIiIGluc3RhbmNlIHdpbGwgbm93IGhhdmUgYSBzdHJpbmcgaW5zdGFuY2UKCSAgICB2YXJpYWJsZSBjYWxsZWQgIl9fc3dpZ3R5cGVfXyIgd2hvc2UgdmFsdWUgaXMgIl9wX0JhciIuCgogICAgICAgICAgICBVbmxlc3MgZGV2ZWxvcGVycyB3ZXJlIHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhpcyBsb3ctbGV2ZWwKCSAgICBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHRoZXkgc2hvdWxkbid0IG5vdGljZSBhbnkgY29tcGF0aWJpbGl0eQoJICAgIHByb2JsZW1zOyBuZXZlcnRoZWxlc3MsIEknbSBtYXJraW5nIGl0IGFzIGEgInBvdGVudGlhbAoJICAgIGluY29tcGF0aWJpbGl0eSIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzAxLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBTRiBCdWcgIzYwMzE5OS4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgT1VUUFVULCBJTlBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaSBmb3IgQysrIAogICAgICAgICAgICByZWZlcmVuY2VzLgoKMDgvMjcvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4ZWQgZXJyb3IgaW4gImxpYl9zdGRfdmVjdG9yIiB0ZXN0Y2FzZSBhbmQKCSAgICBjb21waWxlciB3YXJuaW5nIGluICJsaWJfY2RhdGEiIHRlc3RjYXNlLgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAiJW1peGluIiBkaXJlY3RpdmUsIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0bwoJICAgIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGUgbmFtZXMgdG8gbWl4LWluIHRvIGEKCSAgICBjbGFzcy4gU28sIGZvciBleGFtcGxlLCBpZiB5b3UnZCBsaWtlIHRvIHNwZWNpZnkgdGhhdCBSdWJ5J3MKCSAgICBFbnVtZXJhYmxlIG1vZHVsZSBzaG91bGQgYmUgbWl4ZWQtaW4gdG8geW91ciBjbGFzcyBGb28sIHlvdSdkCgkgICAgd3JpdGU6CgkgICAgCgkgICAgICAgICVtaXhpbiBGb28gIkVudW1lcmFibGUiOwoJCQogICAgICAgICAgICBvciB0byBzcGVjaWZ5IHRoYXQgdGhlIG1vZHVsZXMgRmVlLCBGaWUgYW5kIEZvIHNob3VsZCBiZSBtaXhlZAoJICAgIGluIHRvIEZvbzoKCSAgICAKCSAgICAgICAgJW1peGluIEZvbyAiRmVlLEZpZSxGbyI7CgkJCgkgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1vZGlmaWVkIHRoZSAlYWxpYXMgZGlyZWN0aXZlIHNvIHRoYXQgbXVsdGlwbGUgYWxpYXNlcwoJICAgIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGFuIGluc3RhbmNlIG1ldGhvZCBieSB1c2luZyBhIGNvbW1hLXNlcGFyYXRlZAoJICAgIGxpc3Qgb2YgYWxpYXNlcy4KCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCAidGhyb3ciIHR5cGVtYXBzIGZvciB0aGUgUnVieSBtb2R1bGUuCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFR3byBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIHByaW50aW5nIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgJ3N3aWcgLU0nIGxpc3RzIGFsbCBmaWxlIGRlcGVuZGVuY2llcy4gICdzd2lnIC1NTScgbGlzdHMKICAgICAgICAgICAgZGVwZW5kZW5jaWVzLCBidXQgZXhjbHVkZXMgZmlsZXMgaW4gdGhlIFNXSUcgbGlicmFyeS4gCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgICAlIHN3aWcgLU0gLXB5dGhvbiBleGFtcGxlLmkKICAgICAgICAgICAgICAgZXhhbXBsZV93cmFwLmN4eDogXAogICAgICAgICAgICAgICAgL3UwL2JlYXpsZXkvUHJvamVjdHMvbGliL3N3aWcxLjMvc3dpZy5zd2cgXAogICAgICAgICAgICAgICAgL3UwL2JlYXpsZXkvUHJvamVjdHMvbGliL3N3aWcxLjMvcHl0aG9uL3B5dGhvbi5zd2cgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCiAgICAgICAgICAgICAgICUgc3dpZyAtTU0gLXB5dGhvbiBleGFtcGxlLmkKICAgICAgICAgICAgICAgZXhhbXBsZV93cmFwLmN4eDogXAogICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1OTc1OTkgXSB1bmlvbiBpbiBjbGFzczogaW5jb3JyZWN0IHNjb3BlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBcnQgWWVya2VzLgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYwMDEzMiBdIERlZmF1bHQgYXJndW1lbnQgd2l0aCBuYW1lc3BhY2UuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBTaGlidWthd2EgWW9zaGlraS4KIAowOC8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEF1dG9tYXRpYyBDKysgZXhjZXB0aW9uIGhhbmRsaW5nIGVuYWJsZWQgZm9yIGFsbCBsYW5ndWFnZSBtb2R1bGVzLiAgICBUaGlzIGlzCiAgICAgICAgICAgIHByZXR0eSBzaW1wbGUuICBJZiB5b3UgaGF2ZSBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coRm9vKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgbG9va3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgd3JhcF9CYXJfYmxhaCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLT5ibGFoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRm9vICZfZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAidGhyb3ciIHR5cGVtYXAgY29kZSBpbnNlcnRlZC4gJDEgPSBfZSAqLwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFRoZSAidGhyb3ciIHR5cGVtYXAgY2FuIGJlIHVzZWQgdG8gcmFpc2UgYW4gZXJyb3IgaW4gdGhlIHRhcmdldCAKICAgICAgICAgICAgbGFuZ3VhZ2UuICBJdCBjYW4gZG8gYW55dGhpbmcuICBIZXJlIGlzIGEgdmVyeSBzaW1wbGUgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoInRocm93IikgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIkZvbyBleGNlcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVG8gbWFrZSB0aGlzIHdvcmsgaW4gZWFjaCBsYW5ndWFnZSBtb2R1bGUsIHNpbXBseSBkZWZpbmUgYSBmZXcgZGVmYXVsdAogICAgICAgICAgICAidGhyb3ciIHR5cGVtYXBzIGZvciBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgaW50LCBjb25zdCBjaGFyICosIGFuZCBhCiAgICAgICAgICAgIGZldyBjb21tb24gZXhjZXB0aW9uIHR5cGVzLiAgIFRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQuCgogICAgICAgICAgICBBdXRvbWF0aWMgZXhjZXB0aW9uIGhhbmRsaW5nIGNhbiBiZSBkaXNhYmxlZCB1c2luZyAtbm9leGNlcHQgb3IKICAgICAgICAgICAgc2V0dGluZyB0aGUgTm9FeGNlcHQgZ2xvYmFsIHZhcmlhYmxlIHRvIDEuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgWyBQeXRob24gXQogICAgICAgICAgICBBdXRvbWF0aWMgdHJhbnNsYXRpb24gb2YgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBpbnRvIGVycm9yIGhhbmRsaW5nIGNvZGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coRm9vKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgRm9vIGlzIHdyYXBwZWQgYXMgYSBjbGFzc2ljLXN0eWxlIGNsYXNzIChjb21wYXRpYmxlCiAgICAgICAgICAgIHdpdGggZXhjZXB0aW9uIGhhbmRsaW5nKS4gIEZ1cnRoZXJtb3JlLCB5b3UgY2FuIHdyaXRlIFB5dGhvbiBjb2RlCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBiID0gQmFyKCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBiLmJsYWgoKTsKICAgICAgICAgICAgICAgIGV4Y2VwdCBGb28sZTogICAgICMgTm90ZSB1c2Ugb2YgZXhjZXB0aW9uIGNsYXNzIGhlcmUhCiAgICAgICAgICAgICAgICAgICAgIyBIYW5kbGUgRm9vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICBUaGUgb2JqZWN0ICJlIiBpbiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgaXMganVzdCBhIHdyYXBwZWQgRm9vCiAgICAgICAgICAgIG9iamVjdC4gIEFjY2VzcyBpdCBsaWtlIGEgbm9ybWFsIG9iamVjdC4KCiAgICAgICAgICAgIElmIGFuIGV4Y2VwdGlvbiBpcyBub3Qgd3JhcHBlZCBhcyBhIGNsYXNzLCBhIFJ1bnRpbWVFcnJvcgogICAgICAgICAgICBleGNlcHRpb24gaXMgcmFpc2VkLiAgVGhlIGFyZ3VtZW50IHRvIHRoaXMgZXhjZXB0aW9uIGlzCiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gb2JqZWN0LiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coaW50KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBiID0gQmFyKCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgIGIuYmxhaCgpOwogICAgICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcixlOgogICAgICAgICAgICAgICAgICAgcHJpbnQgZS5hcmdzWzBdICAgICAgICMgSW50ZWdlciBleGNlcHRpb24gdmFsdWUKCiAgICAgICAgICAgIENvbW1lbnRzOgoKICAgICAgICAgICAgICAgIC0gIElmIGEgY2xhc3MgaXMgdXNlZCBhcyBhbiBleGNlcHRpb24sIGl0ICptdXN0KiBiZSB3cmFwcGVkCiAgICAgICAgICAgICAgICAgICBhcyBhIFB5dGhvbiBjbGFzc2ljLXN0eWxlIGNsYXNzIChuZXcgY2xhc3NlcyBkb24ndCB3b3JrKS4KCiAgICAgICAgICAgICAgICAtICBBdXRvbWF0aWMgZXhjZXB0aW9uIGhhbmRsaW5nIGlzIGNvbXBhdGlibGUgd2l0aCAlZXhjZXB0aW9uLgoKICAgICAgICAgICAgICAgIC0gIFVzZSAtbm9leGNlcHQgdG8gdHVybiBvZmYgdGhpcyBmZWF0dXJlLgoKICAgICAgICAgICAgICAgIC0gIFRoZSBuZXdseSBpbnRyb2R1Y2VkICJ0aHJvdyIgdHlwZW1hcCBpcyB1c2VkIHRvIHJhaXNlCiAgICAgICAgICAgICAgICAgICBQeXRob24gZXJyb3JzIChuYXR1cmFsbHkpLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjA4LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW5mb3JtYXRpb24gZnJvbSB0aHJvdygpIHNwZWNpZmllcnMgaXMgbm93IHN0b3JlZCBpbiB0aGUgcGFyc2UKICAgICAgICAgICAgdHJlZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKCkgdGhyb3coc3BhbSxiYXIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIHN0b3JlZCBpbmZvcm1hdGlvbiBpcyBmdWxseSBjb3JyZWN0ZWQgZm9yIG5hbWVzcGFjZXMgYW5kIHdvcmtzCiAgICAgICAgICAgIHdpdGggdGVtcGxhdGVzLiAgVXNlcyB3aWxsIGZvbGxvdy4KICAgICAgICAgICAgCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaXMgbm8gbG9uZ2VyIGFwcGxpZWQgdG8gbWVtYmVyIGFjY2VzcwogICAgICAgICAgICBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCBpbiB0aGlzIGNvZGUKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgICB9IGNhdGNoKHdoYXRldmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGlzIG5vdCBhcHBsaWVkIHRvIGFjY2Vzc29yIGZ1bmN0aW9ucwogICAgICAgICAgICBmb3IgRm9vOjp4LiAgIFRoaXMgc2hvdWxkIHJlZHVjZSB0aGUgYW1vdW50IG9mIGV4dHJhIGNvZGUKICAgICAgICAgICAgZ2VuZXJhdGVkLgoKICAgICAgICAgICAgQ2F2ZWF0OiAgRXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgKmlzKiB1c2VkIHdoZW4gYXR0cmlidXRlcyBhcmUKICAgICAgICAgICAgYWNjZXNzZWQgdGhyb3VnaCBhIHNtYXJ0LXBvaW50ZXIgb3IgYSBzeW50aGVzaXplZCBhdHRyaWJ1dGVkCiAgICAgICAgICAgIGFkZGVkIHdpdGggJWV4dGVuZCBpcyB1c2VkLgoKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWRlIG1vcmUgcGF0Y2hlcyB0byBob3BlZnVsbHkgZWxpbWluYXRlIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIFNXSUcgCiAgICAgICAgICAgIGFzIGEgNjQtYml0IGV4ZWN1dGFibGUuCgowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggY29uc3QgcmVmZXJlbmNlIG1lbWJlcnMsIHZhcmlhYmxlcywgYW5kIHN0YXRpYyBtZW1iZXJzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50ICZyZWY7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyB0cnlpbmcgdG8gZ2VuZXJhdGUgInNldCIgZnVuY3Rpb25zIHdoaWNoIHdvdWxkbid0IGNvbXBpbGUuIAoKMDgvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2UgZm9yICJDbGFzcyBYIG1pZ2h0IGFic3RyYWN0IiBvZmYgYnkgZGVmYXVsdC4KICAgICAgICAgICAgRW5hYmxlIHdpdGggLVdhbGwuCgowOC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZWQgaGFuZGxpbmcgb2YgY29uc3QgYW5kIG5vbi1jb25zdCBvdmVybG9hZGVkIG1ldGhvZHMuICBJZgogICAgICAgICAgICBhIGNsYXNzIGRlZmluZXMgYSBtZXRob2QgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQpOwogICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50KSBjb25zdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZW4gdGhlIG5vbi1jb25zdCBtZXRob2QgaXMgKmFsd2F5cyogc2VsZWN0ZWQgaW4gb3ZlcmxvYWRpbmcgYW5kCiAgICAgICAgICAgIHRoZSBjb25zdCBtZXRob2Qgc2lsZW50bHkgZGlzY2FyZGVkLiAgSWYgcnVubmluZyB3aXRoIC1XYWxsLCBhIHdhcm5pbmcKICAgICAgICAgICAgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCjA4LzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQmV0dGVyIHN1cHBvcnQgZm9yIHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQgaW5oZXJpdGFuY2UuICAgQ29uc2lkZXIgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoaW50IHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJsYWgoZG91YmxlIHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBGb29CYXIgOiBwdWJsaWMgRm9vLCBwdWJsaWMgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJsYWgoY2hhciAqeCk7CiAgICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286OmJsYWg7CiAgICAgICAgICAgICAgICAgICAgICB1c2luZyBCYXI6OmJsYWg7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93IFNXSUcgd3JhcHMgRm9vQmFyOjpibGFoIGFzIGFuIG92ZXJsb2FkZWQgbWV0aG9kIHRoYXQgdXNlcyBhbGwKICAgICAgICAgICAgYWNjZXNzaWJsZSB2ZXJzaW9ucyBvZiBibGFoKCkuICBTZWUgc2VjdGlvbiAxNS4yLjIgaW4gU3Ryb3VzdHJ1cCwgM3JkIEVkLgoKICAgICAgICAgICAgU1dJRyBhbHNvIHN1cHBvcnRzIGFjY2VzcyBjaGFuZ2UgdGhyb3VnaCB1c2luZyBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoaW50IHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjp4OwogICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286OmJsYWg7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgIENhdmVhdDogICBTV0lHIGRvZXMgbm90IGFjdHVhbGx5IGNoZWNrIHRvIHNlZSBpZiBkZWNsYXJhdGlvbnMgaW1wb3J0ZWQKICAgICAgICAgICAgdmlhICd1c2luZycgYXJlIGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuICBJZiB0aGlzIG9jY3VycywgdGhlCiAgICAgICAgICAgIHdyYXBwZXIgY29kZSB3b24ndCBjb21waWxlIGFueXdheXMtLS1ub3Qgc3VyZSBpdCdzIHdvcnRoIHdvcnJ5aW5nIGFib3V0LgogICAgICAgICAgCjA4LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgb3ZlcmxvYWRpbmcgZGlzcGF0Y2ggdG8gbm90IGluY2x1ZGUgbm9kZXMgd2l0aCBhbiAiZXJyb3IiIGF0dHJpYnV0ZS4KICAgICAgICAgICAgQSBsYW5ndWFnZSBtb2R1bGUgY2FuIHNldCB0aGlzIGlmIGEgbm9kZSBjb3VsZG4ndCBiZSB3cmFwcGVkIGFuZCB5b3UgZG9uJ3Qgd2FudAogICAgICAgICAgICBpdCBpbmNsdWRlZCBpbiB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24uCgowOC8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50IHRvIG92ZXJsb2FkZWQgZnVuY3Rpb24gZGlzcGF0Y2guICAgVGhlIGRpc3BhdGNoZXIgaXMgbm93IGF3YXJlIG9mCiAgICAgICAgICAgIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28geyB9OwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKEZvbyAqZik7CiAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oQmFyICpiKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGRpc3BhdGNoZXIgcmUtb3JkZXJzIHRoZSBmdW5jdGlvbnMgc28gdGhhdCBzcGFtKEJhciAqYikgaXMKICAgICAgICAgICAgY2hlY2tlZCBmaXJzdC0tLWl0IGlzIG1vcmUgc3BlY2lmaWMgdGhhbiBzcGFtKEZvbyAqZikuCgowOC8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIC1XZXJyb3IgY29tbWFuZCBsaW5lIG9wdGlvbi4gICBJZiBzdXBwbGllZCwgd2FybmluZyBtZXNzYWdlcyBhcmUgdHJlYXRlZAogICAgICAgICAgICBhcyBlcnJvcnMgYW5kIFNXSUcgd2lsbCByZXR1cm4gYSBub24temVybyBleGl0IGNvZGUuCgowOC8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTk2MTM1IF0gVHlwZWRlZiBvZiByZWZlcmVuY2UgY2FuJ3QgY29tcGlsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAmSW50UmVmOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKEludFJlZiBpKTsKCiAgICAgICAgICAgIFNXSUctMS4zLjE0IGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZS4KClZlcnNpb24gMS4zLjE0IChBdWd1c3QgMTIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBTdGF0aWMgY29uc3QgbWVtYmVycyBpbml0aWFsaXplZCBkdXJpbmcgZGVjbGFyYXRpb24sIGFuZAoJICAgIG9ubHkgdGhlbSwgaWU6CgoJICAgIHN0cnVjdCBBCgkgICAgewkJIAoJCXN0YXRpYyBjb25zdCBpbnQgYSA9IDEgOyAgLy8gdGhpcyBvbmUKCQlzdGF0aWMgY29uc3QgaW50IGI7ICAgICAgIC8vIG5vdCB0aGlzIG9uZQogICAgICAgICAgICB9OyAgICAgCgoJICAgIGFyZSBlbWl0dGVkIGxpa2UgY29uc3RhbnRzIChlcXVpdmFsZW50IHRvIGVudW1zIG9yCgkgICAgZXhwbGljaXQgJWNvbnN0YW50KS4KCSAgICAKCSAgICBUaGlzIGlzIGJlY2F1c2UgdGhleSBjYW5ub3QgYmUgYWRkZWQgZGlyZWN0bHkgdG8gJ2N2YXInCgkgICAgc2luY2UgdGhleSBsYWNrIHRoZSBuZWVkZWQgcmVmZXJlbmNlICh3ZWxsLCB5b3UgY2FuIGZvcmNlCgkgICAgdGhlbSB0byBoYXZlIGEgcmVhbCByZWZlcmVuY2UsIGJ1dCBpbiBhbiB1Z2x5IHdheSB3aGljaAoJICAgIGdvZXMgY29tcGxldGVseSBhZ2FpbiB0aGUgb3JpZ2luYWwgcHVycG9zZSBvZiBpbml0aWFsaXplCgkgICAgdGhlbSBkdXJpbmcgZGVjbGFyYXRpb24sIHlvdSBhbHNvIGhhdmUgdG8gZGVhbCB3aXRoIGV4dHJhCgkgICAgbGlua2luZyBtYXR0ZXJzLCBhbmQgaXQgdGFrZSBhIHdoaWxlIHRvIGZpZ3VyZSBvdXQgd2hhdCBpcwoJICAgIHRoZSBwcm9ibGVtIGFuZCBob3cgdG8gc29sdmUgaXQpLgoJICAgIAoJICAgIFBsZWFzZSB0ZXN0IGl0IHdpdGggeW91ciBwcmVmZXJyZWQgdGFyZ2V0IGxhbmd1YWdlLCBhbmQKCSAgICBub3Qgb25seSB0aGUgY29kZSBnZW5lcmF0aW9uLCBidXQgcmVhbGx5IHJ1biB0aGUgZXhhbXBsZQoJICAgIGluIHRoZSB0ZXN0LXN1aXRlIChzdGF0aWMtY29uc3QtbWVtYmVyLTIuaSkgYmVjYXVzZSB0aGUKCSAgICBwcm9ibGVtIGFuZCB0aGUgc29sdXRpb24gY2Fubm90IGJlICJmdWxseSIgYXBwcmVjaWF0ZWQKCSAgICB1bnRpbCB5b3UgdHJ5IHRvIGxvYWQgdGhlIG1vZHVsZSBhbmQgcnVuIGl0LgoKCSAgICBJbiBzb21lIHRhcmdldCBsYW5ndWFnZXMgKHB5dGhvbiBzcGVjaWFsbHkpLCB0aGlzIGNhbgoJICAgIHByb2R1Y2VzIGEgZGlmZmVyZW5jZSBpbiB0aGUgd2F5IHRoYXQgdGhlIHN0YXRpYyBjb25zdGFudAoJICAgIG1lbWJlcnMgJ2EnIGFuZCAnYicgYXJlIGludGVybmFsbHkgd3JhcHBlZC4gSG9wZWZ1bGx5LAoJICAgIHRoZXkgc3RpbGwgY2FuIGJlIGFjY2Vzc2VkIGluIHRoZSBzYW1lIHdheS4KCgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBbcHl0aG9uXSBOb3cgc3RhdGljIGNvbnN0IG1lbWJlcnMgY2FuIGJlIGFjY2Vzc2VkIGluIGEgbW9yZQoJICAgIG5hdHVyYWwgd2F5LCBpZSwgaWYgeW91IGhhdmUKCgkgICAgc3RydWN0IEEKICAgICAgICAgICAgIHsJCSAKCQl0eXBlZGVmIHVuc2lnbmVkIGludCB2aWV3ZmxhZ3M7CgkJc3RhdGljIGNvbnN0IHZpZXdmbGFncyBmb3J3YXJkX2ZpZWxkID0gMDsKCQlzdGF0aWMgY29uc3Qgdmlld2ZsYWdzIGJhY2t3YXJkX2ZpZWxkOwogICAgICAgICAgICB9OyAgICAgCgkgICAgCgkgICAgbm93IHlvdSBjYW4gZG86CgoJCXByaW50IEEuYmFja3dhcmRfZmllbGQKCgkgICAgYW5kIGFsc28KCgkgICAgICAgIGEgPSBBKCkKCQlwcmludCBhLmZvcndhcmRfZmllbGQKCQkKCSAgICBOb3RlIHRoYXQgaWYgdGhlIHN0YXRpYyBjb25zdCBtZW1iZXJzIGRvbid0IGhhdmUgYW4KCSAgICBpbml0aWFsaXplciAobGlrZSBiYWNrd2FyZF9maWVsZCksIHN0aWxsIHlvdSBjYW4gYWNjZXNzCgkgICAgdGhlbSBpbiB0aGUgc2FtZSB3YXkgaW4gdGhlIHB5dGhvbiBzaWRlLCBidXQgdGhlCgkgICAgaW1wbGVtZW50YXRpb24gaXMgYSBxdWl0ZSBkaWZmZXJlbnQ6IGJhY2t3YXJkX2ZpZWxkIHdpbGwKCSAgICBzdGlsbCBhcHBlYXIgaW4gdGhlIGN2YXIgZW50aXR5LCBhbmQgYWxzbywgeW91IGFyZSAKCSAgICByZXNwb25zaWJsZSB0byBpbml0aWFsaXplIGl0IGluIHNvbWUgY29kZSB1bml0LCBhbmQgbGluayBpdAoJICAgIHByb3Blcmx5LiBmb3J3YXJkX2ZpZWxkLCBieSB0aGUgb3RoZXIgaGFuZCwgd2lsbCBub3QKCSAgICBhcHBlYXIgaW4gdGhlIGN2YXIgZW50aXR5IGJ1dCBvbmx5IGFzIGEgQSBtZW1iZXIsIHNpbWlsYXIKCSAgICB0byB3aGF0IGhhcHBlbiB3aXRoIGVudW0gb3IgJWNvbnN0YW50IG1lbWJlcnMuCgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBbcHl0aG9uXSBDb21tb24gY29kZSBpbiB0aGUgX19zZXRhdHRyX18vX19nZXRhdHRyX18gbm93CgkgICAgZ29lcyB0byB0d28gImZyZWUiIG1ldGhvZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJveHkKCSAgICBmaWxlLCBmcm9tIHdoZXJlIGVhY2ggY2xhc3MgdXNlIGl0LiBUaGlzIGNoYW5nZSByZWR1Y2VzCgkgICAgdGhlIHNpemUgb2YgdGhlIHByb3h5IGZpbGUsIHNwZWNpYWxseSBpZiB5b3Ugd3JhcCBhIGxvdCBvZgoJICAgIHNtYWxsIGNsYXNzZXMgaW4gb25lIG1vZHVsZSAodXAgdG8gMzMlIGluIHNvbWUgY2FzZXMpLAoJICAgIG1ha2luZyBpdCBmYXN0ZXIgdG8gbG9hZCB0b28uCgowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gSWYgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgY2hhciAqIHJldHVybnMgTlVMTCwKICAgICAgICAgICAgdW5kZWYgaXMgcmV0dXJuZWQgdG8gdGhlIFBlcmwgaW50ZXJwcmV0ZXIuCiAKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggdG8gY29udmVyc2lvbiBvcGVyYXRvcnMgYW5kIG5hbWVzcGFjZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBGb28geyB9OwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBCYXIgewogICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBGb28qKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoZSB3cmFwcGVyIGNvZGUsIFNXSUcgd2FzIHVzaW5nIC0+b3BlcmF0b3IgRm9vKigpCiAgICAgICAgICAgIHdoZW4gaXQgc2hvdWxkIGhhdmUgYmVlbiB1c2luZyAtPm9wZXJhdG9yIG5zOjpGb28qKCkuCgogICAgICAgICAgICBOb3RlOiBpZiB1c2luZyAlcmVuYW1lIHdpdGggYSBjb252ZXJzaW9uIG9wZXJhdG9yLCB5b3UKICAgICAgICAgICAgbWlnaHQgaGF2ZSB0byBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJXJlbmFtZSh0b0Zvb1B0cikgbnM6Om9wZXJhdG9yIG5zOjpGb28qKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBeXl5eIG5vdGUgZXh0cmEgcXVhbGlmaWVyCiAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICAKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBNaW5vciBlbmhhbmNlbWVudCB0byAnY29uc3QnIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4gCiAgICAgICAgICAgIE5vcm1hbGx5IGNvbnN0IGRlY2xhcmF0aW9ucyBhcmUgd3JhcHBlZCBhcyByZWFkLW9ubHkgdmFyaWFibGVzCiAgICAgICAgICAgIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIHRoZSBjdmFyIGF0dHJpYnV0ZSAoc2VlIFNXSUcuaHRtbCBmb3IKICAgICAgICAgICAgYSBkaXNjdXNzaW9uIG9mIHdoeSkuICBIb3dldmVyLCBpbiBtYW55IHByb2dyYW1zLCAiY29uc3QiIAogICAgICAgICAgICBkZWNsYXJhdGlvbnMgbWF5IGp1c3QgYmUgY29uc3RhbnRzLS0tbWFraW5nIHRoZSBjdmFyLiBhY2Nlc3MKICAgICAgICAgICAgYXdrd2FyZC4gIFRvIGZpeCB0aGlzLCAiY29uc3QiIGRlY2xhcmF0aW9ucyBhcmUgbm93IGF2YWlsYWJsZQogICAgICAgICAgICBib3RoIHRocm91Z2ggY3Zhci4gYW5kIGFzIGEgc2ltcGxlIG5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY29uc3QgaW50IEZPTyA9IDQyOwoKICAgICAgICAgICAgSW4gUHl0aG9uOgoKICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgZXhhbXBsZS5jdmFyLkZPTwogICAgICAgICAgICAgICAgIDQyCiAgICAgICAgICAgICAgICAgPj4+IHByaW50IGV4YW1wbGUuRk9PCiAgICAgICAgICAgICAgICAgNDIKCiAgICAgICAgICAgIE5vdGU6IFRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgdmFsdWUgb2YgYSAiY29uc3QiIHZhcmlhYmxlCiAgICAgICAgICAgIG1pZ2h0IGNoYW5nZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCBCQVIgPSAiSGVsbG8gV29ybGQiOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgcG9pbnRlciBpdHNlbGYgY2FuIG5vdCBjaGFuZ2UsIGJ1dCB0aGUgCiAgICAgICAgICAgIGRhdGEgYmVpbmcgcG9pbnRlZCB0byBjb3VsZCBiZSBtb2RpZmllZC4gIEluIHRoZXNlIHNpdHVhdGlvbnMsCiAgICAgICAgICAgIGN2YXIuQkFSIHNob3VsZCBiZSBhY2Nlc3NlZCB0byBvYnRhaW5lZCB0aGUgY3VycmVudCB2YWx1ZS4KCjA4LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZWQgZ2VuZXJhdGlvbiBvZiB0aGUgcHJveHkgY29kZSAoLnB5IGZpbGVzKSB0byBtb3JlCiAgICAgICAgICAgIGNsb3NlbHkgZm9sbG93IHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbnMgYXMgdGhleSBhcHBlYXIgaW4KICAgICAgICAgICAgdGhlIC5pIGZpbGUuICAgSW4gdGhlIHBhc3QsIGFsbCBvZiB0aGUgY2xhc3Mgd3JhcHBlcnMgYXBwZWFyZWQKICAgICAgICAgICAgZmlyc3QsIGZvbGxvd2VkIGJ5IGZ1bmN0aW9uIHN0dWJzLCBpbnNlcnRlZCBQeXRob24gY29kZSwgYW5kCiAgICAgICAgICAgIG90aGVyIGRldGFpbHMuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3h5IG1ldGhvZCBfZGVsZXRlKCkgY2hhbmdlZCB0byBkZWxldGUoKS4gVGhlcmUgc2hvdWxkbid0IGV2ZXIKICAgICAgICAgICAgYmUgYSB3cmFwcGVkIGZ1bmN0aW9uIGNhbGxlZCBkZWxldGUoKSBhcyBpdCBpcyBhIEMrKyBrZXl3b3JkIGFuZCB0aGVyZQogICAgICAgICAgICBpcyBubyBzdWNoIHRoaW5nIGFzIGEgbWVtYmVyIGZ1bmN0aW9uIGluIEMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgYWRkaW5nIHRoZSBmdW5jdGlvbiBiYWNrIGluCiAgICAgICAgICAgIGZvciBhbGwgcHJveHkgY2xhc3NlczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgcHVibGljIHZvaWQgX2RlbGV0ZSgpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIEphdmEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc3VtbWFyeQogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgaW4gaW1wcm92aW5nIHRoZSBKYXZhIG1vZHVsZSAKICAgICAgICAgICAgZm9yIHZlciAxLjMuMTQuICBJZiBhdCBhbGwgcG9zc2libGUgY2hhbmdlIHlvdXIgY29kZSB0byB0YWtlIGFkdmFudGFnZXMgb2YgdGhlIAogICAgICAgICAgICBpbXByb3ZlbWVudHMuIElmIHlvdSB3ZXJlIHVzaW5nIHByb3h5IGNsYXNzZXMgeW91IG1heSBub3Qgbm90aWNlIGFueSBiYWNrd2FyZHMgCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgaXNzdWVzLiBIZXJlIGlzIGFuIGV4YW1wbGUgd2hpY2ggd2lsbCBoZWxwIHdpdGggbW9zdCBiYWNrd2FyZHMgCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2hlcmUgaXQgaXMgbm90IHBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgY29kZSB0aGF0IHVzZXMKICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBvdXRwdXQ6CgogICAgICAgICAgICBSZXBsYWNlOgogICAgICAgICAgICAgICAgJW1vZHVsZSBtb2R1bGVuYW1lCgogICAgICAgICAgICBXaXRoOgogICAgICAgICAgICAgICAgJW1vZHVsZSAoam5pY2xhc3NuYW1lPSJtb2R1bGVuYW1lIikgbW9kdWxlbmFtZTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIkamF2YWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBfZGVsZXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgZGVsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICVwcmFnbWEoamF2YSkgam5pY2xhc3NjbGFzc21vZGlmaWVycz0icHVibGljIjsKCiAgICAgICAgICAgIFRoZSBwcm94eSBjb25zdHJ1Y3RvcnMgdGhhdCB0b29rIHBhcmFtZXRlcnMgKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKQogICAgICAgICAgICB3ZXJlIHB1YmxpYyBhbmQgYXJlIG5vdyBwcm90ZWN0ZWQuIElmIHlvdSB3ZXJlIG1ha2luZyB1c2Ugb2YgdGhlc2UgdGhlbiB5b3UnbGwgCiAgICAgICAgICAgIGhhdmUgdG8gbW9kaWZ5IHlvdXIgY29kZSBhbmQgdGhlIGJlc3Qgc29sdXRpb24gd291bGQgYmUgdG8gdXNlIHRoZSBuZXcgdHlwZSAKICAgICAgICAgICAgd3JhcHBlciBjbGFzc2VzLgoKICAgICAgICAgICAgVGhlIG90aGVyIG1haW4gYXJlYXMgYXJlIHRoZSBwcmFnbWFzIGFuZCBnbG9iYWwgdmFyaWFibGUgd3JhcHBpbmcuIFJlcGxhY2UgCiAgICAgICAgICAgIHRoZSBwcmFnbWFzIHdpdGggb25lIG9mIHRoZSBuZXcgZGlyZWN0aXZlcyBvciB0eXBlbWFwcyBtZW50aW9uZWQgYmVsb3cgYW5kIHVzZQogICAgICAgICAgICAlcmVuYW1lIG9uIHRoZSB2YXJpYWJsZXMuCgogICAgICAgICAgICBJZiB5b3Ugd2VyZSBub3QgdXNpbmcgcHJveHkgY2xhc3NlcywgeW91IHdpbGwgaGF2ZSB0byBkZWZpbmUgYSBqc3R5cGUgdHlwZW1hcAogICAgICAgICAgICBhcyB3ZWxsIGFzIGEganR5cGUgdHlwZW1hcC4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB3cmFwcGluZyB0d28gZGltZW5zaW9uIGFycmF5IHZhcmlhYmxlcy4KCjA4LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbixUY2xdCiAgICAgICAgICAgIE9iamVjdCBtYW5hZ2VtZW50IG5vdyBoYXMgYSBtdWNoIGJldHRlciBzZW5zZSBvZiBvd25lcnNoaXAuCiAgICAgICAgICAgIE93bmVyc2hpcCBiaXRzIGlzIGNoYW5nZWQgd2hlbmV2ZXIgYW4gb2JqZWN0IGlzIHN0b3JlZCBpbiBhCiAgICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZSBvciBzdHJ1Y3R1cmUgbWVtYmVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgaW50IHZhbDsKICAgICAgICAgICAgICAgICAgICBGb28gKm5leHQ7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93IGluIFB5dGhvbgoKICAgICAgICAgICAgICAgPj4+IGYgPSBGb28oKQogICAgICAgICAgICAgICA+Pj4gZi50aGlzb3duCiAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgPj4+IGcgPSBGb28oKQogICAgICAgICAgICAgICA+Pj4gZy5uZXh0ID0gZiAgICAgICAgICAjIEFzc2lnbiBhIHBvaW50ZXIKICAgICAgICAgICAgICAgPj4+IGYudGhpc293biAgICAgICAgICAgIyBOb3RpY2Ugb3duZXJzaGlwIGNoYW5nZQogICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgID4+PgoKICAgICAgICAgICAgVGhpcyBzY2hlbWUgaXMgbW9zdGx5IGEgY29uc2VydmF0aXZlIGhldXJpc3RpYyBkZXNpZ25lZCB0byAKICAgICAgICAgICAgcHJvdmlkZSBzZWdtZW50YXRpb24gZmF1bHRzLiAgSXQgY291bGQgY2F1c2UgYSBtZW1vcnkgbGVhawogICAgICAgICAgICBpZiBvd25lcnNoaXAgaXMgY2hhbmdlZCB1bm5lY2Vzc2FyaWx5LiAgSW4gdGhpcyBjYXNlLCB5b3UgY2FuCiAgICAgICAgICAgIGVpdGhlciB3cml0ZSBhIHR5cGVtYXAgKHRoYXQgZG9lc24ndCBjaGFuZ2Ugb3duZXJzaGlwKSwgb3IKICAgICAgICAgICAgbWFudWFsbHkgc2V0IHRoZSB0aGlzb3duIGF0dHJpYnV0ZSBiYWNrIHRvIDEuCgowOC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIE1ham9yIHVzYWJpbGl0eSBpbXByb3ZlbWVudHMgdG8gdGhlIG9iamVjdCBpbnRlcmZhY2UuCiAgICAgICAgICAgIFN1cHBvc2UgeW91IGhhZCBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7IAogICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW0oKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICB2b2lkICBibGFoKEZvbyAqZik7CgogICAgICAgICAgICBJbiBwYXN0IHZlcnNpb25zIG9mIFNXSUcsIHlvdSBjb3VsZCBjcmVhdGUgb2JqZWN0cyBhbmQgdXNlCiAgICAgICAgICAgIHRoZW0gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICUgRm9vIGYKICAgICAgICAgICAgICAgICUgZiBjb25maWd1cmUgLXggMwogICAgICAgICAgICAgICAgJSBmIHNwYW0KICAgICAgICAgICAgICAgIDM3CiAgICAKICAgICAgICAgICAgVGhlIG9ubHkgcHJvYmxlbSBpcyB0aGF0IGlmIHlvdSB0cmllZCB0byBjYWxsIGJsYWgoKSwgaXQgZGlkbid0CiAgICAgICAgICAgIHdvcms6CgogICAgICAgICAgICAgICAgJSBibGFoIGYKICAgICAgICAgICAgICAgIFR5cGUgRXJyb3IuIEV4cGVjdGVkIF9wX0ZvbwogICAgICAgICAgICAgICAgJQoKICAgICAgICAgICAgSW5zdGVhZCwgeW91IGhhZCB0byBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICUgYmxhaCBbZiBjZ2V0IC10aGlzXQogIAogICAgICAgICAgICBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGV4dHJhY3RzIHRoZSAtdGhpcyBwb2ludGVyLCBhdm9pZGluZyB0aGlzCiAgICAgICAgICAgIHByb2JsZW0uICBUaGlzIG1lYW5zIHRoYXQgc2F5aW5nICJibGFoIGYiIGlzIHBlcmZlY3RseSBsZWdhbCBhbmQKICAgICAgICAgICAgZXZlcnl0aGluZyB3aWxsIHN0aWxsIHdvcmsgbm9ybWFsbHkuCgogICAgICAgICAgICBDYXZlYXQ6IFNpbmNlIHBvaW50ZXIgc3RyaW5ncyBzdGFydCB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlIChfKSwKICAgICAgICAgICAgZG9uJ3QgdXNlIHRoaXMgaW4gb2JqZWN0IG5hbWVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJSBGb28gX2YgCiAgICAgICAgICAgICAgICAlIGJsYWggX2YgICAgICAgICMgUG90ZW50aWFsIGNyYXNoCgogICAgICAgICAgICBPYmplY3RzIG5vdyBoYXZlIGEgLXRoaXNvd24gYXR0cmlidXRlIHRoYXQgc2hvd3MgdGhlIG93bmVyc2hpcC4KICAgICAgICAgICAgVGhpcyBidWlsZHMgdXBvbiB0aGUgQ0hBTkdFUyAxMS8yNC8yMDAxIGVudHJ5LgoKMDgvMDcvMjAwMjogc2FtamFtLCBTYW0gTGlkZGljb3R0CiAgICAgICAgICAgIFByb3Blcmx5IGltcGxlbWVudGVkIHBvaW50ZXIgc3lzdGVtIHVzaW5nIHBocCByZXNvdXJjZXMuCiAgICAgICAgICAgIFN0aWxsIG5lZWQgdG8gd29yayBvdXQgd2hldGhlciBvciBub3QgdG8gbGV0IHNjcmlwdC11c2VycyBjYWxsCiAgICAgICAgICAgIGRlc3RydWN0b3JzIGRpcmVjdGx5CgowOC8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVwZ3JhZGVkIG16c2NoZW1lIG1vZHVsZSB0byBzdXBwb3J0IHZlcnNpb24gMjAxIGFuZCBhZGRlZAogICAgICAgICAgICBvdmVybG9hZGluZyBzdXBwb3J0LgoKMDgvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIGV4dHJhIGdyb3VwaW5nIChpbiB2ZXJ5IGxpbWl0ZWQgY2FzZXMpLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKEZ1bmNQdHIpKGludCwgZG91YmxlKTsKCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgKioqCiAgICAgICAgICAgIAowOC8wMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVXBkYXRlcyB0byB0eXBlbWFwcy5pIGFzIHRob3NlIGRvbmUgcHJldmlvdXNseSBmb3IgUGVybCwKICAgICAgICAgICAgUHl0aG9uIGFuZCBUY2wgbW9kdWxlcy4gTm93IHN1cHBvcnRzIHJlZmVyZW5jZSB0eXBlcyB3aXRoIElOUFVULAogICAgICAgICAgICBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzLgoKMDgvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlIGNzdHJpbmcuaSBhZGRlZC4gIFByb3ZpZGVzIG1hY3JvcyBmb3IKICAgICAgICAgICAgbWFuaXB1bGF0aW5nIGNoYXIgKiBkYXRhLgogCjA4LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJW5ldyBkaXJlY3RpdmUuICBVc2UgJW5ld29iamVjdCBpbnN0ZWFkLiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlbmV3b2JqZWN0IGZvbzsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIGNoYXIgKmZvbygpOwoKICAgICAgICAgICAgJW5ld29iamVjdCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLAogICAgICAgICAgICBldGMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA4LzAxLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IGF0dHJpYnV0ZSAnam5pY2xhc3NuYW1lJyBmb3IgdGhlIG1vZHVsZSBkaXJlY3RpdmUgYWxsb3dzIGEgd2F5IG9mCiAgICAgICAgICAgIGNoYW5naW5nIHRoZSBKTkkgY2xhc3MgbmFtZSBmcm9tIHRoZSBkZWZhdWx0IHdoaWNoIHVzZXMgdGhlIG1vZHVsZW5hbWUgd2l0aCBKTkkKICAgICAgICAgICAgYXBwZW5kZWQgYWZ0ZXIgaXQuCgogICAgICAgICAgICAgICAgJW1vZHVsZSAoam5pY2xhc3NuYW1lPSJuYW1lIikgbW9kdWxlbmFtZQoKICAgICAgICAgICAgSWYgJ25hbWUnIGlzIHRoZSBzYW1lIGFzICdtb2R1bGVuYW1lJyB0aGVuIHRoZSBtb2R1bGUgY2xhc3MgbmFtZSBnZXRzIGNoYW5nZWQKICAgICAgICAgICAgZnJvbSAnbW9kdWxlbmFtZScgdG8gbW9kdWxlbmFtZU1vZHVsZS4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGZpbGUgaW5jbHVkZSBvcmRlci4gIExhbmd1YWdlIHNwZWNpZmljCiAgICAgICAgICAgIGRpcmVjdG9yaWVzIHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBnZW5lcmljIGRpcmVjdG9yaWVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZTogICJzd2lnX2xpYi9weXRob24vZm9vLmkiIHNob3VsZCBiZSBsb2FkZWQgYmVmb3JlCiAgICAgICAgICAgICJzd2lnX2xpYi9mb28uaSIuICAgIEkgdGhvdWdodCB0aGlzIHdhcyB0aGUgY2FzZSBhbHJlYWR5LCBidXQKICAgICAgICAgICAgYXBwYXJlbnRseSBpdCBoYXMgYmVlbiBicm9rZW4gZm9yIHF1aXRlIHNvbWUgdGltZS4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3RkX2RlcXVlLmkgbGlicmFyeSBmaWxlLiAgV29yayBpbiBwcm9ncmVzcy4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbixUY2wsUGVybF0KICAgICAgICAgICAgSW1wcm92ZW1lbnRzIHRvIHR5cGVtYXBzLmkuICBJTlBVVC9JTk9VVCB0eXBlbWFwcyBwZXJmb3JtIGJldHRlcgogICAgICAgICAgICBlcnJvciBjaGVja2luZy4gIFR5cGVtYXBzIGFyZSBub3cgc3VwcGxpZWQgZm9yIHJlZmVyZW5jZXMgbGlrZSAKICAgICAgICAgICAgaW50ICZPVVRQVVQsIGRvdWJsZSAmSU5PVVQsIGV0Yy4KICAgICAgICAgIAowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIERlcHJlY2F0ZWQgdGhlIFRfKiBhbmQgTF8qIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkuCiAgICAgICAgICAgIE11bHRpcGxlIHJldHVybiB2YWx1ZXMgYXJlIGFsd2F5cyBwbGFjZWQgaW4gYSB0dXBsZS4gRGVwcmVjYXRlZAogICAgICAgICAgICB0aGUgQk9USCB0eXBlbWFwcy4gIFRoaXMgaXMgbm93IElOT1VUIChlLmcuLCBpbnQgKklOT1VUKS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSBhcnJheS5pLCBjYXJyYXkuaSwgYW5kIHRpbWVyLmkgbGlicmFyeSBmaWxlcy4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgcG9pbnRlci5pIGxpYnJhcnkgZmlsZS4gIFVzZSBjcG9pbnRlci5pIGluc3RlYWQuCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAKMDgvMDEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGb3IgY29uc2lzdGVuY3kgdGhlIGdsb2JhbCB2YXJpYWJsZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHVzZSB0aGUgSmF2YUJlYW4gCiAgICAgICAgICAgIHByb3BlcnR5IGRlc2lnbiBwYXR0ZXJuIGxpa2UgbWVtYmVyIHZhcmlhYmxlcyBhbHdheXMgaGF2ZS4gVGhpcyBtZWFucyBpZiB5b3UgYXJlIAogICAgICAgICAgICB3cmFwcGluZyBhIHZhcmlhYmxlIGNhbGxlZCBmb28sIHRoZSBnZXR0ZXIgaXMgY2FsbGVkIGdldEZvbygpIGFuZCB0aGUgc2V0dGVyIGlzIAogICAgICAgICAgICBjYWxsZWQgc2V0Rm9vKCkuIEJlZm9yZSB0aGUgcmVjZW50IGNoYW5nZXMgdG8gdGhlIEphdmEgbW9kdWxlIHRoZSBnZXR0ZXJzIGFuZCAKICAgICAgICAgICAgc2V0dGVycyB3ZXJlIGNhbGxlZCBnZXRfZm9vKCkgYW5kIHNldF9mb28oKS4gSWYgeW91IHJlYWxseSB3YW50IHRoZSBvcmlnaW5hbCAKICAgICAgICAgICAgZnVuY3Rpb24gbmFtZXMgdXNlIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBsaWtlIHRoaXM6ICVyZW5hbWUoX2ZvbykgRm9vOwoKMDcvMzEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBjYXN0aW5nIHByb2JsZW0gd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gIElmIHlvdSBoYWQgdGhpcywKCiAgICAgICAgICAgICAgICAgIGNsYXNzIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3MgYmFyIDogcHVibGljIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3MgYmF6IDogcHVibGljIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3Mgc3BhbSA6IHB1YmxpYyBiYXIsIHB1YmxpYyBiYXoge307CgogICAgICAgICAgICB0aGVuIHRoZSB3cmFwcGVycyB3b3VsZG4ndCBjb21waWxlIGR1ZSB0byBhbiBhbWJpZ3VvdXMgY2FzdC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQXJ0IFllcmtlcy4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRHVlIHRvIG5ldyBzdGF0aWMgdHlwZWNoZWNraW5nIGFsbCBwb2ludGVycyBoZWxkIGluIGEgSmF2YSBsb25nIGFyZSBwYXJ0IG9mIAogICAgICAgICAgICB0aGUgaW50ZXJuYWwgd29ya2luZ3MgYW5kIHRoaXMgcG9pbnRlciB2YWx1ZSBpbiB0aGUgSmF2YSBsb25nIGhhcyBiZWNvbWUgYWJzdHJhY3RlZAogICAgICAgICAgICBkYXRhLiBUaGUgdHlwZSB3cmFwcGVyIGNvbnN0cnVjdG9yIGFuZCBnZXRDUHRyKCkgbWV0aG9kcyBhcmUgYXMgc3VjaCBwcm90ZWN0ZWQuCiAgICAgICAgICAgIElmIHlvdSBuZWVkIHRvIG1lc3MgYXJvdW5kIHdpdGggcG9pbnRlcnMgZnJvbSBKYXZhIG9yIGZvciBleGFtcGxlIGNyZWF0ZSBhIHByb3h5IAogICAgICAgICAgICBjbGFzcyBvciB0eXBlIHdyYXBwZXIgY2xhc3MgYXJvdW5kIGEgbnVsbCBwb2ludGVyLCBhZGQgYSBmdW5jdGlvbi9jb25zdHJ1Y3RvciAKICAgICAgICAgICAgdG8gZG8gc28gd2l0aCB0aGUgJWphdmFjb2RlIHR5cGVtYXAuIFlvdSBjYW4gYWxzbyBtYWtlIGdldENQdHIoKSBwdWJsaWMgYWdhaW4gd2l0aAogICAgICAgICAgICB0aGUgJWphdmFnZXRjcHRyIHR5cGVtYXAuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVzIGZvciAldHlwZW1hcChpZ25vcmUpLiBJbiBwYXJ0aWN1bGFyIHdoZW4gaWdub3JpbmcgdGhlIGxhc3QgcGFyYW1ldGVyCiAgICAgICAgICAgIGluIGEgZnVuY3Rpb24uIEFsc28gZm9yIGFsbCBwYXJhbWV0ZXJzIGluIGNvbnN0cnVjdG9ycy4gVGhlc2UgbW9kcyBoYXZlIGFsc28gZml4ZWQKICAgICAgICAgICAgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMgZm9yIHByb3h5IGNsYXNzZXMgLSBTRiA1ODE3OTEuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdICVuZXdvYmplY3QgKHJlcGxhY2VtZW50IGZvciAlbmV3KSBub3cgaW1wbGVtZW50ZWQgZm9yIEphdmEuIAoKMDcvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZW1hcCBjb3BpZXMsICVhcHBseSwgYW5kICVjbGVhciBpbnNpZGUKICAgICAgICAgICAgQysrIG5hbWVzcGFjZXMuCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBKTkkgY2xhc3Mgbm93IGhhcyBwYWNrYWdlIGFjY2VzcyBhcyB0aGUgY2xhc3MgbW9kaWZpZXIKICAgICAgICAgICAgaGFzIGJlZW4gY2hhbmdlZCBmcm9tICJwdWJsaWMiIHRvIG5vdGhpbmcuIFRoaXMgaGFzIGJlZW4gZG9uZQogICAgICAgICAgICBhcyB0aGlzIGNsYXNzIGlzIG5vdyBtb3JlIGZvciB0aGUgaW50ZXJuYWwgd29ya2luZ3Mgb2YgU1dJRyBzaW5jZSB0aGUgbW9kdWxlCiAgICAgICAgICAgIGNsYXNzIGhhcyBzdGF0aWMgdHlwZSBjaGVja2luZyBmb3IgYWxsIHR5cGVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSAlam5pY2xhc3NjbGFzc21vZGlmaWVyIAogICAgICAgICAgICBwcmFnbWEgdG8gY2hhbmdlIGl0IGJhY2sgdG8gInB1YmxpYyIuCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3h5L1NoYWRvdyBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQgYnkgZGVmYXVsdC4gVGhlIC1wcm94eSBhbmQgCiAgICAgICAgICAgIC1zaGFkb3cgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIGRlcHJlY2F0ZWQuIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgCiAgICAgICAgICAgIGxvdy1sZXZlbCBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGVuIHVzZSB0aGUgbmV3IC1ub3Byb3h5IGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUmVtYWluaW5nIHByYWdtYXMgc2hha2V1cC4gVGhlc2Ugd2VyZSB0aGUgcmVtYWluaW5nIHByYWdtYXMgYW5kIHRoZWlyCiAgICAgICAgICAgIG5ldyBuYW1lcyB3aGVyZSBjaGFuZ2VkOgoKICAgICAgICAgICAgbW9kdWxlYmFzZQogICAgICAgICAgICBtb2R1bGVjb2RlCiAgICAgICAgICAgIG1vZHVsZWNsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIG1vZHVsZWltcG9ydCA9PiBtb2R1bGVpbXBvcnRzCiAgICAgICAgICAgIG1vZHVsZWludGVyZmFjZSA9PiBtb2R1bGVpbnRlcmZhY2VzCgogICAgICAgICAgICBUaGUgbW9kdWxlaW1wb3J0cyB3b3JrcyBzbGlnaHRseSBkaWZmZXJlbnRseSB0byBob3cgdGhlIG1vZHVsZWltcG9ydCBwcmFnbWEgd29ya2VkLiAKICAgICAgICAgICAgTm93IGl0IGFjdHVhbGx5IHRha2VzIGNvZGUgd2hpY2ggZ2V0cyBwbGFjZWQgYmVmb3JlIHRoZSBjbGFzcyBkZWZpbml0aW9uIHNvIHRoZSAKICAgICAgICAgICAgd2hvbGUgaW1wb3J0IHN0YXRlbWVudCBoYXMgdG8gYmUgZ2l2ZW4sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBtb2R1bGVpbXBvcnRzPSV7CiAgICAgICAgICAgIGltcG9ydCBqYXZhLmlvLio7CiAgICAgICAgICAgIGltcG9ydCBqYXZhLm1hdGguKjsKICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBtb2R1bGVpbnRlcmZhY2VzIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byB0aGUgb2xkIG1vZHVsZWludGVyZmFjZSBpbiB0aGF0IGlmIAogICAgICAgICAgICBtb3JlIHRoYW4gb25lIGludGVyZmFjZSBpcyByZXF1aXJlZCB0aGV5IG11c3QgYmUgY29tbWEgc2VwYXJhdGVkIGluIG9uZSB1c2Ugb2YgCiAgICAgICAgICAgIHRoZSBwcmFnbWEsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBtb2R1bGVpbnRlcmZhY2VzPSJTZXJpYWxpemFibGUsIE15SW50ZXJmYWNlIgoKICAgICAgICAgICAgVGhlc2UgbGFzdCB0d28gcHJhZ21hcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBqYXZhaW50ZXJmYWNlcyBhbmQgamF2YWltcG9ydHMgCiAgICAgICAgICAgIHR5cGVtYXAuCgogICAgICAgICAgICBBIHNpbWlsYXIgc2V0IG9mIHByYWdtYXMgaGFzIGJlZW4gaW50cm9kdWNlZCwgbmFtZWx5OgoKICAgICAgICAgICAgam5pY2xhc3NiYXNlCiAgICAgICAgICAgIGpuaWNsYXNzY29kZQogICAgICAgICAgICBqbmljbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGpuaWNsYXNzaW1wb3J0CiAgICAgICAgICAgIGpuaWNsYXNzaW50ZXJmYWNlCgogICAgICAgICAgICBUaGVzZSB3b3JrIGluIHRoZSBzYW1lIHdheSBhcyB0aGVpciBtb2R1bGUgY291bnRlcnBhcnRzLiBOb3RlIHRoYXQgcHJldmlvdXNseQogICAgICAgICAgICB0aGUgbW9kdWxlWFhYIHByYWdtYXMgd29ya2VkIG9uIHRoZSBvbGQgbW9kdWxlIGNsYXNzIHdoaWNoIGlzIG5vdyBjYWxsZWQgdGhlCiAgICAgICAgICAgIEpOSSBjbGFzcyAodGhlIGNsYXNzIHdpdGggdGhlIG5hdGl2ZSBmdW5jdGlvbnMpLiBUaGUgam5pY2xhc3NYWFggcHJhZ21hcyBub3cgCiAgICAgICAgICAgIHdvcmsgb24gdGhlIG5ldyBtb2R1bGUgY2xhc3MgKHRoZSBjbGFzcyB0aGF0IGhhcyBhbGwgdGhlIGdsb2JhbCBmdW5jdGlvbnMgYW5kCiAgICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdoZW4gdXNpbmcgcHJveHkgY2xhc3NlcywgcGx1cyBhbGwgb3RoZXIKICAgICAgICAgICAgcmVtYWluaW5nIGZ1bmN0aW9ucyB3aGVuIHVzaW5nIHRoZSBsb3ctbGV2ZWwgcHJvY2VkdXJhbCBpbnRlcmZhY2UpLgoKICAgICAgICAgICAgSW4gc3VtbWFyeSB0aGUgY29udGVudHMgb2YgdGhlIHByYWdtYXMgbWFrZSB1cCBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgIDxqbmljbGFzc2ltcG9ydHM+CiAgICAgICAgICAgIDxqbmljbGFzc21vZGlmaWVycz4gY2xhc3MgbW9kdWxlbmFtZSBleHRlbmRzIDxqbmljbGFzc2Jhc2U+IGltcGxlbWVudHMgPGpuaWNsYXNzaW50ZXJmYWNlcz4gewogICAgICAgICAgICAgICAgPGpuaWNsYXNzY29kZT4KICAgICAgICAgICAgICAgIC4uLiBTV0lHIGdlbmVyYXRlZCBmdW5jdGlvbnMgLi4uCiAgICAgICAgICAgIH0KfQogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERlcHJlY2F0ZWQgbW9kdWxlbWV0aG9kbW9kaWZpZXJzIHByYWdtYSBhbmQgcmVwbGFjZWQgd2l0aCAKICAgICAgICAgICAgYSBiZXR0ZXIgJWZlYXR1cmUgYmFzZWQgZGlyZWN0aXZlIGNhbGxlZCAlamF2YW1ldGhvZG1vZGlmaWVycy4KICAgICAgICAgICAgQSB1c2VmdWwgZXhhbXBsZSB3b3VsZCBiZSBmb3Igc3luY2hyb25pc2F0aW9uIGluIG11bHRpLXRocmVhZGVkIGFwcHM6CgogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyBmb28oaW50IGEpICJwdWJsaWMgc3luY2hyb25pemVkIjsKCiAgICAgICAgICAgIENoYW5nZXMgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBkZWZhdWx0ICgicHVibGljIikgdG8gInB1YmxpYyBzeW5jaHJvbml6ZWQiLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBTZXZlcmFsIGRpcmVjdGl2ZXMgbm93IGFsbG93IG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KICAgICAgICAgICAgVGhlc2UgaW5jbHVkZToKCiAgICAgICAgICAgICAgICAlbW9kdWxlKG5hbWU9InZhbHVlIiwgbmFtZT0idmFsdWUiLCAuLi4pIG1vZHVsZW5hbWUKICAgICAgICAgICAgICAgICVpbXBvcnQobmFtZT0idmFsdWUiLCAuLi4pICJmaWxlbmFtZS5pIgogICAgICAgICAgICAgICAgJWV4dGVuZChuYW1lPSJ2YWx1ZSIsIC4uLikgY2xhc3NuYW1lIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlc2UgY3VycmVudGx5IGhhdmUgbm8gZWZmZWN0IGFuZCBhcmUgcmVzZXJ2ZWQgZm9yCiAgICAgICAgICAgIGZ1dHVyZSBleHBhbnNpb24uCiAgICAgICAgICAgICAgIAowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50cyB0byBzbWFydC1wb2ludGVyIGhhbmRsaW5nLiAgU1dJRyBvbmx5IHByb3ZpZGVzCiAgICAgICAgICAgIGV4dHJhIHN1cHBvcnQgZm9yIGEgc21hcnQtcG9pbnRlciBpZiBvcGVyYXRvci0+KCkgcmV0dXJucwogICAgICAgICAgICBhIHByb3BlciBwb2ludGVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwoKICAgICAgICAgICAgSWYgb3BlcmF0b3ItPigpIHJldHVybnMgYW4gb2JqZWN0IGJ5IHZhbHVlIG9yIHJlZmVyZW5jZSwKICAgICAgICAgICAgdGhlbiBTV0lHIGV4YW1pbmVzIHRoZSByZXR1cm5lZCBvYmplY3QgdG8gc2VlIGlmIGl0IGFsc28KICAgICAgICAgICAgaW1wbGVtZW50cyBvcGVyYXRvci0+KCkuICBJZiBzbywgU1dJRyBjaGFzZXMgb3BlcmF0b3ItPigpCiAgICAgICAgICAgIHVudGlsIGl0IGNhbiBmaW5kIG9uZSB0aGF0IHJldHVybnMgYSBwb2ludGVyLiAgVGhpcyBhbGxvd3MKICAgICAgICAgICAgY2FzZXMgbGlrZSB0aGlzIHRvIHdvcms6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBCYXIgb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICA+Pj4gcyA9IFNwYW0oKQogICAgICAgICAgICAgICAgID4+PiBzLmJsYWgoKSAgICAgICMgSW52b2tlcyBGb286OmJsYWgoKQoKICAgICAgICAgICAgVGhlIHMuYmxhaCgpIGNhbGwgYWN0dWFsbHkgaW52b2tlczoKCiAgICAgICAgICAgICAgICAgICgocy5vcGVyYXRvci0+KCkpLm9wZXJhdG9yLT4oKSktPmJsYWgoKTsKIAowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggdHlwZWRlZiBhbmQgcmVmZXJlbmNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyAmIEZvb1JlZjsKICAgICAgICAgICAgICAgICBGb29SZWYgYmxhaCgpOwoKICAgICAgICAgICAgUHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRyBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0CiAgICAgICAgICAgIGNvbXBpbGUuCgowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFdyYXBwaW5nIG9mIHN0YXRpYyBtZXRob2RzIGhhcyBiZWVuIGltcHJvdmVkIGluIHByb3h5IGNsYXNzZXMuICBJbiBvbGRlcgogICAgICAgICAgICB2ZXJzaW9ucyBvZiBTV0lHLCBpZiB5b3UgaGFkIHRoaXM6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkIGJhcigpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIHN0YXRpYyBtZXRob2Qgd2FzIG9ubHkgYXZhaWxhYmxlIGFzIGEgZnVuY3Rpb24gRm9vX2JhcigpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICA+Pj4gRm9vX2JhcigpCgogICAgICAgICAgICBOb3csIHRoZSBzdGF0aWMgbWV0aG9kIGNhbiBhbHNvIGJlIGludm9rZWQgdGhyb3VnaCBhbiBpbnN0YW5jZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICA+Pj4gZiA9IEZvbygpCiAgICAgICAgICAgICAgICAgID4+PiBmLmJhcigpICAgICAgICAjIEludm9rZXMgc3RhdGljIG1ldGhvZAoKICAgICAgICAgICAgVGhpcyB3b3JrcyB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBQeXRob24uICBBZGRpdGlvbmFsbHksIGZvciBQeXRob24tMi4yLAogICAgICAgICAgICB0aGUgc3RhdGljIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBhczoKCiAgICAgICAgICAgICAgICAgID4+PiBGb28uYmFyKCkKCiAgICAgICAgICAgIFRoZSBvbGQtc3R5bGUgZnVuY3Rpb24gaXMgc3RpbGwgc3VwcG9ydCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIElmCiAgICAgICAgICAgIHlvdSBjYXJlIGFib3V0IG1ha2luZyB5b3VyIGNvZGUgYWNyb3NzIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBQeXRob24sCiAgICAgICAgICAgIGVpdGhlciB1c2UgRm9vX2JhcigpIG9yIGFjY2VzcyB0aGUgbWV0aG9kIHRocm91Z2ggYW4gaW5zdGFuY2UuCiAKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSBQeXRob24gbW9kdWxlLiAgUHJveHkgY2xhc3NlcyBub3cgdXRpbGl6ZSBuZXcgUHl0aG9uLTIuMgogICAgICAgICAgICBmZWF0dXJlcyBpbmNsdWRpbmcgcHJvcGVydGllcyBhbmQgc3RhdGljIG1ldGhvZHMuICBIb3dldmVyLCB0aGVzZSBmZWF0dXJlcwogICAgICAgICAgICBhcmUgc3VwcG9ydGVkIGluIGEgd2F5IHRoYXQgcHJvdmlkZXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlcgogICAgICAgICAgICBQeXRob24gdmVyc2lvbnMuICBJbiBvdGhlciB3b3JkcywgcHJveHkgY2xhc3NlcyB3b3JrIHdpdGggYWxsIHZlcnNpb25zCiAgICAgICAgICAgIG9mIFB5dGhvbiBhbmQgb25seSB1c2UgbmV3IGZlYXR1cmVzIHdoZW4gcnVubmluZyBvbiBQeXRob24tMi4yLgoKCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgJWV4dGVuZCBzbyB0aGF0IG92ZXJsb2FkZWQgbWV0aG9kcyBjYW4gYmUgYWRkZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZXh0ZW5kIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCB4KSB7IH07CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKnMpIHsgfTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIHdvcmtzIHdpdGggYm90aCBDKysgKmFuZCogQy4KCjA3LzI0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTW9yZSBuZXcgdHlwZW1hcHMgc28gdGhhdCB0aGUgSmF2YSBwcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcwogICAgICAgICAgICBjYW4gYmUgZnVydGhlciB0YWlsb3JlZCBieSB1c2Vycy4gVGhlc2UgYXJlIHRoZSBkZWZhdWx0IGNvZGUgZm9yIGdlbmVyYXRpbmcgdGhlIAogICAgICAgICAgICBmaW5hbGl6ZSgpIG1ldGhvZHMgKHByb3h5IGNsYXNzZXMgb25seSkgYW5kIHRoZSBnZXRDUHRyKCkgbWV0aG9kcyBmb3IgcHJveHkgCiAgICAgICAgICAgIGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWZpbmFsaXplKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewogICAgICAgICAgICAgICAgX2RlbGV0ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KICAgICAgICAgICAgCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFnZXRjcHRyKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gJXsKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGphdmFnZXRjcHRyIHR5cGVtYXAgd2lsbCBlbmFibGUgdXNlcnMgdG8gaGFuZGxlIEphdmEgbnVsbCBieSBvdmVycmlkaW5nCiAgICAgICAgICAgIHRoaXMgdHlwZW1hcCAtIGEgcmVxdWVzdGVkIGZlYXR1cmUuCgogICAgICAgICAgICBUaGUgLW5vZmluYWxpemUgY29tbWFuZGxpbmUgb3B0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFRoZSBqYXZhZmluYWxpemUKICAgICAgICAgICAgdHlwZW1hcCBpcyBtb3JlIHBvd2VyZnVsIGFzIGl0IHdpbGwgYWxsb3cgdGhlIHJlbW92YWwgb2YgdGhlIGZpbmFsaXplIG1ldGhvZHMgCiAgICAgICAgICAgIGZvciBhbGwgb3IgYW55IG9uZSBvciBtb3JlIHBhcnRpY3VsYXIgcHJveHkgY2xhc3MuCgowNy8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBnZXRDUHRyWFhYKCkgZnVuY3Rpb24gaGFzIGJlZW4gY2hhbmdlZCB0byBhIHN0YXRpYyBmdW5jdGlvbiBhbmQKICAgICAgICAgICAgaXMgbm93IG9mIHRoZSBmb3JtOgoKICAgICAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGdldENQdHIoWFhYIG9iaikgey4uLn0KCiAgICAgICAgICAgIFRoaXMgaXMgYSByZXF1ZXN0ZWQgY2hhbmdlIHdoaWNoIHdpbGwgYWxsb3cgSmF2YSBudWxsIHBvaW50ZXJzIHRvIGJlIHVzZWQgYXMgbnVsbAogICAgICAgICAgICBjYW4gYmUgcGFzc2VkIGluIGZvciBvYmouIEhvd2V2ZXIsIHRvIGFjaGlldmUgdGhpcyB0aGUgYXBwcm9wcmlhdGUgY29kZSBtdXN0IGJlCiAgICAgICAgICAgIHdyaXR0ZW4gdXNpbmcgdGhlIG5ldyBqYXZhZ2V0Y3B0ciB0eXBlbWFwIGRpcmVjdGl2ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSBhZGRpbmcgdGhpcyBmdW5jdGlvbiBiYWNrIGluIHVzaW5nIHRoZQogICAgICAgICAgICBuZXcgamF2YWNvZGUgdHlwZW1hcDoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewoKICAgICAgICAgICAgICAvLyBTV0lHLTEuMy4xMiBhbmQgU1dJRy0xLjMuMTMKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyJGphdmFjbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vIFNXSUctMS4zLjExIGFuZCBlYXJsaWVyCiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0cigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAlfQoKCjA3LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IGRpcmVjdGl2ZSB0byBjb250cm9sIGNvbnN0YW50IGNvZGUgZ2VuZXJhdGlvbiAtICVqYXZhY29uc3QuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGhhbmRsaW5nIGZvciBoYW5kbGluZyBjb25zdGFudHMgaXMgdG8gZ2V0IHRoZSB2YWx1ZSB0aHJvdWdoCiAgICAgICAgICAgIGEgSk5JIGNhbGwsIGVnCgogICAgICAgICAgICAjZGVmaW5lIFlFTExPVyA1CiAgICAgICAgICAgICNkZWZpbmUgQklHIDEyMzRMTAoKICAgICAgICAgICAgcmVzdWx0cyBpbjoKCiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFlFTExPVyA9IG1vZHVsZW5hbWUuZ2V0X1lFTExPVygpOwogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQklHID0gbW9kdWxlbmFtZS5nZXRfQklHKCk7CgogICAgICAgICAgICBFYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBKYXZhIG1vZHVsZSBpbml0aWFsaXNlZCB0aGUgdmFsdWUgdXNpbmcgdGhlIEMgdmFsdWU6CgogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBZRUxMT1cgPSA1OwogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQklHID0gMTIzNExMOwoKICAgICAgICAgICAgVGhpcyB3b3JrcyBpbiBtb3N0IGNhc2VzLCBidXQgdGhlIHZhbHVlIGZvciBCSUcgd29uJ3QgY29tcGlsZSBhcyAxMjM0TEwgaXMgbm90CiAgICAgICAgICAgIHZhbGlkIEphdmEgY29kZSBhbmQgdGhpcyBpcyBvbmUgb2YgdGhlIHJlYXNvbnMgd2h5IHRoZSBkZWZhdWx0IGlzIG5vdyB0byBnZXQgdGhlIAogICAgICAgICAgICB2YWx1ZXMgdGhyb3VnaCBhIEpOSSBjYWxsLiBUaGUgc2lkZSBlZmZlY3QgaXMgdGhhdCB0aGVzZSAnY29uc3RhbnRzJyBjYW5ub3QgYmUgdXNlZCAKICAgICAgICAgICAgaW4gc3dpdGNoIHN0YXRlbWVudHMuIFRoZSAlamF2YWNvbnN0IGRpcmVjdGl2ZSBhbGxvd3Mgb25lIHRvIHNwZWNpZnkgdGhlCiAgICAgICAgICAgIHdheSB0aGUgY29uc3RhbnQgdmFsdWUgaXMgaW5pdGlhbGlzZWQgYW5kIHdvcmtzIGxpa2Ugb3RoZXIgJWZlYXR1cmUKICAgICAgICAgICAgZGlyZWN0aXZlcywgZWcKCiAgICAgICAgICAgICVqYXZhY29uc3QoMCk7ICAgICAvLyBhbGwgY29uc3RhbnRzIGZyb20gdGhpcyBwb2ludCBvbiBhcmUgaW5pdGlhbGlzZWQgdXNpbmcgdGhlIEMgdmFsdWUKICAgICAgICAgICAgJWphdmFjb25zdCgxKSBCSUc7IC8vIGp1c3QgQklHIGluaXRpYWxpc2VkIHVzaW5nIEpOSSBjYWxsIChtdXN0IGJlIHBhcnNlZCBiZWZvcmUgQklHIGlzIGRlZmluZWQpCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICoqKiBJTVBPUlRBTlQgQ0hBTkdFUyBUTyBUSEUgUFlUSE9OIE1PRFVMRSAqKioKCiAgICAgICAgICAgICgxKSBUaGUgUHl0aG9uIG1vZHVsZSBub3cgZW5hYmxlcyBzaGFkb3cvcHJveHkgY2xhc3NlcyBieSBkZWZhdWx0LgogICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdHdvIGZpbGVzIGFyZSBhbHdheXMgY3JlYXRlZCBieSBTV0lHLiAgRm9yCiAgICAgICAgICAgIGluc3RhbmNlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICAgICAvLyBmaWxlOiBmb28uaQogICAgICAgICAgICAgICAgICVtb2R1bGUgZm9vCiAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICBUaGVuIHN3aWcgZ2VuZXJhdGVzIHR3byBmaWxlcyAiZm9vX3dyYXAuYyIgYW5kICJmb28ucHkiLgoKICAgICAgICAgICAgKDIpIFRoZSBuYW1lIG9mIHRoZSBsb3ctbGV2ZWwgQyBleHRlbnNpb24gbW9kdWxlIGhhcyBiZWVuIGNoYW5nZWQKICAgICAgICAgICAgdG8gc3RhcnQgd2l0aCBhIGxlYWRpbmcgdW5kZXJzY29yZS4gICBUaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUKICAgICAgICAgICAgdG8gY29tcGlsZSB0aGUgbW9kdWxlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgJCBjYyAtYyAtSS91c3IvbG9jYWwvaW5jbHVkZS9weXRob24yLjIgZm9vX3dyYXAuYwogICAgICAgICAgICAgICAgJCBjYyAtc2hhcmVkIGZvb193cmFwLm8gJChPQkpTKSAtbyBfZm9vLnNvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSBleHRyYSB1bmRlcnNjb3JlCgogICAgICAgICAgICBUaGlzIG5hbWluZyBzY2hlbWUgaXMgY29uc2lzdGVudCB3aXRoIG90aGVyIFB5dGhvbiBtb2R1bGVzIHRoYXQKICAgICAgICAgICAgdXRpbGl6ZSBleHRlbnNpb24gY29kZS4gIEZvciBpbnN0YW5jZSwgdGhlIHNvY2tldCBtb2R1bGUgY29uc2lzdHMKICAgICAgICAgICAgb2YgIl9zb2NrZXQuc28iIGFuZCAic29ja2V0LnB5Ii4gIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsCiAgICAgICAgICAgIHRoZSBzaGFyZWQgb2JqZWN0IGZpbGUgd2FzIG5hbWVkICJmb29jbW9kdWxlLnNvIi4KCiAgICAgICAgICAgICgzKSBBIG5ldyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IFB5dGhvbiBjb2RlIGludG8KICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgLnB5IGZpbGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlcHl0aG9uY29kZSAlewogICAgICAgICAgICAgICAgZGVmIGZvbygpOgogICAgICAgICAgICAgICAgICAgIHByaW50ICJIZWxsbyBXb3JsZCIKICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgVGhpcyBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBjcmVhdGUgbW9kdWxlcyBhcyBhIG1peCBvZiBDIGFuZCBQeXRob24uCiAgICAgICAgICAgICBQeXRob24gY29kZSBpcyBzZWFtbGVzc2x5IGFkZGVkIHRvIHRoZSBtb2R1bGUuCgogICAgICAgICAgICAoNCkgVGhlIC1zaGFkb3cgY29tbWFuZCBsaW5lIG9wdGlvbiBpcyBkZXByZWNhdGVkLiAgVGhpcyBpcyB0dXJuZWQgb24KICAgICAgICAgICAgYnkgZGVmYXVsdC4KCiAgICAgICAgICAgICg1KSBUbyBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBleHRyYSBweXRob24gZmlsZSwgdXNlIHRoZSAiLW5vcHJveHkiCiAgICAgICAgICAgIGNvbW1hbmQgbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgVGhpcyBjaGFuZ2Ugd2lsbCBsaWtlbHkgYnJlYWsgdGhlIGJ1aWxkIGVudmlyb25tZW50IG9mIHByb2plY3RzIHRoYXQKICAgICAgICAgICAgdXRpbGl6ZSBzaGFkb3cgY2xhc3Nlcy4gICBUbyBmaXggdGhpcywgeW91IHByb2JhYmx5IG9ubHkgbmVlZCB0bwogICAgICAgICAgICBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCAuc28gZmlsZS4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQogICAgICAgICAgICBNYWtlZmlsZSBpbmZvcm1hdGlvbiBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgVEFSR0VUID0gZXhhbXBsZWNtb2R1bGUuc28KCiAgICAgICAgICAgIEp1c3QgY2hhbmdlIGl0IHRvOgoKICAgICAgICAgICAgICAgICAgIFRBUkdFVCA9IF9leGFtcGxlLnNvCgogICAgICAgICAgICAqKiogRE9DVU1FTlRBVElPTiBVUERBVEUgKioqCiAgICAgICAgICAgIFRoZSBmaWxlIERvYy9NYW51YWwvUHl0aG9uLmh0bWwgaGFzIGJlZW4gdXBkYXRlZCB0byBkZXNjcmliZSB0aGVzZSBjaGFuZ2VzLgoKCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgLW5vZXh0ZXJuIG9wdGlvbi4gICBJZiBzdXBwbGllZCwgU1dJRyB3aWxsIG5vdCBnZW5lcmF0ZQogICAgICAgICAgICBleHRyYSBleHRlcm4gZGVjbGFyYXRpb25zLiAgVGhpcyBpcyBzb21ldGltZXMgYW4gaXNzdWUgb24gCiAgICAgICAgICAgIG5vbi11bml4IHBsYXRmb3Jtcy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYSB3YXJuaW5nIGZvciBpZ25vcmVkIGZyaWVuZCBmdW5jdGlvbnMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTc0NDk4IF0gLXByb3h5IGFuZCAlaW5jbHVkZSAicG9pbnRlci5pIiBjbGFzaC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRGF2aWQgQ3JlYXN5LgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU3NjEwMyBdIGdsb2JhbCBkZXN0cnVjdGlvbiB3YXJuaW5nIHdpdGggc2hhZG93LgogICAgICAgICAgICBQZXJsIGV4dGVuc2lvbnMgc2hvdWxkIG5vIGxvbmdlciByZXBvcnQgdGhlIHdhcm5pbmcKCiAgICAgICAgICAgICAgICJVc2Ugb2YgdW5pbml0aWFsaXplZCB2YWx1ZSBkdXJpbmcgZ2xvYmFsIGRlc3RydWN0aW9uLiIKIAogICAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCAicGVybCAtdyIuICBSZXBvcnRlZCBieQogICAgICAgICAgICBCcmV0dCBXaWxsaWFtcy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW4gQysrIG1vZGUsIFNXSUcgbm93IGFsd2F5cyBkZWZpbmVzIG5hbWVzcGFjZSBzdGQuICBCeSBkZWZhdWx0LAogICAgICAgICAgICBpdCdzIGVtcHR5LiAgSG93ZXZlciwgdGhpcyB3aWxsIHNpbGVuY2UgZXJyb3JzIGZyb20gcHJvZ3JhbXMKICAgICAgICAgICAgdGhhdCBpbmNsdWRlIHN0YXRlbWVudHMgc3VjaCBhcyAidXNpbmcgbmFtZXNwYWNlIHN0ZDsiLgogICAgICAgICAgICBUaGlzIGZpeGVzIEJ1ZyBbIDU4NDAxNyBdIHVzaW5nIG5hbWVzcGFjZSBzdGQgZ2VuZXJhdGVzIGVycm9yLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NlcGggV2luc3Rvbi4KCjA3LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYSBuZXcgd2FybmluZyBtZXNzYWdlIGZvciAlYXBwbHkuICBJZiB5b3UgdXNlICVhcHBseSBidXQgbm8gdHlwZW1hcHMKICAgICAgICAgICAgYXJlIGRlZmluZWQsIHlvdSB3aWxsIGdldCBhIHdhcm5pbmcgbWVzc2FnZS4gIFRoaXMgc2hvdWxkIGhlbHAgd2l0aAogICAgICAgICAgICBwcm9ibGVtcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgJWFwcGx5IGNoYXIgKk9VVFBVVCB7IC4uLiB9OwoKICAgICAgICAgICAgSW4gb2xkIHZlcnNpb25zIG9mIFNXSUcsIHRoaXMgc2lsZW50bHkgZGlkIG5vdGhpbmcuICBOb3cgeW91IGdldCBhbiBlcnJvciBsaWtlIHRoaXM6CiAgCiAgICAgICAgICAgICAgICAgICBmaWxlOmxpbmUuIFdhcm5pbmcuIENhbid0IGFwcGx5IChjaGFyICpPVVRQVVQpLiBObyB0eXBlbWFwcyBhcmUgZGVmaW5lZC4KCjA3LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU3RhcnRlZCBKYXZhIHByYWdtYSBkZXByZWNhdGlvbi4gUmVwbGFjZW1lbnRzIHVzZSAldHlwZW1hcCBiYXNlZCAKICAgICAgICAgICAgZGlyZWN0aXZlcyBhbmQgZW5hYmxlIHByb3h5IGNsYXNzZXMgYW5kIHRoZSBuZXcgdHlwZSB3cmFwcGVyIGNsYXNzZXMgdG8gYmUgCiAgICAgICAgICAgIHRhaWxvcmVkIGluIHZhcmlvdXMgd2F5cy4gVGhlc2UgYXJlIHRoZSBuZXcgdHlwZW1hcHM6CiAgICAgICAgICAgIAogICAgICAgICAgICAldHlwZW1hcChqYXZhYmFzZSkgICAgICAgICAgIC0gYmFzZSAoZXh0ZW5kcykgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSAtIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIEphdmEgY2xhc3M6IGRlZmF1bHQgaXMgInB1YmxpYyIKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpICAgICAgICAgICAtIGphdmEgY29kZSBpcyBjb3BpZWQgdmVyYmF0aW0gdG8gdGhlIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpICAgICAgICAtIGltcG9ydCBzdGF0ZW1lbnRzIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbnRlcmZhY2VzKSAgICAgLSBpbnRlcmZhY2VzIChleHRlbmRzKSBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAKICAgICAgICAgICAgQW5kIHRoZXNlIGFyZSB0aGUgJXByYWdtYSBkaXJlY3RpdmVzIGJlaW5nIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgIGFsbHNoYWRvd2Jhc2UKICAgICAgICAgICAgYWxsc2hhZG93Y2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYWxsc2hhZG93Y29kZQogICAgICAgICAgICBhbGxzaGFkb3dpbXBvcnQKICAgICAgICAgICAgYWxsc2hhZG93aW50ZXJmYWNlCiAgICAgICAgICAgIHNoYWRvd2Jhc2UKICAgICAgICAgICAgc2hhZG93Y2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgc2hhZG93Y29kZQogICAgICAgICAgICBzaGFkb3dpbXBvcnQKICAgICAgICAgICAgc2hhZG93aW50ZXJmYWNlCiAgICAgICAgICAgIAogICAgICAgICAgICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gdGFyZ2V0IGEgcGFydGljdWxhciBwcm94eSBjbGFzczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpIEZvbyAiaW1wb3J0IGphdmEudXRpbC4qIjsKICAgICAgICAgICAgb3IgYSBwYXJ0aWN1bGFyIHR5cGUgd3JhcHBlciBjbGFzczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpIGRvdWJsZSogImltcG9ydCBqYXZhLm1hdGguKiI7CiAgICAgICAgICAgIE5vdGUgdGhhdCAkamF2YWNsYXNzbmFtZSBpbiB0aGVzZSB0eXBlbWFwcyBhcmUgc3Vic3RpdHV0ZWQgd2l0aCBlaXRoZXIgdGhlIHByb3h5IAogICAgICAgICAgICBjbGFzc25hbWUgd2hlbiB1c2luZyBwcm94eSBjbGFzc2VzIG9yIHRoZSBTV0lHVFlQRSBjbGFzcyBuYW1lLgoKMDcvMTgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIG1vZHVsZSBvdmVyaGF1bCB0byBpbXBsZW1lbnQgc3RhdGljIHR5cGUgY2hlY2tpbmcgb2YgYWxsIAogICAgICAgICAgICB0eXBlcy4gCiAgICAgICAgICAgIAogICAgICAgICAgICAxKSBDaGFuZ2VzIHdoZW4gdXNpbmcgSmF2YSBQcm94eSBjbGFzc2VzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFByZXZpb3VzbHkgd2hlbiB3cmFwcGluZyBnbG9iYWwgZnVuY3Rpb25zOiAKCiAgICAgICAgICAgIGNsYXNzIFNvbWVDbGFzc3t9OwogICAgICAgICAgICB2b2lkIGZvbyhTb21lQ2xhc3MqIHMpOwogICAgICAgICAgICBTb21lQ2xhc3MqIGJhcigpOwoKICAgICAgICAgICAgVGhlIG5hdGl2ZSBtZXRob2QgcHJvdG90eXBlcyB1c2VkIGEgbG9uZyBmb3IgcG9pbnRlcnMgYW5kIGxvb2tlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICBwdWJsaWMgY2xhc3MgbW9kdWxlbmFtZSAgewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSB2b2lkIGZvbyhsb25nIGphcmcxKTsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIGxvbmcgYmFyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFuZCB1bmxpa2UgbWVtYmVyIGZ1bmN0aW9ucyBvZiBhIEMrKyBjbGFzcyB0aGVyZSB3YXMgbm8gd3JhcHBlciBhcm91bmQgdGhlIG5hdGl2ZSBjYWxscyAKICAgICAgICAgICAgdG8gbWFrZSB0aGUgdXNlIG9mIHRoZW0gbW9yZSB1c2VyIGZyaWVuZGx5LiBUaGV5IHdvdWxkIGJlIHVzZWQgZnJvbSBKYXZhIGxpa2UgdGhpczoKCiAgICAgICAgICAgIFNvbWVDbGFzcyBzID0gbmV3IFNvbWVDbGFzcyhtb2R1bGVuYW1lLmJhcigpLCBmYWxzZSk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMuZ2V0Q1B0clNvbWVDbGFzcygpKTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3QsIGJ1dCB0aGVuIGl0IHdvdWxkIG5vdCBoYXZlIAogICAgICAgICAgICBiZWVuIHBvc3NpYmxlIHRvIGNhbGwgYW55IHByb3h5IG1lbWJlciBmdW5jdGlvbnMgaW4gU29tZUNsYXNzOgoKICAgICAgICAgICAgbG9uZyBzID0gbW9kdWxlbmFtZS5iYXIoKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocyk7CgogICAgICAgICAgICBOb3cgd3JhcHBlciBmdW5jdGlvbnMgYXJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBtb2R1bGVuYW1lICB7CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZm9vKFNvbWVDbGFzcyBzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5hdGl2ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU29tZUNsYXNzIGJhcigpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbmF0aXZlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFdoaWNoIG1lYW5zIHRoZXNlIGZ1bmN0aW9ucyBjYW4gbm93IGJlIHVzZWQgbW9yZSBuYXR1cmFsbHkgd2l0aCBwcm94eSBjbGFzc2VzOgoKICAgICAgICAgICAgU29tZUNsYXNzIHMgPSBtb2R1bGVuYW1lLmJhcigpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzKTsKCiAgICAgICAgICAgIDIpIENoYW5nZXMgd2hlbiBub3QgdXNpbmcgSmF2YSBQcm94eSBjbGFzc2VzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBUaGUgc28gY2FsbGVkIGxvdy1sZXZlbCBpbnRlcmZhY2Ugd2FzIHJhdGhlciBsb3ctbGV2ZWwgaW5kZWVkLiBUaGUgCiAgICAgICAgICAgIG5ldyBzdGF0aWMgdHlwZSBjaGVja2luZyBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBsZXNzIHNvIGJ1dCBpdCByZW1haW5zIGEKICAgICAgICAgICAgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdG8gdGhlIEMvQysrIHdvcmxkLiBQcm94eSBjbGFzc2VzIGFyZSB0aGUgb2J2aW91cyB3YXkgdG8gdXNlCiAgICAgICAgICAgIFNXSUcgZ2VuZXJhdGVkIGNvZGUsIGJ1dCBmb3IgdGhvc2Ugd2hvIHdhbnQgYSBmdW5jdGlvbmFsIGludGVyZmFjZSBhbGwgbm9uLXByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyBub3cgaGF2ZSBhIHNpbXBsZSBKYXZhIGNsYXNzIHdyYXBwZXIgYXJvdW5kIHRoZSBDL0MrKyB0eXBlLiBQb2ludGVycyBhbmQKICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUgdHlwZXMgYXJlIGFsc28gd3JhcHBlZCBieSB0eXBlIHdyYXBwZXIgY2xhc3Nlcy4gVGhlIHR5cGUKICAgICAgICAgICAgd3JhcHBlciBjbGFzc25hbWVzIGFyZSBiYXNlZCBvbiB0aGUgU1dJRyBkZXNjcmlwdG9ycyB1c2VkIGJ5IHRoZSBvdGhlciBsYW5ndWFnZSAKICAgICAgICAgICAgbW9kdWxlcy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICBDL0MrKyB0eXBlICAgICAgSmF2YSB0eXBlIHdyYXBwZXIgY2xhc3MgbmFtZQogICAgICAgICAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBpbnQqICAgICAgICAgICAgU1dJR1RZUEVfcF9pbnQKICAgICAgICAgICAgZG91YmxlKiogICAgICAgIFNXSUdUWVBFX3BfcF9kb3VibGUKICAgICAgICAgICAgU29tZUNsYXNzKiAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCiAgICAgICAgICAgIFNvbWVDbGFzcyYgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwogICAgICAgICAgICBTb21lQ2xhc3MgICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKCiAgICAgICAgICAgIE5vdGUgdGhhdCBldmVyeXRoaW5nIHdyYXBwZWQgYnkgU1dJRyBpcyBhY2Nlc3NlZCB2aWEgYSBwb2ludGVyIGV2ZW4gd2hlbiB3cmFwcGluZyAKICAgICAgICAgICAgZnVuY3Rpb25zIHRoYXQgcGFzcyBieSB2YWx1ZSBvciByZWZlcmVuY2UuIFNvIHRoZSBwcmV2aW91cyBleGFtcGxlIHdvdWxkIG5vdyBiZSAKICAgICAgICAgICAgdXNlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcyBzID0gZXhhbXBsZS5iYXIoKTsKICAgICAgICAgICAgZXhhbXBsZS5mb28ocyk7CgogICAgICAgICAgICBOb3RlIHRoYXQgdHlwZWRlZnMgdGhhdCBTV0lHIGtub3dzIGFib3V0IGFyZSByZXNvbHZlZCwgc28gdGhhdCBpZiBvbmUgaGFzIAoKICAgICAgICAgICAgY2xhc3MgRm9ve307CiAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKCiAgICAgICAgICAgIHRoZW4gYW55IHVzZSBvZiBCYXIgd2lsbCByZXF1aXJlIG9uZSB0byB1c2UgU1dJR1RZUEVfcF9Gb287CgogICAgICAgICAgICBTb21lIGNvbnNpZGVyYXRpb25zOgogICAgICAgICAgICBNYWtlIHN1cmUgeW91IG1ha2UgYSBmaXJtIGRlY2lzaW9uIHRvIHVzZSBlaXRoZXIgcHJveHkgY2xhc3NlcyBvciB0aGUgZnVuY3Rpb25hbCAKICAgICAgICAgICAgaW50ZXJmYWNlIGVhcmx5IG9uIGFzIHRoZSBjbGFzc25hbWVzIGFyZSBkaWZmZXJlbnQuCgogICAgICAgICAgICAzKSBQb2ludGVycyBhbmQgbm9uLXBhcnNlZCB0eXBlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBTb21ldGltZXMgU1dJRyBjYW5ub3QgZ2VuZXJhdGUgYSBwcm94eSBjbGFzcy4gVGhpcyBvY2N1cnMgd2hlbiB0aGUgZGVmaW5pdGlvbiBvZiAKICAgICAgICAgICAgYSB0eXBlIGlzIG5vdCBwYXJzZWQgYnkgU1dJRywgYnV0IGlzIHRoZW4gdXNlZCBhcyBhIHZhcmlhYmxlIG9yIGEgcGFyYW1ldGVyLiAKICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICB2b2lkIGZvbyhTbmF6enkgc2RzKTsKCiAgICAgICAgICAgIElmIFNXSUcgaGFzIG5vdCBwYXJzZWQgU25henp5IGl0IGhhbmRsZXMgaXQgc2ltcGx5IGFzIGEgcG9pbnRlciB0byBhIFNuYXp6eS4KICAgICAgICAgICAgVGhlIEphdmEgbW9kdWxlIGdpdmVzIGl0IGEgdHlwZSB3cmFwcGVyIGNsYXNzIGFyb3VuZCB0aGUgcG9pbnRlciBhbmQgY2FsbHMgaXQgCiAgICAgICAgICAgIFNXSUdUWVBFX3BfU25henp5LiBJbiBvdGhlciB3b3JkcyBpdCBoYW5kbGVzIGl0IGluIHRoZSBzYW1lIG1hbm5lciBhcyB0eXBlcyBhcmUgCiAgICAgICAgICAgIGhhbmRsZWQgaW4gdGhlIGxvdy1sZXZlbCBmdW5jdGlvbmFsIGludGVyZmFjZS4gVGhpcyBhcHByb2FjaCBpcyB1c2VkIGZvciBhbGwgCiAgICAgICAgICAgIG5vbi1wcm94eSBjbGFzc2VzLCBlZyBhbGwgcG9pbnRlciB0byBwb2ludGVycyBhbmQgcG9pbnRlcnMgdG8gcHJpbWl0aXZlIHR5cGVzLgoKICAgICAgICAgICAgNCkgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGlmIHlvdSBoYXZlIGJlZW4gdXNpbmcgcHJveHkgY2xhc3NlcyBhbmQgCiAgICAgICAgICAgIG5vIGdsb2JhbCB2YXJpYWJsZXMvZnVuY3Rpb25zLiBPdGhlcndpc2Ugc29tZSBjaGFuZ2VzIHdpbGwgaGF2ZSB0byBiZSBtYWRlLiAKICAgICAgICAgICAgVGhlIG5hdGl2ZSBtZXRob2RzIHN0aWxsIGV4aXN0IGJ1dCB0aGV5IGFyZSBub3cgaW4gYSBKTkkgY2xhc3MsIHdoaWNoIGlzIGNhbGxlZCAKICAgICAgICAgICAgbW9kdWxlbmFtZUpOSS4gQXMgdGhpcyBjbGFzcyBpcyByZWFsbHkgcGFydCBvZiB0aGUgaW50ZXJuYWwgd29ya2luZ3MsCiAgICAgICAgICAgIGl0IHNob3VsZCBub3QgYmUgcmVxdWlyZWQgc28gdGhlIGNsYXNzIGhhcyBiZWNvbWUgcHJvdGVjdGVkLiBTb21lIHByYWdtYXMvZGlyZWN0aXZlcwogICAgICAgICAgICB3aWxsIGhvcGVmdWxseSBiZSBhZGRlZCB0byBoZWxwIHdpdGggYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIHdyYXBwaW5nIG9mIHVuaW5zdGFudGlhdGVkIHRlbXBsYXRlcyByZXR1cm5lZCBieQogICAgICAgICAgICB2YWx1ZS4gIEp1c3QgdG8gYmUgc2FmZSwgdGhleSBhcmUgbm93IHdyYXBwZWQgYnkgU3dpZ1ZhbHVlV3JhcHBlcjw+CiAgICAgICAgICAgIGp1c3QgaW4gY2FzZSB0aGV5IGRvbid0IGRlZmluZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuICBUaGlzCiAgICAgICAgICAgIHdvdWxkIGJlIHVzZWQgaWYgeW91IGhhZCBjb2RlIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICBGb288aW50PiBibGFoKCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgbW9yZWJsYWgoRm9vPGludD4geCk7CgogICAgICAgICAgICBidXQgeW91IGRpZG4ndCBpbnN0YW50aWF0ZSBGb288aW50PiB1c2luZyAldGVtcGxhdGUuICAKICAgICAgICAgICAgV2Ugc2hvdWxkIHByb2JhYmx5IGFkZCBhIHdhcm5pbmcgZm9yIHRoaXMuCgowNy8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGFuIGVycm9yIGNoZWNrIHRvIGRldGVjdCBzaGFkb3dlZCB0ZW1wbGF0ZSBwYXJhbWF0ZXJzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgaW50IFQ7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gYW4gZXJyb3IsIG5vdCBhIHdhcm5pbmcuICBUaGlzIHdhcm5pbmcgaXMKICAgICAgICAgICAgYWxzbyBuZWVkZWQgdG8gZml4IHNvbWUgcmF0aGVyIGluc2lkaW91cyBwcm9ibGVtcyBsaWtlCiAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBUIHsKICAgICAgICAgICAgICAgICAgICAgIGludCAgYmxhaDsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgVCBUcmFpdHM7ICAgIC8vIFdoaWNoIFQgaXMgdGhpcz8/Pz8KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIFQgc2hhZG93cyB0aGUgb3V0ZXIKICAgICAgICAgICAgc3RydWN0dXJlICh3aGljaCBpcyB3aGF0IHlvdSB3YW50KS4KCjA3LzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW1wcm92ZWQgc3VwcG9ydCBmb3IgdGVtcGxhdGVzIHdpdGggaW50ZWdlciBhcmd1bWVudHMuICBTV0lHIGlzCiAgICAgICAgICAgIG11Y2ggbW9yZSBhd2FyZSBvZiBzaXR1YXRpb25zIHN1Y2ggYXMgdGhpczoKCiAgICAgICAgICAgICAgICBjb25zdCBpbnQgU2l6ZSA9IDEwMDsKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vMTAwKSBGb288MTAwPjsKICAgICAgICAgICAgICAgIHZvaWQgYmFyKEZvbzxTaXplPiAqeCk7ICAgLy8gS25vd3MgdGhhdCBGb288U2l6ZT4gaXMgdGhlIHNhbWUgYXMgRm9vPDEwMD47CgowNy8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoICVmZWF0dXJlLyVpZ25vcmUvJXJlbmFtZSBhbmQgbmFtZXNwYWNlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OkJhcgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA3LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBjb25zdHJ1Y3RvcnMgdGhhdCB0cnkgdG8gY2F0Y2gKICAgICAgICAgICAgZXhjZXB0aW9ucyBpbiBpbml0aWFsaXplcnMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgQmFyIGI7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIEZvbyhpbnQgeCkgdHJ5IAogICAgICAgICAgICAgICAgICAgICA6IGIoeCkgeyAuLi4gfQogICAgICAgICAgICAgICAgIGNhdGNoKGludCkgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBnZW5lcmF0ZWQgd3JhcHBlcnMuICBIb3dldmVyLCB0aGUgdHJ5IGFuZCBjYXRjaAogICAgICAgICAgICBwYXJ0cyBvZiB0aGUgZGVjbGFyYXRpb24gYXJlIGlnbm9yZWQuICBTZWUgU3Ryb3VzdHJ1cCwgM3JkIEVkLCBzZWN0aW9uIAogICAgICAgICAgICAxNC40LjYuMSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICAgICAgIAowNy8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB0ZW1wbGF0ZSBzeW1ib2wgdGFibGUgbWFuYWdlbWVudC4gIFRoaXMgZml4ZXMKICAgICAgICAgICAgdHdvIGJ1Z3MuICBGaXJzdCwgbWl4aW5nIGFic3RyYWN0IG1ldGhvZHMsIHRlbXBsYXRlcywgYW5kIAogICAgICAgICAgICBpbmhlcml0YW5jZSBubyBsb25nZXIgZ2VuZXJhdGVzIGEgZmFpbGVkIGFzc2VydGlvbi4KIAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKSA9IDA7CiAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEE8VD4KICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAldGVtcGxhdGUoQV9pbnQpIEE8aW50PjsKICAgICAgICAgICAgICAgJXRlbXBsYXRlKEJfaW50KSBCPGludD47CgogICAgICAgICAgICBUaGlzIGZpeCBhbHNvIGZpeGVzIGEgc3VidGxlIHByb2JsZW0gd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQKICAgICAgICAgICAgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KICAgICAgICAgICAgICAgc3RydWN0IEIgewogICAgICAgICAgICAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90eXBlOwogICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBuaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KC0xKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKHNpemVfdHlwZSBpbmRleCA9IG5pbmRleCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBCdWdzIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgoKMDcvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIENoYW5nZWQgdGhlIGRlZmluaXRpb24gb2YgdGhlIFNXSUdfQ29udmVydFB0cigpIGZ1bmN0aW9uCgkgICAgZm9yIHRoZSBTV0lHL1J1YnkgcnVudGltZSBzdXBwb3J0IHNvIHRoYXQgaXQgbG9va3MgbGlrZSB0aGUKCSAgICBQeXRob24gdmVyc2lvbi4gSWYgdGhlIGxhc3QgYXJndW1lbnQgKGZsYWdzKSBpcyBub24temVybywKCSAgICBTV0lHX0NvbnZlcnRQdHIoKSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBmb3IgdHlwZSBtaXNtYXRjaGVzCgkgICAgYXMgYmVmb3JlLiBJZiBmbGFncyBpcyB6ZXJvLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIC0xIGZvcgoJICAgIHR5cGUgbWlzbWF0Y2hlcyB3aXRob3V0IHJhaXNpbmcgYW4gZXhjZXB0aW9uLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBSVUJZIE1PRFVMRSAqKioKCjA3LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgT3ZlcmxvYWRlZCBmdW5jdGlvbnMvbWV0aG9kcy9jb25zdHJ1Y3RvcnMgbm93IHdvcmsgaW4gbWFueSBsYW5ndWFnZQogICAgICAgICAgICBtb2R1bGVzLiAgVGhlIHN1cHBvcnQgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudC0tanVzdCBjYWxsIHRoZQogICAgICAgICAgICBmdW5jdGlvbiBub3JtYWxseSBhbmQgU1dJRyB3aWxsIGRpc3BhdGNoIHRvIHRoZSBjb3JyZWN0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAgICBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGlzc3VlcyBhc3NvY2lhdGVkIHdpdGggdGhpcy4gIFBsZWFzZSByZWZlcgogICAgICAgICAgICB0byB0aGUgb3ZlcmxvYWRpbmcgc2VjdGlvbiBvZiBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwgZm9yIGRldGFpbHMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA3LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBuYW1lc3BhY2VzLCBlbnVtcywgYW5kIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgbmFtZXNwYWNlIGhlbGxvIHsKICAgICAgICAgICAgICAgICAgZW51bSBIZWxsbyB7IEhpLCBIb2xhIH07CiAKICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPEhlbGxvIEg+CiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJhaXRzCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgdmFsdWVfdHlwZTsKICAgICAgICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICB0cmFpdHM8SGk+Ojp2YWx1ZV90eXBlIHNheV9oaSgpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFpdHM8SGk+Ojp2YWx1ZV90eXBlKDEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICBTV0lHIHdhc24ndCBnZW5lcmF0aW5nIHdyYXBwZXJzIHRoYXQgcHJvcGVybHkgcXVhbGlmaWVkIAogICAgICAgICAgICB0cmFpdHM8SGk+LiAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4gICAgICAgICAKCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VwcGxpZWQgYXJyYXkgdmFyaWFibGUgdHlwZW1hcHMgZm9yIFRjbCBtb2R1bGUuICAgSWYgeW91IGhhdmUgYQogICAgICAgICAgICB2YXJpYWJsZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgaW50IGZvb1sxMF07CgogICAgICAgICAgICB0aGVuIGEgc2V0IGZ1bmN0aW9uIGxpa2UgdGhpcyBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgdm9pZCBmb29fc2V0KGludCAqeCkgewogICAgICAgICAgICAgICAgICAgbWVtbW92ZShmb28seCwxMCpzaXplb2YoaW50KSk7CiAgICAgICAgICAgICAgICB9CgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyAlZnJhZ21lbnQgZGlyZWN0aXZlLiAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgaXQgY2FuIGJlIGVhc3kgdG8KICAgICAgICAgICAgZ2V0IGNhcnJpZWQgYXdheSBhbmQgd3JpdGUgYSBsb3Qgb2YgY29kZS4gIEhvd2V2ZXIsIGRvaW5nIHNvIGNhdXNlcwogICAgICAgICAgICB0cmVtZW5kb3VzIGNvZGUgYmxvYXQuICAgQSBjb21tb24gd2F5IHRvIHNvbHZlIHRoaXMgaXMgdG8gd3JpdGUgCiAgICAgICAgICAgIGhlbHBlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBzb21lX2hlbHBlcl9mdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB0eXBlIHsKICAgICAgICAgICAgICAgICAgIHNvbWVfaGVscGVyX2Z1bmN0aW9uKC4uLik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgb25seSBwcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IHRoZSB3cmFwcGVyIGZpbGUgZ2V0cyBwb2xsdXRlZAogICAgICAgICAgICB3aXRoIGhlbHBlciBmdW5jdGlvbnMgZXZlbiBpZiB0aGV5IGFyZW4ndCB1c2VkLiAgICBUbyBmaXggdGhpcywKICAgICAgICAgICAgYSBuZXcgZnJhZ21lbnQgZGlyZWN0aXZlIGlzIGF2YWlsYWJsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgKGNvcnJlY3RlZCB0eXBvIGluIGxpbmUgYmVsb3cgLSAwNi8yNi8yMDA4KQogICAgICAgICAgICAgICAlZnJhZ21lbnQoInR5cGVfaGVhZGVyIiwiaGVhZGVyIikgJXsKICAgICAgICAgICAgICAgICAgdm9pZCBzb21lX2hlbHBlcl9mdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAldHlwZW1hcChpbiwgZnJhZ21lbnQ9InR5cGVfaGVhZGVyIikgdHlwZSB7CiAgICAgICAgICAgICAgICAgICBzb21lX2hlbHBlcl9mdW5jdGlvbiguLi4pOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBjb2RlIGZyYWdtZW50IGlzIG9ubHkgZW1pdHRlZCBpZiB0aGUgdHlwZW1hcCBpcwogICAgICAgICAgICBhY3R1YWxseSB1c2VkLiAgIEEgc2ltaWxhciBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIGZvciBkZWNsYXJhdGlvbgogICAgICAgICAgICBhbm5vdGF0aW9uIGFuZCB0aGUgJWZlYXR1cmUgZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgiZnJhZ21lbnQiLCJ0eXBlX2hlYWRlciIpICBTb21lRGVjbGFyYXRpb247CgogICAgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gJWZyYWdtZW50IGlzIHRoZSBmcmFnbWVudCBuYW1lLiAgVGhlIHNlY29uZCBhcmd1bWVudAogICAgICAgICAgICBpcyB0aGUgZmlsZSBzZWN0aW9uIHdoZXJlIHRoZSBmcmFnbWVudCBzaG91bGQgYmUgZW1pdHRlZC4gIAoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgZGlyZWN0aXZlIGlzIGZvciB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgICAgYW5kIGFkdmFuY2VkIHVzZXJzIHdhbnRpbmcgdG8gc3RyZWFtbGluZSB0eXBlbWFwIGNvZGUuCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdXBwbGllZCBtZW1iZXJpbiB0eXBlbWFwcyBmb3IgYWxsIGFycmF5cyBpbiBhbiBhdHRlbXB0IHRvIGVsaW1pbmF0ZQogICAgICAgICAgICBjb25mdXNpb24gYWJvdXQgdGhlaXIgdXNlLgoKMDYvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3Igc21hcnQtcG9pbnRlcnMuICBXaGVuIGEgY2xhc3MgZGVmaW5lcwogICAgICAgICAgICBvcGVyYXRvci0+KCkgbGlrZSB0aGlzCgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgQmFyICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyBsb2NhdGVzIGNsYXNzIEJhciBhbmQgdHJpZXMgdG8gd3JhcCBpdHMgbWVtYmVyIHZhcmlhYmxlcyBhbmQKICAgICAgICAgICAgbWV0aG9kcyBhcyBwYXJ0IG9mIEZvby4gIEZvciBleGFtcGxlLCBpZiBCYXIgd2FzIGRlZmluZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIGludCBzcGFtKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBZb3UgY291bGQgZG8gdGhpcyAoaW4gdGhlIHRhcmdldCBsYW5ndWFnZSk6CgogICAgICAgICAgICAgIGYgPSBGb28oKQogICAgICAgICAgICAgIGYueCA9IDQgICAgICAgICAgICAjIEFjY2Vzc2VzIEJhcjo6eAogICAgICAgICAgICAgIGYuc3BhbSgpICAgICAgICAgICAjIEFjY2Vzc2VzIEJhcjo6c3BhbQoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgZmVhdHVyZSBpcyB0byBlbXVsYXRlIHRoZSBiZWhhdmlvciBvZiBDKysKICAgICAgICAgICAgc21hcnQtcG9pbnRlcnMtLS13aGljaCBhbGxvdyBhdHRyaWJ1dGVzIHRvIGFjY2Vzc2VkIHRyYW5zcGFyZW50bHkKICAgICAgICAgICAgdGhyb3VnaCBvcGVyYXRvci0+LgoKICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBhdXRvbWF0aWNhbGx5IGluIFNXSUctLS1ubyBzcGVjaWFsIGRpcmVjdGl2ZXMKICAgICAgICAgICAgYXJlIG5lZWRlZC4gICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IuICBVc2UgJWlnbm9yZSB0byBpZ25vcmUgCiAgICAgICAgICAgIG9wZXJhdG9yLT4uCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA2LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJWV4Y2VwdCBkaXJlY3RpdmUuICAgJWV4Y2VwdGlvbiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgoKMDYvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWpvciBjbGVhbnVwIG9mIHRoZSBtb2R1bGVzIGRpcmVjdG9yeS4gIEVsaW1pbmF0ZWQgbW9zdAogICAgICAgICAgICBoZWFkZXIgZmlsZXMsIGNvbnNvbGlkYXRlZCBtb2R1bGUgY29kZSBpbnRvIHNpbmdsZSBmaWxlcy4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV3b3JrZWQgdGhlIGluc3RhbnRpYXRpb24gb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIEFsbCBsYW5ndWFnZQogICAgICAgICAgICBtb2R1bGVzIG11c3Qgbm93IGRlZmluZSBhIGZhY3RvcnkgZnVuY3Rpb24gc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKgogICAgICAgICAgICAgICAgc3dpZ19weXRob24odm9pZCkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQWVRIT04oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlbiBwbGFjZWQgaW4gYSB0YWJsZSBhbmQgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgICAgIGEgY29tbWFuZCBsaW5lIG9wdGlvbiBpbiBzd2lnbWFpbi5jeHguICAKCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaGFzIGEgbnVtYmVyIG9mIGJlbmVmaXRzLiAgSXQgZGVjb3VwbGVzIHRoZSAKICAgICAgICAgICAgU1dJRyBtYWluIHByb2dyYW0gZnJvbSBoYXZpbmcgdG8ga25vdyBhYm91dCB0aGUgY2xhc3MKICAgICAgICAgICAgZGVmaW5pdGlvbnMgZm9yIGVhY2ggbW9kdWxlLiAgQWxzbywgYnkgdXNpbmcgYSBmYWN0b3J5CiAgICAgICAgICAgIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGVhc2llciB0byBpbXBsZW1lbnQgZHluYW1pYyBsb2FkaW5nCiAgICAgICAgICAgIG9mIG1vZHVsZXMgKHNpbXBseSBsb2FkIHRoZSBmaWxlIGFuZCBpbnZva2UgdGhlIGZhY3RvcnkKICAgICAgICAgICAgZnVuY3Rpb24pLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3IgZm9yIHJlZmVyZW5jZSBjb252ZXJzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgRm9vICYoKTsKCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIGZvciBvcGVyYXRvciBuZXdbXSBhbmQgb3BlcmF0b3IgZGVsZXRlW10uCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBwcm9ibGVtIGZvciBjb25zdGFudHMgYW5kIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgIGludm9sdmluZyB0ZW1wbGF0ZXMuCgowNi8xOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgYSBidWcgZm9yIHRoZSAnLWZlYXR1cmUnIGNvbW1hbmQgbGluZSBhcmd1bWVudDsKICAgICAgICAgICAgdGhhdCBzZXR0aW5nIHdhcyBlZmZlY3RpdmVseSBiZWluZyBpZ25vcmVkIGFuZCBzbyB0aGUgZmVhdHVyZQogICAgICAgICAgICBuYW1lIHdhcyBhbHdheXMgc2V0IGVxdWFsIHRvIHRoZSBtb2R1bGUgbmFtZS4KCjA2LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbXMgd2l0aCBzdGF0aWMgbWVtYmVycyBhbmQgZW51bXMgaW4gdGVtcGxhdGVzLgoKVmVyc2lvbiAxLjMuMTMgKEp1bmUgMTcsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIF9fRklMRV9fIGV4cGFuc2lvbiBpbiB0aGUgcHJlcHJvY2Vzc29yLiAgIE9uIFdpbmRvd3MsCiAgICAgICAgICAgIHRoZSBiYWNrc2xhc2ggKFwpIGlzIG5vdyBjb252ZXJ0ZWQgdG8gKFxcKSBpbiB0aGUgc3RyaW5nIGxpdGVyYWwKICAgICAgICAgICAgdXNlZCBmb3IgX19GSUxFX18uICBSZXBvcnRlZCBieSBTdGV2ZSBHbGFzZXIuCgowNi8xNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAnbmFtZSBwcml2YXRlIGluIHRoaXMgY29udGV4dCcuICBUaGUKICAgICAgICAgICAgd2FybmluZyBpcyBvbmx5IGdlbmVyYXRlZCBmb3IgcHVibGljIG1ldGhvZHMuICBSZXBvcnRlZCBieQogICAgICAgICAgICBTY290dCBNaWNoZWwuCiAKMDYvMTQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGVtcGxhdGUgaW5zdGFudGlhdGlvbiAKICAgICAgICAgICAgYW5kIG5hbWVzcGFjZXMuICAgV2hlbiBTV0lHIGV4cGFuZHMgYSB0ZW1wbGF0ZSwgaXQgZG9lcwogICAgICAgICAgICBzbyB3aXRoIGZ1bGx5IHJlc29sdmVkIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZm9vIHsgfTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIERvdWJsZTsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShmb29fZCkgZm9vPERvdWJsZT47CgogICAgICAgICAgICB0aGVuLCBpdCBpcyBoYW5kbGVkIGFzIGZvbzxkb3VibGU+IGluIHRoZSB0eXBlc3lzdGVtLgogICAgICAgICAgICBUaGlzIGZpeGVzIGEgbnVtYmVyIG9mIHN1YnRsZSBwcm9ibGVtcyB3aXRoIGluaGVyaXRhbmNlCiAgICAgICAgICAgIGFuZCB0ZW1wbGF0ZXMuCgowNi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbWlzc2luZyBib29sIHR5cGVtYXBzIGZvciBJTlBVVCwgT1VUUFVUIGFuZAoJICAgIElOT1VUIGluIExpYi9ydWJ5L3R5cGVtYXBzLmkuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgYSBjb3VwbGUgb2YgYnJva2VuIHByYWdtYXMuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciB1bm5lY2Vzc2FyeSBjYXN0IHdoZW4gd3JhcHBpbmcgZ2xvYmFsIHZhcmlhYmxlIHdoZXJlIAogICAgICAgICAgICB0aGUgdHlwZSBpcyBub3QgcGFyc2VkIGJ5IFNXSUcgLSBKYXZhIHZhcmlhYmxlcyBleGFtcGxlIAogICAgICAgICAgICBmYWlsdXJlIGFzIHJlcG9ydGVkIGJ5IExhcnJ5IFZpcmRlbi4KCjA2LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgJXRlbXBsYXRlIHRvIGFsbG93IGZvciBlbXB0eSBpbnN0YW50aWF0aW9ucy4KCiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIGZvbzxpbnQsaW50PjsKCiAgICAgICAgICAgIFRoaXMgcmVnaXN0ZXJzIGZvbzxpbnQsaW50PiB3aXRoIHRoZSB0eXBlIHN5c3RlbSwgYnV0CiAgICAgICAgICAgIGRvZXNuJ3Qgd3JhcCBpdCAoc2FtZSBhcyAlaWdub3JlKS4gICBUaGlzIG1heSBvbmx5IGJlIGEKICAgICAgICAgICAgdGVtcG9yYXJ5IG1lYXN1cmUuICAgU1dJRyBtaWdodCBiZSBhYmxlIHRvIGF1dG9tYXRpY2FsbHkKICAgICAgICAgICAgaW5zdGFudGlhdGUgdGVtcGxhdGVzIGluIGNlcnRhaW4gY2FzZXMuCgowNi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGZ1bmN0aW9uIHByb3RvdHlwZSBwcm9ibGVtcyB3aXRoIFRjbCA4LjQKCjA2LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHRlbXBsYXRlcyBhbmQgbG9jYXRpb24gb2YgYmFzZSBjbGFzc2VzLiAgCiAgICAgICAgICAgIFRoaXMgb25lIGlzIGEgbGl0dGxlIG1pbmQtYmVuZGluZywgYnV0IGhlcmUgaXMgYW4gZXhhbXBsZQogICAgICAgICAgICB0aGF0IGlsbHVzdHJhdGVzOgogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZSwgY2xhc3MgUmVzVHlwZT4KICAgICAgICAgICAgIHN0cnVjdCB0cmFpdHMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBBcmdUeXBlIGFyZ190eXBlOwogICAgICAgICAgICAgICAgICB0eXBlZGVmIFJlc1R5cGUgcmVzX3R5cGU7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZSwgY2xhc3MgUmVzVHlwZT4KICAgICAgICAgICAgIHN0cnVjdCBGdW5jdGlvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFGLCBjbGFzcyBBRz4KICAgICAgICAgICAgIHN0cnVjdCBDbGFzcyA6IEZ1bmN0aW9uPHR5cGVuYW1lIHRyYWl0czxBRiwgQUc+OjphcmdfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxBRiwgQUc+OjpyZXNfdHlwZT4KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgJXRlbXBsYXRlKHRyYWl0c19kZCkgdHJhaXRzIDxkb3VibGUsIGRvdWJsZT47CiAgICAgICAgICAgICAldGVtcGxhdGUoRnVuY3Rpb25fZGQpIEZ1bmN0aW9uIDxkb3VibGUsIGRvdWJsZT47CiAgICAgICAgICAgICAldGVtcGxhdGUoQ2xhc3NfZGQpIENsYXNzIDxkb3VibGUsIGRvdWJsZT47CgoKICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgYmFzZSBjbGFzcyBvZiAnQ2xhc3MnIGlzIGRldGVybWluZWQgZnJvbQogICAgICAgICAgICB0aGUgRnVuY3Rpb24gdGVtcGxhdGUsIGJ1dCB0aGUgdHlwZXMgYXJlIG9idGFpbmVkIHRocm91Z2ggdHlwZWRlZnMuCiAgICAgICAgICAgIEJlY2F1c2Ugb2YgdGhpcywgU1dJRyBjb3VsZCBub3QgbG9jYXRlIHRoZSB3cmFwcGVkIGJhc2UgY2xhc3MKICAgICAgICAgICAgKEZ1bmN0aW9uPGRvdWJsZSxkb3VibGU+KS4gICBTaG91bGQgYmUgZml4ZWQgaW4gMS4zLjEzIGV2ZW4KICAgICAgICAgICAgdGhvdWdoIEkgY2FuIHRoaW5rIG9mIGEgbWlsbGlvbiBvdGhlciB0aGluZ3MgdGhhdCBtaWdodAogICAgICAgICAgICBhbHNvIGJlIGJyb2tlbi4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggY29udmVyc2lvbiBvcGVyYXRvcnMuICBJZiB5b3UgaGFkIGFuCiAgICAgICAgICAgIG9wZXJhdG9yIGxpa2UgdGhpcywKCiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0OwoKICAgICAgICAgICAgU1dJRyB3YXMgb21taXR0aW5nIHRoZSAiY29uc3QiIHF1YWxpZmllci4gIFRoaXMgYWZmZWN0ZWQKICAgICAgICAgICAgJXJlbmFtZSBhbmQgb3RoZXIgZGlyZWN0aXZlcy4gIFJlcG9ydGVkIGJ5IFpob25nIFJlbi4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTGVzc2VuZWQgdGhlIHN0cmljdG5lc3Mgb2YgYWJzdHJhY3QgY2xhc3MgY2hlY2tpbmcuICBJZgogICAgICAgICAgICB5b3UgaGF2ZSBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgbWV0aG9kKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgU1dJRyB3aWxsIGdvIGFoZWFkIGFuZCBnZW5lcmF0ZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9ycwogICAgICAgICAgICAgZm9yIEJhci4gIEhvd2V2ZXIsIGl0IHdpbGwgYWxzbyBnZW5lcmF0ZSBhIHdhcm5pbmcgbWVzc2FnZSAKICAgICAgICAgICAgIHRoYXQgIkJhciIgbWlnaHQgYmUgYWJzdHJhY3QgKHNpbmNlIG1ldGhvZCgpIGlzbid0IGRlZmluZWQpLgogICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTIsIFNXSUcgcmVmdXNlZCB0byBnZW5lcmF0ZSBhIGNvbnN0cnVjdG9yIGF0IGFsbC4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvICV0ZW1wbGF0ZSBkaXJlY3RpdmUuICBJZiB5b3Ugc3BlY2lmeSBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aSkgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIEl0IGlzICpleGFjdGx5KiB0aGUgc2FtZSBhcyB0aGlzOgogCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmkpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgU1dJRy0xLjMuMTIgdHJpZWQgdG8gaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIG91dHNpZGUgb2YgdGhlIG5hbWVzcGFjZQogICAgICAgICAgICB1c2luZyBzb21lIHRyaWNrLiAgSG93ZXZlciwgdGhpcyB3YXMgZXh0cmVtZWx5IHByb2JsZW1hdGljIGFuZCBmdWxsCiAgICAgICAgICAgIGhvbGVzLiAgIFRoaXMgdmVyc2lvbiBpcyBzYWZlci4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggc2NvcGUgcXVhbGlmaWNhdGlvbiBhbmQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIEE8Qjo6Qz46OkRECgogICAgICAgICAgICBCZWZvcmUsIHRoaXMgd2FzIHNlcGFyYXRlZCBhcyBzY29wZXMgQTxCLCBDPiwgYW5kIERELiAgRml4ZWQgbm93LgoKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBBbGxvdyB0aGUgZm9sbG93aW5nIHN5bnRheDogCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBjbGFzcyBBIHsgfTsKICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBIHsgLi4uIH07CgogICAgICAgICAgICBBIGJhc2UgY2xhc3Mgd2l0aG91dCBhIHNwZWNpZmllciBpcyBhc3N1bWVkIHRvIGJlIHB1YmxpYyBmb3IgYSBzdHJ1Y3QuCiAKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3Igd2l0aCB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA2LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHByb2JsZW1zIHdpdGggJXJlbmFtZSBkaXJlY3RpdmUgYW5kIHRlbXBsYXRlCiAgICAgICAgICAgIGV4cGFuc2lvbi4KCiAgICAgICAgICAgIENvZGUgbGlrZSB0aGlzIHNob3VsZCBub3cgd29yazoKCiAgICAgICAgICAgICAgICVyZW5hbWUoYmxhaCkgZm9vPGRvdWJsZT46Om1ldGhvZDsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZvaWQgbWV0aG9kKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAldGVtcGxhdGUod2hhdGV2ZXIpIGZvbzxkb3VibGU+OwoKMDYvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXNvbHZlZCBzb21lIHRyaWNreSBpc3N1ZXMgb2YgbXVsdGktcGFzcyBjb21waWxhdGlvbiBhbmQgCiAgICAgICAgICAgIGFuZCBpbmhlcml0YW5jZS4gIFRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uIG5vdyBnZW5lcmF0ZXMKICAgICAgICAgICAgYW4gZXJyb3I6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGFib3V0IGluY29tcGxldGUgY2xhc3Nlcy4KCiAgICAgICAgICAgICAgICAgIGNsYXNzIEJhcjsKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7IH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvZGUgZ2VuZXJhdGVzIGEgd2FybmluZyBhYm91dCBhbiB1bmRlZmluZWQgY2xhc3MuCgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsgfTsgIC8vIEJhciB1bmRlZmluZWQKCiAgICAgICAgICAgIFRoaXMgZml4ZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIGJ1ZyByZXBvcnRlZCBieSBKYXNvbiBTdGV3YXJ0LgoKMDYvMDUvMjAwMjogbGpvaG5zb24KICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIGZvciB0aGUgUnVieSBtb2R1bGUgYWJvdXQgdGhlIGxhY2sKICAgICAgICAgICAgb2Ygc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIE9ubHkgdGhlIGZpcnN0IGJhc2UgY2xhc3MKICAgICAgICAgICAgbGlzdGVkIGlzIHVzZWQgYW5kIHRoZSBvdGhlcnMgYXJlIGlnbm9yZWQuIChSZXBvcnRlZCBieSBDcmFpZwogICAgICAgICAgICBGaWxlcykuCiAgICAgICAgICAgIAowNi8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggc3RydWN0IGRlY2xhcmF0aW9ucyBhbmQgdHlwZWRlZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IEZvbyBGb287CiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEEgZmV3IG90aGVyIHN1YnRsZSBzdHJ1Y3QgcmVsYXRlZCB0eXBpbmcgcHJvYmxlbXMgd2VyZQogICAgICAgICAgICBhbHNvIHJlc29sdmVkLgoKVmVyc2lvbiAxLjMuMTIgKEp1bmUgMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgCjA1LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSByZWxhdGVkIHRvIGZvcndhcmQgdGVtcGxhdGUgY2xhc3MgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgICBuYW1lc3BhY2VzLiAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkICdtYWtlIHVuaW5zdGFsbCcgdGFyZ2V0LiAgQ29udHJpYnV0ZWQgYnkgSm9lbCBSZWVkLgoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCByYXRoZXIgaW5zaWRpb3VzIGJ1ZyB3aXRoICVyZW5hbWUsICVmZWF0dXJlIGFuZCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB2ZWN0b3I6Ol9fZ2V0aXRlbV9fIHsKICAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgVCBfX2dldGl0ZW1fXyhpbnQgaW5kZXgpOyAgICAgICAvLyBGaW5lCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFQgX19nZXRpdGVtX18oaW50IGluZGV4KTsgICAgICAgLy8gT29wcy4KICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3csIHRoZSAlZXhjZXB0aW9uIGRpcmVjdGl2ZSAoYW5kIG90aGVyIGZlYXR1cmVzKSBzaG91bGQgY29ycmVjdGx5IGFwcGx5IHRvCiAgICAgICAgICAgIGJvdGggdmVjdG9yIGFuZCBzcGVjaWFsaXphdGlvbnMuCgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2VzIHRvICV0ZW1wbGF0ZSgpIGRpcmVjdGl2ZS4gICBUZW1wbGF0ZSBhcmd1bWVudHMgYXJlIG5vdwogICAgICAgICAgICByZWR1Y2VkIHRvIHByaW1pdGl2ZSB0eXBlcyBpbiB0ZW1wbGF0ZSBtYXRjaGluZy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yPFQgKj4gewogICAgICAgICAgICAgICAgLi4uIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICpJbnRQdHI7ICAgICAvLyBHcm9zcyB0eXBlZGVmCgogICAgICAgICAgICAgICAvLyBHZXRzIHRoZSBhYm92ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JJbnRQdHIpIHZlY3RvcjxJbnRQdHI+OwoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgZXh0cmVtZWx5IHN1YnRsZSwgYnV0IGl0IGZpeGVzIGEgbnVtYmVyIG9mIHBvdGVudGlhbAogICAgICAgICAgICBob2xlcyBpbiBMdWlnaSdzIFNUTCBsaWJyYXJ5IG1vZHVsZXMuICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yaSkgdmVjdG9yPGludD47CgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHJhdGhlciBpbnNpZGlvdXMgdHlwZW1hcCBidWcgcmVsYXRlZCB0byBjb25zdC4gIGNvbnN0CiAgICAgICAgICAgIHdhcyBiZWluZyBkaXNjYXJkZWQgdGhyb3VnaCB0eXBlZGVmcy4KCjA1LzI5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBpbnB1dCB0eXBlbWFwcyBmb3IgY29uc3QgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgKGluIExpYi9ydWJ5L3J1Ynkuc3dnKS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIGphdmEgYXJycmF5IHN1cHBvcnQgZnVuY3Rpb25zIGFyZSBlbmNsb3NlZCBieSAKICAgICAgICAgICAgYSBTV0lHX05PQVJSQVlTICNkZWZpbmUuIFVzZWZ1bCBpZiBub3QgdXNpbmcgYXJyYXlzIGFuZCAKICAgICAgICAgICAgaXQgaXMgZGVzaXJhYmxlIHRvIG1pbmltaXNlIHRoZSBhbW91bnQgb2YgY29tcGlsZWQgY29kZS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRW51bXMgd2VyZSBub3QgcmVuYW1lZCB3aGVuIHVzaW5nICVuYW1lIG9yICVyZW5hbWUKICAgICAgICAgICAgZml4LgoKMDUvMjgvMjAwMjogbGpvaG5zb24KICAgICAgICAgICAgW1J1YnldIE1vZGlmaWVkIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgdGhlCgkgICAgIm5ldyIgc2luZ2xldG9uIG1ldGhvZCBhbmQgImluaXRpYWxpemUiIGluc3RhbmNlIG1ldGhvZCBmb3IKCSAgICBjb25zaXN0ZW5jeSB3aXRoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzLiBUaGUgd3JhcHBlciBuYW1lCgkgICAgZm9yIHRoZSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgIm5ldyIgaXMgYWxsb2NfY2xhc3NuYW1lIGFuZAoJICAgIHRoZSB3cmFwcGVyIG5hbWUgZm9yIHRoZSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgImluaXRpYWxpemUiCgkgICAgaXMgbmV3X2NsYXNzbmFtZS4KCgowNS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gcnVudGltZS4gIFBvaW50ZXIgY29udmVyc2lvbi9jcmVhdGlvbiBmdW5jdGlvbnMKICAgICAgICAgICAgbm93IGFsbW9zdCBhbHdheXMgaGF2ZSBhbiBleHRyYSAiZmxhZ3MiIGFyZ3VtZW50LiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfQ29udmVydFB0cihvYmosIHZvaWQgKiosIHN3aWdfdHlwZV9pbmZvICp0eSwgaW50IGZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl4KICAgICAgICAgICAgVGhpcyBleHRyYSBwYXJhbWV0ZXIgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gYW5kIHdpbGwKICAgICAgICAgICAgYmUgdXNlZCBmb3IgbW9yZSBjb250cm9sIG92ZXIgcG9pbnRlcnMgaW4gZnV0dXJlIHZlcnNpb25zLgoKMDUvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggZm9yIEMrKyBjbGFzc2VzIHdpdGggcHJpdmF0ZSBhc3NpZ25tZW50IG9wZXJhdG9ycy4gIEl0CiAgICAgICAgICAgIGlzIG5vdyBwb3NzaWJsZSB0byBzYWZlbHkgcmV0dXJuIG9iamVjdHMgbGlrZSB0aGlzIGJ5IHZhbHVlLgogICAgICAgICAgICBDYXZlYXQ6ICB0aGUgY2xhc3MgbXVzdCBwcm92aWRlIGEgY29weSBjb25zdHJ1Y3Rvci4KCSAgICAKMDUvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICAtcHJveHkgb3B0aW9uIGFkZGVkIHRvIG1hbnkgbGFuZ3VhZ2UgbW9kdWxlcy4gIFRoaXMgaXMgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgLXNoYWRvdy4gIFdlIGFyZSBtZXJlbHkgY2hhbmdpbmcgdGVybWlub2xvZ3kuCiAgICAgICAgICAgIAowNS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBzb21lIGluY29uc2lzdGVuY2llcyBpbiB0aGUgLXBhY2thZ2Ugb3B0aW9uLgogICAgICAgICAgICAtcGFja2FnZSBtZXJlbHkgc2V0cyB0aGUgcGFja2FnZSBuYW1lIHRvIGJlIHVzZWQgb24gdGhlCiAgICAgICAgICAgIHdyYXBwZXJzLiAgSXQgZG9lcyBub3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeQogICAgICAgICAgICBmaWxlIG9yIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgLnBtIGZpbGUuICBUaGlzIHdhcwogICAgICAgICAgICBicm9rZW4gYXQgc29tZSBwb2ludCwgYnV0IHdvcmtzIGFnYWluIG5vdy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIFsgNDc1NDUyIF0gbWVtb3J5IGxlYWsgaW4gcmV0dXJuLWJ5LXZhbHVlLgogICAgICAgICAgICBQcm9ibGVtIHJlbGF0ZWQgdG8gc3RhdGljIG1lbWJlciB2YXJpYWJsZXMgcmV0dXJuaW5nIG5ld2x5CiAgICAgICAgICAgIGFsbG9jYXRlZCBvYmplY3RzLiBSZXBvcnRlZCBieSBSb3kgTGVjYXRlcy4KIAowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBbIDUxMzEzNCBdICVCTEVTU0VETUVNQkVSUyBpc24ndCBhbHdheXMgcmlnaHQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEZsZXVyIERpYW5hIERyYWdhbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDA3MzUgXSAtaW1wb3J0YWxsIGFuZCB0aGUgLUkgb3B0aW9uLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbZ3VpbGVdIEZpeGVkIFsgNTMyNzIzIF0gRGVmYXVsdCBhcmcgZm9yIGNoYXIqIGNhbiBTZWdWLiAgCiAgICAgICAgICAgIEVycm9yIGluIGd1aWxlIG1vZHVsZS4gIFJlcG9ydGVkIGJ5IEJyZXR0IFdpbGxpYW1zLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHR5cGVtYXAgYXBwbGljYXRpb24gY29kZS4gIFRoZSAiZnJlZWFyZyIKICAgICAgICAgICAgdHlwZW1hcCBtdXN0IGV4YWN0bHkgbWF0Y2ggdXAgd2l0aCB0aGUgImluIiBvciAiaWdub3JlIgogICAgICAgICAgICB0eXBlbWFwLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoY2hhciAqZGF0YSwgaW50IGxlbikgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAldHlwZW1hcChmcmVlYXJnKSBjaGFyICpkYXRhIHsgLi4uIH07IAoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhjaGFyICpkYXRhLCBpbnQgbGVuKTsKCiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSAiaW4iIHR5cGVtYXAgaXMgYXBwbGllZCwgYnV0IHRoZQogICAgICAgICAgICAgZnJlZWFyZyB0eXBlbWFwIGlzIG5vdC4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgZnJlZWFyZwogICAgICAgICAgICAgdHlwZW1hcCBkb2Vzbid0IG1hdGNoIHVwIHdpdGggdGhlIGlucHV0IGFyZ3VtZW50IHNlcXVlbmNlLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0ODI3MiBdIERlZmF1bHQgYXJndW1lbnQgY29kZSBtaXNzaW5nIGJyYWNlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJldHQgV2lsbGlhbXMuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQ3NzMwIF0gU3dpZ1ZhbHVlV3JhcHBlciBuZWVkZWQgZm9yIGNvbnN0cnVjdG9ycy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVuZGVmaW5lZCBpZGVudGlmaWVycyBub3cgZXZhbHVhdGUgdG8gMCB3aGVuIGV2YWx1YXRpbmcKICAgICAgICAgICAgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjaWYgIUZPTwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgIAogICAgICAgICAgICB3aGVyZSBGT08gaXMgdW5kZWZpbmVkIG9yIHNldCB0byBzb21lIG5vbi1udW1lcmljIHZhbHVlLgoKICAgICAgICAgICAgRml4ZXMgWyA1NDA4NjggXSAjaWYgZGVmaW5lZCB3aGF0ZXZlciAtIG5vdCBwYXJzZWQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFkYW0gSHVwcC4KCiAKMDUvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBpZ25vcmVzIHRoZSBDKysgJ2V4cG9ydCcga2V5d29yZC4KCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSByZWZpbmVtZW50IG9mIHR5cGUtbmFtZSBtYW5nbGluZyB0byBhY2NvdW50IGZvciBwb2ludGVycywgYXJyYXlzLAogICAgICAgICAgICByZWZlcmVuY2VzLCBhbmQgb3RoZXIgZW1iZWRkZWQgdHlwZSBjb25zdHJ1Y3RzLgoKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbml0aWFsIGF0dGVtcHQgYXQgc3VwcG9ydGluZyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgQXQKICAgICAgICAgICAgdGhlIHZlcnkgbGVhc3QsIGl0IGlzIHBhcnNlZCBhbmQgdGhlIGNsYXNzZXMgYXJlIHN0b3JlZC4gIE1hdGNoaW5nCiAgICAgICAgICAgIG9mIGluc3RhbnRpYXRpb25zIHRvIHNwZWNpYWxpemVkIHZlcnNpb24gaXMgbW9yZSBsaW1pdGVkIGFuZCBiYXNlZCBvbgogICAgICAgICAgICB0aGUgU1dJRyBkZWZhdWx0IHR5cGVtYXAgcnVsZXM6CgogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtdCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICYKCiAgICAgICAgICAgIE5vdywgd2h5IGluIHRoZSB3b3JsZCB3b3VsZCB5b3Ugd2FudCB0byB1c2UgdGhpcyBmZWF0dXJlPyAgT3RoZXIKICAgICAgICAgICAgdGhhbiBhbGxvd2luZyBmb3Igc2xpZ2h0bHkgbW9kaWZpZWQgY2xhc3MgQVBJcywgdGhpcyBjYXBhYmlsaXR5IGlzCiAgICAgICAgICAgIHByaW1hcmlseSB1c2VkIHRvIHByb3ZpZGUgYWR2YW5jZWQgd3JhcHBpbmcgc3VwcG9ydCBmb3IgU1RMLWxpa2UKICAgICAgICAgICAgb2JqZWN0cy4gIEl0IGNhbiBhbHNvIGJlIG1peGVkIHdpdGggdHlwZW1hcHMuICBIZXJlIGlzIGFuIGV4YW1wbGU6CgoKICAgICAgICAgICAgICAgIC8qIEdlbmVyaWMgdmVyc2lvbiAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPFQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBvYmplY3RzIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvKiBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIChwb2ludGVycykgKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvcjxUICo+IHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPFQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBwb2ludGVycyB0byBvYmplY3RzLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvKiBTcGVjaWFsaXphdGlvbiAoaW50ZWdlcnMpLiAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBpbnRlZ2Vycy4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnQgdG8gdHlwZW1hcHMuICAgTm9ybWFsbHksIHR5cGVtYXAgdmFyaWFibGVzIGFyZQogICAgICAgICAgICByZW5hbWVkIHRvIGF2b2lkIGNvbmZsaWN0cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAqIChpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBjb2RlIHRoYXQgY3JlYXRlcyBhbmQgdXNlcyB2YXJpYWJsZXMgInRlbXAxIiwidGVtcDIiLCAKICAgICAgICAgICAgInRlbXAzIiBhbmQgc28gZm9ydGggZGVwZW5kaW5nIG9uIGhvdyBtYW55IHRpbWVzIHRoZSB0eXBlbWFwIGlzIHVzZWQuCiAgICAgICAgICAgIFNvbWV0aW1lcyB5b3Ugd2FudCBhIHNpbmdsZSB2YXJpYWJsZSBpbnN0ZWFkLiAgVG8gZG8gdGhhdCwgdXNpbmcKICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBuYW1pbmcgc2NoZW1lOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgKihpbnQgX2dsb2JhbF90ZW1wKSB7CiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgSXMgdGhpcyBjYXNlLCBhIHNpbmdsZSB2YXJpYWJsZSBfZ2xvYmFsX3RlbXAgaXMgZW1pdHRlZCBpbiB0aGUKICAgICAgICAgICAgd3JhcHBlciBmdW5jdGlvbnMuICBJdCBpcyBzaGFyZWQgYWNyb3NzIGFsbCB0eXBlbWFwcy4gIFJlcGVhdGVkCiAgICAgICAgICAgIHR5cGVtYXBzIGRvIG5vdCByZXBsaWNhdGUgdGhlIHZhcmlhYmxlLS0tdGhleSB1c2UgdGhlIGZpcnN0IG9uZQogICAgICAgICAgICBlbWl0dGVkLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gdHlwZW1hcHMuICBJZiB5b3UgaGF2ZSB0aGlzIGNvZGUsCgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vIChpbnQgc29tZXZhciA9IDMpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBzb21ldmFyIGlzIG5vdyBlbWl0dGVkIGludG8gdGhlIHdyYXBwZXIgY29kZS4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgJWV4dGVuZCB0byBiZSBiZXR0ZXIgYmVoYXZlZCBpbiBuYW1lc3BhY2VzLiAgSWYgeW91IGhhdmUgY29kZQogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiYXIgewogICAgICAgICAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAKICAgICAgICAgICAgU1dJRyBtYXRjaGVzIHRoZSBibGFoKCkgbWV0aG9kIHRvIGEgQyBmdW5jdGlvbiBuYW1lZCAKICAgICAgICAgICAgdm9pZCBmb29fYmFyX2JsYWgoZm9vOjpiYXIgKnNlbGYpLgoKICAgICAgICAgICAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIG5vbi1uYW1lc3BhY2UgdmVyc2lvbi4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGVzOiBjcG9pbnRlci5pLCBjYXJyYXlzLmksIGNtYWxsb2MuaS4gIFRoZXNlCiAgICAgICAgICAgIHByb3ZpZGUgYWNjZXNzIHRvIEMgcG9pbnRlcnMgYW5kIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KICAgICAgICAgICAgU2VlIERvYy9NYW51YWwvTGlicmFyeS5odG1sIGZvciBkZXRhaWxzLgoKMDUvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBDIHR5cGUgY2hhciBubyBsb25nZXIgbWFwcyB0byBKYXZhIHR5cGUgYnl0ZSwgYnV0IHRvIEphdmEgdHlwZSBjaGFyLgogICAgICAgICAgICBJdCBpcyBub3cgdHJlYXRlZCBhcyBhIGNoYXJhY3RlciByYXRoZXIgdGhhbiBhIHNpZ25lZCBudW1iZXIuIFRoaXMgZml0cyBpbgogICAgICAgICAgICB3aXRoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzIGFuZCBpcyBhIG1vcmUgbmF0dXJhbCBtYXBwaW5nIGFzIGNoYXIqIGlzIAogICAgICAgICAgICBtYXBwZWQgYXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycy4gTm90ZSB0aGF0IHRoZSBDIHNpZ25lZCBjaGFyIHR5cGUgaXMgc3RpbGwKICAgICAgICAgICAgbWFwcGVkIHRvIGEgSmF2YSBieXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBJbXByb3ZlZCBjb25zdGFudHMgd3JhcHBpbmcuIENvbnN0YW50cyAoI2RlZmluZSBhbmQgJWNvbnN0YW50KSB2YWx1ZXMgCiAgICAgICAgICAgIGFyZSBub3cgb2J0YWluZWQgdGhyb3VnaCBhIEpOSSBjYWxsLiBQcmV2aW91c2x5IHRoZSB2YWx1ZSB3YXMgY29tcGlsZWQgYXMgCiAgICAgICAgICAgIEphdmEgY29kZSwgYnV0IHRoaXMgZGlkbid0IHdvcmsgZm9yIGFsbCBjYXNlcywgZWcgI2RlZmluZSAxMjNVTEwuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJvZ3VzIGVycm9yIG1lc3NhZ2Ugd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZSBhbmQgQysrCiAgICAgICAgICAgIGFjY2VzcyBzcGVjaWZpZXJzLiAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmFtZXNwYWNlcyBhbmQgZW51bXMgbm93IHdvcmsgY29ycmVjdGx5LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgZW51bSBCYXIgeyBBLCBCIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0eXBlcyBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIHRvIHNwZWNpZnkgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcwogICAgICAgICAgICBpbiB0aGUgcnVudGltZSB0eXBlIHN5c3RlbS4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICV0eXBlcyhGb28gPSBCYXIpOwoKICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgRm9vIGlzYSBCYXIuICAgIFVzaW5nIHRoaXMgaXMgcG90ZW50aWFsbHkgcXVpdGUgZGFuZ2Vyb3VzLgogICAgICAgICAgICBIb3dldmVyLCB0aGlzIGlzIHVzZWZ1bCBpbiBjZXJ0YWluIGNhc2VzIChhbmQgaW4gdGhlIFNXSUcgbGlicmFyeSkuCiAgICAgICAgICAgIAowNS8yMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVub2RlZmF1bHQgYW5kICVtYWtlZGVmYXVsdCBkaXJlY3RpdmVzIG5vdyByZXF1aXJlIGEgdHJhaWxpbmcgc2VtaWNvbG9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0OwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAlbWFrZWRlZmF1bHQ7CgogICAgICAgICAgICBJbiBhZGRpdGlvbiBib3RoIGRpcmVjdGl2ZXMgY2FuIHRha2UgYSBjbGFzcyBuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdCBGb287CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsgICAvKiBObyBkZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsgIC8qIERlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBnZW5lcmF0ZWQgKi8KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgSWYgeW91IGRvbid0IHVzZSB0aGUgdHJhaWxpbmcgc2VtaWNvbG9uLCB0aGluZ3Mgd2lsbCBteXN0ZXJpb3VzbHkgYnJlYWsuCgowNS8yMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vcmUgaW1wcm92ZW1lbnRzIHRvIHR5cGUgc3lzdGVtIGhhbmRsaW5nLiAgU1dJRyBub3cgY29ycmVjdGx5IGhhbmRsZXMKICAgICAgICAgICAgdGVtcGxhdGUgbmFtZXMgYW5kIHBhcmFtZXRlcnMgaW4gYSBuYW1lc3BhY2UuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGJhciB7IH07CiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKCiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGJhcjxJbnRlZ2VyPiAqeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhlIGdlbmVyYXRlZCBjb2RlLCBhbGwgb2YgdGhlIHR5cGVuYW1lcyBhcmUgcHJvcGVybHkgcXVhbGlmaWVkLgoKMDUvMTcvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBkZXByZWNhdGVkIGJyb2tlbiAtam5pYyBhbmQgLWpuaWNwcCBjb21tYW5kbGluZSBvcHRpb25zLiBUaGUgQyBvciBDKysgCiAgICAgICAgICAgIEpOSSBjYWxsaW5nIGNvbnZlbnRpb24gaXMgbm93IGRldGVybWluZWQgZnJvbSB0aGUgLWMrKyBjb21tYW5kbGluZSBvcHRpb24uCgowNS8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBKQ0FMTCBtYWNyb3Mgd2hpY2ggZXhpc3Qgc28gdGhhdCB0aGUgc2FtZSB0eXBlbWFwcyBjYW4gYmUgdXNlZAogICAgICAgICAgICBmb3IgZ2VuZXJhdGluZyBib3RoIHRoZSBDIGFuZCBDKysgSk5JIGNhbGxpbmcgY29udmVudGlvbnMgbm8gbG9uZ2VyIGFwcGVhcgogICAgICAgICAgICBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoaXMgaXMgYmVjYXVzZSB0aGUgb3V0cHV0IGlzIG5vdyBwYXNzZWQgdGhyb3VnaCB0aGUgCiAgICAgICAgICAgIFNXSUcgcHJlcHJvY2Vzc29yIHdoaWNoIGRvZXMgdGhlIG1hY3JvIGV4cGFuc2lvbiBmb3IgZWl0aGVyIEMgb3IgQysrIChkZXBlbmRpbmcKICAgICAgICAgICAgb24gd2hldGhlciAtYysrIGlzIHBhc3NlZCBvbiB0aGUgU1dJRyBjb21tYW5kbGluZSkuCgogICAgICAgICAgICBUaGUgZ2VuZXJhdGlvbiBvZiB0aGUgZnVuY3Rpb25zIHVzZWQgaW4gdGhlIGFycmF5IHR5cGVtYXBzIGhhdmUgYmVlbiBhZGp1c3RlZCAKICAgICAgICAgICAgdG8gdGFrZSBhY2NvdW50IG9mIHRoaXMuIFRoZSBzaWRlIGVmZmVjdCBpcyB0aGF0IGFueSB0eXBlbWFwcyB3aGljaCBjb250YWluZWQgCiAgICAgICAgICAgIEpDQUxMIG1hY3JvcyB3aXRoaW4gJXsgJX0gYnJhY2tldHMgd2lsbCBoYXZlIHRvIGJlIG1vdmVkIHdpdGhpbiB7fSBicmFja2V0cyAKICAgICAgICAgICAgc28gdGhhdCB0aGUgU1dJRyBwcmVwcm9jZXNzb3IgY2FuIGV4cGFuZCB0aGUgbWFjcm9zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDbGFzcyB0ZW1wbGF0ZXMgbWF5IG5vdyBiZSB1c2VkIGFzIHRlbXBsYXRlIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEM+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb2kpIEZvbzxpbnQsIEJhcj47CiAgICAgCiAgICAgICAgICAgIFNXSUcgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcgc3BlY2lhbCB3aXRoIHRoaXMtLS1pdCdzIGp1c3QKICAgICAgICAgICAgYW5vdGhlciB3YXkgb2Ygc3BlY2lmeWluZyBhIHRlbXBsYXRlIHBhcmFtZXRlci4gIAogICAgICAgICAKMDUvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciByZWZpbmVtZW50IG9mIHRlbXBsYXRlIHN1cHBvcnQuICBUZW1wbGF0ZSBwYXJhbWV0ZXIgbmFtZXMgYXJlIG5vIGxvbmdlcgogICAgICAgICAgICByZXF1aXJlZCBmb3IgdHlwZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxib29sPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE9idmlvdXNseSwgbmFtZXMgYXJlIHJlcXVpcmVkIGZvciB0ZW1wbGF0ZTxjbGFzcyBUPjsKCjA1LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IG1hY3JvIGV4cGFuc2lvbiBpbiB0eXBlbWFwcy4gIFRoZSBzZXF1ZW5jZToKCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcih0eXBlKQoKICAgICAgICAgICAgV2lsbCBleHBhbmQgaW50byB0aGUgU1dJRyB0eXBlIGRlc2NyaXB0b3Igc3RydWN0b3IgZm9yCiAgICAgICAgICAgIHRoZSBnaXZlbiB0eXBlLiAgVHlwZSBtYXkgYmUgYW55IGFic3RyYWN0IGRhdGF0eXBlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcihpbnQgKikKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKGludCAoKikoaW50LGRvdWJsZSkpCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcih2ZWN0b3I8aW50PiAqKQoKICAgICAgICAgICAgQ2F2ZWF0OiBJdCBpcyAqTk9UKiBjdXJyZW50bHkgbGVnYWwgdG8gdXNlIG90aGVyIHR5cGVtYXAKICAgICAgICAgICAgc3Vic3RpdHV0aW9uIHZhcmlhYmxlcyBpbiB0aGUgbWFjcm8uICBGb3IgZXhhbXBsZSAKICAgICAgICAgICAgJGRlc2NyaXB0b3IoJDFfdHlwZSkuCgogICAgICAgICAgICBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgbW9kaWZpY2F0aW9uIGlzIHRvIGJldHRlcgogICAgICAgICAgICBzdXBwb3J0IHR5cGVtYXBzIGZvciBjb250YWluZXIgb2JqZWN0cyBvciB0byBhbGxvdyB0eXBlbWFwcwogICAgICAgICAgICB0aGF0IG1pZ2h0IGJlIHBlcmZvcm1pbmcgdHlwZSBjb252ZXJzaW9ucy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgd3JhcHBpbmcgb2YgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUgdHlwZXMgaGFzIGJlZW4KICAgICAgICAgICAgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgQXJndW1lbnRzIG9mIHR5cGUgJ2NvbnN0IHByaW1pdGl2ZSAmJyBhcmUgbm93IHBhc3NlZAogICAgICAgICAgICBieSB2YWx1ZSBhcyBvcHBvc2VkIHRvIHBvaW50ZXJzLiAgUmV0dXJuIHZhbHVlcyBvZgogICAgICAgICAgICB0eXBlICdjb25zdCBwcmltaXRpdmUgJicgYXJlIHJldHVybmVkIGFzIHZhbHVlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHBvaW50ZXJzLgoKICAgICAgICAgICAgJ3ByaW1pdGl2ZScgaXMgYW55IG9uZSBvZiBpbnQsIHNob3J0LCBsb25nLCBsb25nIGxvbmcsCiAgICAgICAgICAgIGNoYXIsIGZsb2F0LCBkb3VibGUsIGJvb2wgKGFzIHdlbGwgYXMgdW5zaWduZWQgdmFyaWFudHMpLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYmVpbmcgbWFkZSB0byBiZXR0ZXIgc3VwcG9ydCBDKysgd3JhcHBpbmctLWVzcGVjaWFsbHkKICAgICAgICAgICAgY29kZSB0aGF0IG1ha2VzIHVzZSBvZiB0ZW1wbGF0ZXMgYW5kIHRoZSBTVEwuCiAgICAgICAgICAgIAowNS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCB0byBhY2Nlc3MgdGVtcGxhdGVzCiAgICAgICAgICAgIGluIGEgbmFtZXNwYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgY29tcGxleCB7CiAgICAgICAgICAgICAgICAgICAgICAgVCByZSwgaW07CiAgICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXgoVCBfciA9IFQoKSwgVCBfaSA9IFQoKSkgOiByZShfciksIGltKF9pKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICBUIHJlYWwoKSB7IHJldHVybiByZTsgfQogICAgICAgICAgICAgICAgICAgICAgIFQgaW1hZygpIHsgcmV0dXJuIGltOyB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoY29tcGxleCkgc3RkOjpjb21wbGV4PGRvdWJsZT47CgogICAgICAgICAgICBOb3RlOiBUaGVyZSBhcmUgc29tZSB2ZXJ5IHN1YnRsZSBuYW1lc3BhY2Uvc3ltYm9sIHRhYmxlIAogICAgICAgICAgICBtYW5hZ2VtZW50IGlzc3VlcyBpbnZvbHZlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcy4KICAgICAgICAgICAgSXQgbWF5IG5vdCB3b3JrIGluIGNlcnRhaW4gY2FzZXMuCgowNS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1lbWJlciB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciBzdXBwb3J0IGFkZGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4gCiAgICAgICAgICAgICAgIHN0cnVjdCBwYWlyIHsKICAgICAgICAgICAgICAgICBfVDEgZmlyc3Q7CiAgICAgICAgICAgICAgICAgX1QyIHNlY29uZDsKICAgICAgICAgICAgICAgICBwYWlyKCkgOiBmaXJzdChfVDEoKSksIHNlY29uZChfVDIoKSkgeyB9CiAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+IHBhaXIoY29uc3QgcGFpcjxfVTEsX1UyPiAmeCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUbyBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUsIHVzZSAldGVtcGxhdGUgYW5kICVleHRlbmQuCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGlzIGV4cGFuZHMgdGhlIGNvbnN0cnVjdG9yIGludG8gYSBkZWZhdWx0CiAgICAgICAgICAgIGNvcHkgY29uc3RydWN0b3I6CgogICAgICAgICAgICAgICAlZXh0ZW5kIHBhaXIgewogICAgICAgICAgICAgICAgICAldGVtcGxhdGUocGFpcikgcGFpcjxfVDEsX1QyPjsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgSGlnaGx5IGV4cGVyaW1lbnRhbC4gIE90aGVyIHVzZXMgbWF5IGJlIGJyb2tlbi4KCjA1LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICVleHRlbmQgKCVhZGRtZXRob2RzKSBkaXJlY3RpdmUgbm8gbG9uZ2VyIHdvcmtzIHVubGVzcwogICAgICAgICAgICBpdCBhcHBlYXJzIGluIHRoZSBwdWJsaWMgc2VjdGlvbiBvZiBhIGNsYXNzLiAgIEFuIGVycm9yCiAgICAgICAgICAgIG1lc3NhZ2UgaXMgbm93IGdlbmVyYXRlZCAoYXMgb3Bwb3NlZCB0byBhIHNlZ21lbnRhdGlvbiBmYXVsdCkuCgowNS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyAld2FybmZpbHRlcigpIGRpcmVjdGl2ZS4gIFRoaXMgZGlyZWN0aXZlIGF0dGFjaGVzIGEgd2FybmluZwogICAgICAgICAgICBmaWx0ZXIgdG8gc3BlY2lmaWMgZGVjbGFyYXRpb25zIGFuZCBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzCiAgICAgICAgICAgICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLCBhbmQgc28gZm9ydGguICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV3YXJuZmlsdGVyKDUwMSkgZm9vOyAgIC8vIFN1cHByZXNzIG92ZXJsb2FkZWQgd2FybmluZwogICAgICAgICAgICAgICBpbnQgZm9vKGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oZG91YmxlKTsgCgogICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoNTAxKSBPYmplY3Q6OmZvbyhkb3VibGUpOwogICAgICAgICAgICAgICBjbGFzcyBPYmplY3QgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyBmZWF0dXJlIG9ubHkgc3VwcHJlc3NlcyB3YXJuaW5ncyBpbiBsYXRlciBzdGFnZXMgb2YgY29kZQogICAgICAgICAgICBnZW5lcmF0aW9uLiAgSXQgZG9lcyBub3Qgc3VwcHJlc3Mgd2FybmluZ3MgcmVsYXRlZCB0byBwcmVwcm9jZXNzaW5nCiAgICAgICAgICAgIG9yIHBhcnNpbmcuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgc3VwcG9ydHMgQzk5IHZhcmlhZGljIHByZXByb2Nlc3NvciBtYWNyb3MuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgZGVidWdmKGZtdCwuLi4pIGZwcmludGYoc3RkZXJyLGZtdCxfX1ZBX0FSR1NfXykKCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCAiLi4uIiBpcyB1c2VkIHRvIGluZGljYXRlIHZhcmlhYmxlIGFyZ3VtZW50cyB3aGljaAogICAgICAgICAgICBhcmUgYWxsIHBsYWNlZCBpbnRvIHRoZSBzcGVjaWFsIGFyZ3VtZW50IG5hbWUgX19WQV9BUkdTX18gaW4KICAgICAgICAgICAgdGhlIG1hY3JvIGV4cGFuc2lvbi4gIAoKICAgICAgICAgICAgU1dJRyBhbHNvIGltcGxlbWVudHMgdGhlIEdOVSAoIyMpIGV4dGVuc2lvbiBmb3Igc3dhbGxvd2luZyB0aGUKICAgICAgICAgICAgcHJlY2VkaW5nIGNvbW1hIHdoZW4gX19WQV9BUkdTX18gaXMgZW1wdHkuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBkZWJ1Z2YoZm10LC4uLikgZnByaW50ZihzdGRlcnIsZm10LCAjI19fVkFfQVJHU19fKQoKICAgICAgICAgICAgSGVyZSBpcyBob3cgdGhpcyBpcyBleHBhbmRlZDoKCiAgICAgICAgICAgICAgIGRlYnVnZigiJWQiLCAzKSAgLS0+IGZwcmludGYoc3RkZXJyLCIlZCIsMykKICAgICAgICAgICAgICAgZGVidWdmKCJIZWxsbyIpICAtLT4gZnByaW50ZihzdGRlcnIsIkhlbGxvIiApCgogICAgICAgICAgICAobm90aWNlIHRoZSBkZWxldGVkIGNvbW1hKS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDgvMjAwMjogc2FtamFtIChTYW0gTGlkZGljb3R0KQogICAgICAgICAgICBNYW55IGNoYW5nZXMgdG8gcGhwIG1vZHVsZS4gIFNoYWRvdyBjbGFzc2VzIGFyZSBub3cgaW1wbGVtZW50ZWQKICAgICAgICAgICAgZW50aXJlbHkgaW4gbmF0aXZlIEMgYW5kIG5vIG5lZWQgZm9yIHBocC1jb2RlIHNoYWRvdyB3cmFwcGVycwogICAgICAgICAgICBQb3B1bGF0ZWQgdGVtcGxhdGUgY29uZmlnLm00IGFuZCBNYWtlZmlsZS5pbiBhcyBuZWVkZWQgYnkKICAgICAgICAgICAgcGhwaXplIGFyZSBnZW5lcmF0ZWQuCgowNS8wOC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQSBjb3B5IGNvbnN0cnVjdG9yIGlzIG5vdyB0dXJuZWQgaW50byBhICJjbG9uZSIKICAgICAgICAgICAgaW5zdGFuY2UgbWV0aG9kIChzZWUgRGF2ZSdzIGNoYW5nZSBmb3IgY29weSBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgZGF0ZWQgNC83LzIwMDIpLiBUaGlzIHNlZW1zIGxpa2UgdGhlIGFwcHJvcHJpYXRlIHRoaW5nCiAgICAgICAgICAgIHRvIGRvIGZvciBSdWJ5IGNvZGUuCgowNS8wOC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgWyA1NTM4NjQgXSBJbmxpbmUgZGVzdHJ1Y3RvciBjb2RlIG5vdCB3cml0dGVuLgoKMDUvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICAlaWdub3JlIGJlaGF2ZXMgYmV0dGVyIHdpdGggY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycywgYW5kIHRoZQogICAgICAgICAgICB0eXBlIHN5c3RlbSBpbiBnZW5lcmFsLiAgIEZvciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLAogICAgICAgICAgICAlaWdub3JlIG5vdyBzdXBwcmVzc2VzIHRoZSBjcmVhdGlvbiBvZiBhIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgb3IgZGVzdHJ1Y3Rvci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlaWdub3JlIH5Gb287CiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbygpOwogICAgICAgICAgICAgICAgICAgIH5Gb28oKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIFNXSUctMS4zLjExLCB+Rm9vKCkgc2ltcGx5ICJkaXNhcHBlYXJlZCIgYW5kIHRoZSBjb2RlIGdlbmVyYXRvcgogICAgICAgICAgICBjcmVhdGVkIGEgd3JhcHBlciBmb3IgYSBkZWZhdWx0IGRlc3RydWN0b3IgKGFzIGlmIGl0IHdhcyBuZXZlcgogICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgaW50ZXJmYWNlKS4gIEluIFNXSUctMS4zLjEyLCAlaWdub3JlIHN1cHByZXNzZXMKICAgICAgICAgICAgdGhlIGNyZWF0aW9uIG9mIGEgZGVzdHJ1Y3RvciBpZiBvbmUgaXMgYWN0dWFsbHkgZGVmaW5lZC4gCgogICAgICAgICAgICBTaW1pbGFybHksIGV2ZW4gdGhvdWdoIGEgZGVjbGFyYXRpb24gaXMgaWdub3JlZCwgaW5mb3JtYXRpb24KICAgICAgICAgICAgbWF5IHN0aWxsIGJlIG5lZWRlZCB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMuIEZvciBleGFtcGxlLCBoZXJlCiAgICAgICAgICAgIGlzIGEgdmVyeSBzdWJ0bGUgZXJyb3IgdGhhdCBpcyBmaXhlZCBieSB0aGlzIGNoYW5nZToKCiAgICAgICAgICAgICAgICAlaWdub3JlIHN0ZDo6c3RyaW5nOyAgICAgICAgIC8vIFByZXZlbnQgY2xhc3Mgd3JhcHBpbmcKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgY2xhc3Mgc3RyaW5nIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHN0cmluZyAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZvaWQgZm9vKHN0ZDo6c3RyaW5nICpzKTsgICAvLyBCcm9rZW4uCgogICAgICAgICAgICBCZWZvcmUgdGhpcyBmaXgsICVpZ25vcmUgd291bGQgY2F1c2UgdGhlIGNsYXNzIGRlZmluaXRpb24gdG8gZGlzYXBwZWFyLgogICAgICAgICAgICBUaGlzLCBpbiB0dXJuLCB3b3VsZCBjYXVzZSB0aGUgdHlwZW1hcCB0byBiZSBtaXNhcHBsaWVkLiAKIAowNS8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGNoYW5nZXMgdG8gJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMKICAgICAgICAgICAgZm9yIGJldHRlciBzdXBwb3J0IG9mIGRlc3RydWN0b3JzLiAgRGVzdHJ1Y3RvcnMgY2FuIG5vdyBiZSBwcmVjaXNlbHkKICAgICAgICAgICAgdGFnZ2VkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6fkZvbzsKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoImFjdGlvbiIpIH5CYXIgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAqRGV2ZWxvcGVyIHdhcm5pbmcqIAogICAgICAgICAgICBPcGVyYXRpb25zIHN1Y2ggYXMgcmVuYW1pbmcgYW5kIGZlYXR1cmUgYXR0YWNobWVudCBmb3IgY2xhc3NlcyB1c2VkIHRvCiAgICAgICAgICAgIGJlIGFwcGxpZWQgdG8gZGVzdHJ1Y3RvcnMgYXMgd2VsbC4gIEZvciBpbnN0YW5jZSwgaWYgeW91IGRpZCB0aGlzOgogCiAgICAgICAgICAgICAgICAgJXJlbmFtZShCYXIpIEZvbzsKCiAgICAgICAgICAgIFRoZSBvcGVyYXRpb24gYXBwbGllZCB0byB0aGUgY2xhc3MgaXRzZWxmLCB0aGUgY29uc3RydWN0b3IsIGFuZAogICAgICAgICAgICB0aGUgZGVzdHJ1Y3Rvci4gICBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZS4gIE5vdyBzdWNoIG9wZXJhdGlvbnMKICAgICAgICAgICAgd2lsbCBvbmx5IGFwcGx5IHRvIHRoZSBjbGFzcyBhbmQgdGhlIGNvbnN0cnVjdG9yLiAgTm90ZTogaWYgeW91CiAgICAgICAgICAgIHdlcmUgcmVseWluZyBvbiB0aGlzIGZvciBjbGFzcyByZW5hbWluZywgYmUgYXdhcmUgdGhhdCByZW5hbWVkCiAgICAgICAgICAgIGNsYXNzZXMgc2hvdWxkIHJlYWxseSBvbmx5IGJlIGhhbmRsZWQgYXQgdGhlIGxldmVsIG9mIHRoZSBjbGFzcyBpdHNlbGYKICAgICAgICAgICAgYW5kIG5vdCB0aGUgbGV2ZWwgb2YgaW5kaXZpZHVhbCBkZWNsYXJhdGlvbnMgaW4gdGhlIGNsYXNzIChhbHRob3VnaAogICAgICAgICAgICB0aGV5IGNhbiBiZSByZW5hbWVkIGluZGl2aWR1YWxseSBpZiBuZWVkZWQpLiAgQXMgZmFyIGFzIEkga25vdywKICAgICAgICAgICAgdGhlIExhbmd1YWdlIGNsYXNzIGlzIGFscmVhZHkgdGFraW5nIGNhcmUgb2YgdGhpcyBjYXNlIGNvcnJlY3RseS4KCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IHNldCBvZiB0ZXN0cy4gIFRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL2Vycm9ycyBkaXJlY3RvcnkgY29udGFpbnMKICAgICAgICAgICAgdGVzdHMgdGhhdCB0cnkgdG8gZXhlcmNpc2UgYWxsIG9mIFNXSUcncyBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcy4KCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3RhcnQgb2YgYSB3YXJuaW5nIGZyYW1ld29yay4gIFdhcm5pbmcgbWVzc2FnZXMgYXJlIG5vdyBhc3NpZ25lZCBudW1lcmljIHZhbHVlcwogICAgICAgICAgICB0aGF0IGFyZSBzaG93biBpbiB3YXJuaW5nIG1lc3NhZ2VzLiAgIFRoZXNlIGNhbiBiZSBzdXBwcmVzc2VkIHVzaW5nIHRoZQogICAgICAgICAgICAtdyBvcHRpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3dpZyAtdzMwMiBleGFtcGxlLmkKICAgICAgICAgICAgICAgICBzd2lnIC13MzAyLDMwNSBleGFtcGxlLmkKCiAgICAgICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSAjcHJhZ21hIHByZXByb2Nlc3NvciBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSB0aGlzOgoKICAgICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuPTMwMgogICAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49MzAyLDMwNQoKICAgICAgICAgICAgTm90ZTogU2luY2UgU1dJRyBpcyBhIG11bHRpLXBhc3MgY29tcGlsZXIsIHRoaXMgcHJhZ21hIHNob3VsZAogICAgICAgICAgICBvbmx5IGJlIHVzZWQgdG8gY2hhbmdlIGdsb2JhbCBzZXR0aW5ncyBvZiB0aGUgd2FybmluZyBmaWx0ZXIuICBJdCBzaG91bGQKICAgICAgICAgICAgbm90IGJlIHVzZWQgdG8gc2VsZWN0aXZlbHkgZW5hYmxlL2Rpc2FibGUgd2FybmluZ3MgaW4gYW4gaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICAgIFRoZSBoYW5kbGluZyBvZiAjcHJhZ21hIG9jY3VycyBpbiB0aGUgQysrIHByZXByb2NvZXNzb3IgYW5kIGFmZmVjdHMgYWxsIAogICAgICAgICAgICBzdWJzZXF1ZW50IHN0YWdlcyBvZiBjb21waWxhdGlvbi4KCiAgICAgICAgICAgIFRoZSAtV2FsbCBvcHRpb24gdHVybnMgb24gYWxsIHdhcm5pbmdzIGFuZCBvdmVycmlkZXMgYW55IGZpbHRlcnMgdGhhdAogICAgICAgICAgICBtaWdodCBoYXZlIGJlZW4gc2V0LgoKICAgICAgICAgICAgV2FybmluZ3MgY2FuIGJlIGlzc3VlZCBmcm9tIGFuIGludGVyZmFjZSB1c2luZyAld2Fybi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAld2FybiAiMTEwOiVzZWN0aW9uIGlzIGRlcHJlY2F0ZWQiCgogICAgICAgICAgICBUaGUgZmlyc3QgcGFydCBvZiBhIHdhcm5pbmcgbWVzc2FnZSBpcyBhbiBvcHRpb25hbCB3YXJuaW5nIG51bWJlci4KICAgICAgICAgICAgQSBjb21wbGV0ZSBzZXQgb2Ygd2FybmluZyBudW1iZXJzIGlzIGZvdW5kIGluIFNvdXJjZS9JbmNsdWRlL3N3aWd3YXJuLmguCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW50ZXJuYWwgcGFyc2luZyBjaGFuZ2UuICAgRGlyZWN0aXZlcyB0byBpbmNsdWRlIGZpbGVzIG5vdyB1c2UgYnJhY2tldHMgWyAuLi4gXQogICAgICAgICAgICBpbnN0ZWFkIG9mIHsgLi4uIH0uICAgCgogICAgICAgICAgICAgICAgICAlaW5jbHVkZWZpbGUgImZvby5pIiBbCiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBdCgogICAgICAgICAgICBUaGUgdXNlIG9mIHsgLi4uIH0gd2FzIGEgYmFkIGNob2ljZSBiZWNhdXNlIHRoZXkgd2VyZSBpbmNsdWRlZCBpbXBsaWNpdGx5IGJ5CiAgICAgICAgICAgIHRoZSBwcmVwcm9jZXNzb3IgYW5kIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBwcm9wZXJseSBkZXRlY3QgbGVnaXRpbWF0ZSBtaXNzaW5nICd9JyAKICAgICAgICAgICAgZXJyb3JzLgoKMDQvMTYvMjAwMi0KMDUvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIEV1cm9wZWFuIFRvdXI6IFBhcmlzLUFtc3RlcmRhbS1CYXRoLgoKMDQvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGhhcyBiZWVuIHJlbmFtZWQgdG8gJWV4dGVuZC4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAlZXh0ZW5kIEZvbyB7CiAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICBpbnQgYmFyKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE1vdGl2YXRpb246IHRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgZm9yIG1hbnkKICAgICAgICAgICAgb3RoZXIgdGFza3MgaW5jbHVkaW5nIGFkZGluZyBzeW50aGVzaXplZCBhdHRyaWJ1dGVzLCBjb25zdHJ1Y3RvcnMsCiAgICAgICAgICAgIGFuZCB0eXBlbWFwcy4gQmVjYXVzZSBvZiB0aGlzLCAiYWRkbWV0aG9kcyIgaXMgc29tZXdoYXQgbWlzbGVhZGluZy4KICAgICAgICAgICAgJWV4dGVuZCBtb3JlIHByZWNpc2VseSBkZXNjcmliZXMgdGhpcyBvcGVyYXRpb24tLS1leHRlbnNpb24gb2YgYQogICAgICAgICAgICBjbGFzcyBvciBzdHJ1Y3R1cmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgJWFkZG1ldGhvZHMgc3RpbGwgd29ya3MgdmlhIGEgbWFjcm8gZGVmaW5pdGlvbi4gICBIb3dldmVyLAogICAgICAgICAgICBhIHdhcm5pbmcgbWVzc2FnZSBtYXkgYmUgZ2VuZXJhdGVkLiAgIEVycm9ycyBpbnZvbHZpbmcgJWFkZG1ldGhvZHMKICAgICAgICAgICAgd2lsbCBhY3R1YWxseSByZWZlciB0byB0aGUgJWV4dGVuZCBkaXJlY3RpdmUuICAKICAgICAgICAgICAgCjA0LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRnVydGhlciByZWZpbmVtZW50IG9mIHRoZSB0eXBlIHN5c3RlbS4gIFR5cGVkZWYgbm93CiAgICAgICAgICAgIHByb3BhZ2F0ZXMgdGhyb3VnaCBmdW5jdGlvbnMsIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucywKICAgICAgICAgICAgYW5kIHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgdm9pZCBmb28oaW50ICgqeCkoaW50KSwgSW50ZWdlciAoKnkpKEludGVnZXIpKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYXJndW1lbnRzICd4JyBhbmQgJ3knIGhhdmUgZXhhY3RseQogICAgICAgICAgICB0aGUgc2FtZSB0eXBlIChhbmQgd291bGQgb2J2aW91c2x5IGFjY2VwdCBvYmplY3RzCiAgICAgICAgICAgIG9mIGVpdGhlciB0eXBlKS4KCiAgICAgICAgICAgIFNpbWlsYXJseSwgY29uc2lkZXIgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CiAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCAoRm9vOjoqeCkoaW50KSwgaW50IChCYXI6Oip5KShpbnQpKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYXJndW1lbnRzIHggYW5kIHkgYXJlIHRoZSBzYW1lIAogICAgICAgICAgICB0eXBlICh2aWEgdHlwZWRlZikuCiAgICAgICAgICAgIAowNC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZSBpZiBhbnkgcGFydCBvZgogICAgICAgICAgICBhbiBleHByZXNzaW9uIGludm9sdmVzIHZhbHVlcyBmcm9tIGEgcHJpdmF0ZSBwYXJ0IG9mIGEgY2xhc3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgWDsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludCBhLCBpbnQgYiA9IFgpOyAgIC8vIFdhcm5pbmcKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGlzIGlnbm9yZWQuICBUaGVyZQogICAgICAgICAgICBhcmUgd29ya2Fyb3VuZHMsIGJ1dCB0aGV5IGFyZSByYXRoZXIgY2x1bXN5LiAgRm9yIGluc3RhbmNlLAogICAgICAgICAgICB5b3UgbWlnaHQgZG8gdGhpczoKCiAgICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoImFjdGlvbiIpIGJsYWgoaW50LGludCkgewogICAgICAgICAgICAgICAgICAgICAgIGlmICgkbmFyZ3MgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJsYWgoYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBibGFoKGFyZzEsYXJnMik7CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50IGEsIGludCBiID0gMCk7CgoKMDQvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBVc2Ugb2YgdGhlICVpbmxpbmUgZGlyZWN0aXZlIGluc2lkZSBhIG5hbWVzcGFjZSBpcwogICAgICAgICAgICBmb3JiaWRkZW4gYW5kIG5vdyBnZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZS4gICBUaGlzIGlzCiAgICAgICAgICAgIG5vdCBhbGxvd2VkIHNpbmNlIHRoZSBpbmxpbmVkIGNvZGUgdGhhdCBpcyBlbWl0dGVkIGlzCiAgICAgICAgICAgIG5vdCBwbGFjZWQgaW5zaWRlIGEgbmFtZXNwYWNlLiAgVGhpcyBjb25mdXNlcyBvdGhlcgogICAgICAgICAgICBzdGFnZXMgb2YgcGFyc2luZy4KICAgICAgICAgICAgICAgICAgICAKMDQvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGJ1ZyBmaXhlcyB0byBjYXN0aW5nIG9wZXJhdGlvbnMgYW5kIGV4cHJlc3Npb24KICAgICAgICAgICAgcGFyc2luZy4gICBEdWUgdG8gc29tZSBwYXJzaW5nIGlzc3VlcywgaXQgaXMgbm90IAogICAgICAgICAgICBjdXJyZW50bHkgcG9zc2libGUgdG8gdXNlIGNhc3RzIGZvciBhbGwgcG9zc2libGUKICAgICAgICAgICAgZGF0YXR5cGVzLiAgIEhvd2V2ZXIsIHRoZSBjb21tb24gY2FzZXMgd29yay4KCjA0LzIwLzIwMDI6IGJlYXpsZXkgKEFtc3RlcmRhbSkKICAgICAgICAgICAgTWVtYmVyIHRlbXBsYXRlcyBub3cgd29yay4gIFNpbXBseSB1c2UgdGhlICV0ZW1wbGF0ZQogICAgICAgICAgICBkaXJlY3RpdmUgaW5zaWRlIGEgY2xhc3Mgb3IgJWFkZG1ldGhvZHMgdG8gY3JlYXRlCiAgICAgICAgICAgIGluc3RhbnRpYXRpb25zIChzZWUgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sKS4gIFN1cHBvcnRpbmcKICAgICAgICAgICAgdGhpcyB3YXMgZWFzeS0tLWVhcmxpZXIgY2hhbmdlcyB0byB0ZW1wbGF0ZXMgbWFkZSBpdAogICAgICAgICAgICBwb3NzaWJsZSB1c2luZyBvbmx5IGEgdHdvLWxpbmUgbW9kaWZpY2F0aW9uIHRvIHRoZSBwYXJzZXIKICAgICAgICAgICAgYW5kIGEgZmV3IG1pbm9yIG1vZGlmaWNhdGlvbnMgZWxzZXdoZXJlLiAgSG1tbSwgY29tZSB0byAKICAgICAgICAgICAgdGhpbmsgb2YgaXQsIHRoZSBzbW9rZSB3YXMgcmF0aGVyIHRoaWNrIGluIHRoYXQgSW50ZXJuZXQgImNhZmUiLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNC8xOS8yMDAyOiBiZWF6bGV5IChUR1YpCiAgICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdmVjdG9yPGludCwxMDA+OwoKICAgICAgICAgICAgU2ltcGxlIG51bWJlcnMgYW5kIHN0cmluZ3MgY2FuIGJlIHVzZWQgd2l0aCB0aGUgJXRlbXBsYXRlCiAgICAgICAgICAgIGRpcmVjdGl2ZSBhcyB3ZWxsLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQxMDApIHZlY3RvcjxpbnQsMTAwPjsKCiAgICAgICAgICAgIE5vdGU6IEFyaXRobWV0aWMgZXhwcmVzc2lvbnMgYXJlIG5vdCBjdXJyZW50bHkgYWxsb3dlZC4KICAgICAgICAgICAgCiAgICAgICAgICAgIERlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzIG5vdyB3b3JrIGFuZCBkbyBub3QgaGF2ZSB0bwogICAgICAgICAgICBiZSBnaXZlbiB0byAldGVtcGxhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgIAowNC8xOC8yMDAyOiBiZWF6bGV5IChQYXJpcykKICAgICAgICAgICAgQ2hhbmdlIGluIGludGVybmFsIHRlbXBsYXRlIGhhbmRsaW5nLiAgVGVtcGxhdGUKICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgbm93IGZ1bGx5IGludGVncmF0ZWQgaW50byB0aGUgdHlwZQogICAgICAgICAgICBzeXN0ZW0gYW5kIGFyZSBhd2FyZSBvZiB0eXBlZGVmcywgZXRjLiAgVGhpcyBidWlsZHMKICAgICAgICAgICAgdXBvbiB0aGUgY2hhbmdlIGJlbG93LiAgIAoKICAgICAgICAgICAgKioqIERFVkVMT1BFUiBXQVJOSU5HICoqKgogICAgICAgICAgICBXb3JkIG9mIGNhdXRpb24gdG8gbGFuZ3VhZ2UgbW9kdWxlIHdyaXRlcnMuICBUaGUgIm5hbWUiCiAgICAgICAgICAgIHBhcmFtZXRlciBvZiBjZXJ0YWluIHBhcnNlIHRyZWUgbm9kZXMgKGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikKICAgICAgICAgICAgbWF5IGJlIHBhcmFtZXRlcml6ZWQgd2l0aCB0eXBlcy4gICBUaGlzIHBhcmFtZXRlcml6YXRpb24gaXMKICAgICAgICAgICAgZG9uZSB1c2luZyBTV0lHIHR5cGUtc3RyaW5ncyBhbmQgbm90IHRoZSB1bmRlcmx5aW5nIEMgdmVyc2lvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICBpbnQgbWF4PGludCAqPihpbnQgKixpbnQgKikgIAoKICAgICAgICAgICAgaGFzIGEgbmFtZSBvZiAibWF4PChwLmludCk+Ii4gIElmIHlvdSB1c2UgdGhlIG5hbWUgZGlyZWN0bHksCiAgICAgICAgICAgIHlvdSBtYXkgZ2V0IHN5bnRheCBlcnJvcnMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiAgVG8gZml4IHRoaXMsCiAgICAgICAgICAgIHVzZSBTd2lnVHlwZV9uYW1lc3RyKG5hbWUpIHRvIGNvbnZlcnQgYSBwYXJhbWV0ZXJpemVkIG5hbWUgCiAgICAgICAgICAgIHRvIGEgQyBuYW1lIHdpdGggdmFsaWQgc3ludGF4LiAgVGhlIGludGVybmFsIHZlcnNpb24gaXMKICAgICAgICAgICAgdXNlZCB0byByZWR1Y2UgdGVtcGxhdGUgdHlwZXMgdG8gYSBjb21tb24gcmVwcmVzZW50YXRpb24gCiAgICAgICAgICAgIGFuZCB0byBoYW5kbGUgaXNzdWVzIG9mIHR5cGVkZWYuCiAgICAgICAgICAgIAowNC8xNi8yMDAyOiBiZWF6bGV5IChzb21ld2hlcmUgb3ZlciB0aGUgQXRsYW50aWMpCiAgICAgICAgICAgIEVuaGFuY2VtZW50IG9mIHR5cGVkZWYgcmVzb2x1dGlvbi4gIFRoZSB0eXBlIHN5c3RlbSBpcyBub3cKICAgICAgICAgICAgYXdhcmUgb2YgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBmb28odmVjdG9yPGludD4gKngsIHZlY3RvcjxJbnRlZ2VyPiAqeSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHZlY3RvcjxpbnQ+IGFuZCB2ZWN0b3I8SW50ZWdlcj4gYXJlCiAgICAgICAgICAgIHRoZSBzYW1lIHR5cGUuICAgVGhlcmUgaXMgc29tZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoaXMKICAgICAgICAgICAgbWVjaGFuaXNtIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgYSB0eXBlbWFwIGRlZmluZWQgZm9yIHZlY3RvcjxpbnQ+ICogd291bGQgYXBwbHkgdG8gZWl0aGVyIHR5cGUuCiAgICAgICAgICAgIEhvd2V2ZXIsIGEgdHlwZW1hcCBmb3IgdmVjdG9yPEludGVnZXI+ICogd291bGQgb25seSBhcHBseSB0bwogICAgICAgICAgICB0aGF0IHR5cGUuCgogICAgICAgICAgICBUeXBlZGVmcyBhbmQgdHlwZW1hcHMgYW5kIG1hdGNoZWQgYnkgbGVmdC1tb3N0IGV4cGFuc2lvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHZlY3RvcjxJbnRlZ2VyLEludGVnZXI+IC0tPiAKICAgICAgICAgICAgICB2ZWN0b3I8aW50LCBJbnRlZ2VyPiAtLT4KICAgICAgICAgICAgICB2ZWN0b3I8aW50LCBpbnQ+CgoKMDQvMjQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBDaGFuZ2VzIHRvIEphdmEgc2hhZG93IGNsYXNzZXMuCiAgICAgICAgICAgIE92ZXJjb21lcyBhIGJ1ZyB3aGVyZSB0aGUgbW9kdWxlIGFzc3VtZWQgdGhhdCBhIHBvaW50ZXIgdG8gYSBkZXJpdmVkCiAgICAgICAgICAgIGNsYXNzIGNvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYSBwb2ludGVyIHRvIGEgYmFzZSBjbGFzcy4gVGhhbmtzIAogICAgICAgICAgICB0byBTdGVwaGVuIE1jQ2F1bCBmb3IgYW5hbHlzaW5nIHRoZSBidWcgYW5kIHN1Ym1pdHRpbmcgcGF0Y2hlcy4KCiAgICAgICAgICAgIEEgY29uc2VxdWVuY2UgaXMgdGhhdCB0aGUgZ2V0Q1B0cigpIG1ldGhvZCBpbiBlYWNoIHNoYWRvdyBjbGFzcyBoYXMKICAgICAgICAgICAgZGlzYXBwZWFyZWQgYW5kIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBnZXRDUHRyWFhYKCksIHdoZXJlIFhYWCBpcyB0aGUgCiAgICAgICAgICAgIHNoYWRvdyBjbGFzcyBuYW1lLiBJZiB5b3UgaGF2ZSBjb2RlIHRoYXQgcHJldmlvdXNseSB1c2VkIGdldENQdHIoKSwgCiAgICAgICAgICAgIGFuZCB0aGUgYXNzb2NpYXRlZCBjbGFzcyBpcyB3cmFwcGluZyBhIEMgc3RydWN0IG9yIGEgQysrIGNsYXNzIHRoYXQKICAgICAgICAgICAgaXMgbm90IGludm9sdmVkIGluIGFuIGluaGVyaXRhbmNlIGNoYWluLCBqdXN0IHVzZSB0aGUgbmV3IG1ldGhvZC4gSWYKICAgICAgICAgICAgaG93ZXZlciwgdGhlIGNsYXNzIGlzIGludm9sdmVkIGluIGFuIGluaGVyaXRhbmNlIGNoYWluLCB5b3UnbGwgaGF2ZQogICAgICAgICAgICB0byBjaG9vc2Ugd2hpY2ggcG9pbnRlciB5b3UgcmVhbGx5IHdhbnQuIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IAogICAgICAgICAgICBoYXMgYmVlbiBicm9rZW4gYXMgbm90IHVzaW5nIHRoZSBjb3JyZWN0IHBvaW50ZXIgY2FuIGxlYWQgdG8gd2VpcmQgYnVncwogICAgICAgICAgICB0aHJvdWdoIGlsbC1kZWZpbmVkIGJlaGF2aW91ci4gSWYgeW91IGFyZSBzdXJlIHlvdSB3YW50IHRoZSBvbGQgbWV0aG9kcywgCiAgICAgICAgICAgIHlvdSBjb3VsZCBhZGQgdGhlbSBiYWNrIGludG8gYWxsIHNoYWRvdyBjbGFzc2VzIGJ5IGFkZGluZyB0aGlzIGF0IHRoZSAKICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHlvdXIgaW50ZXJmYWNlIGZpbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIGFsbHNoYWRvd2NvZGU9JXsKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyKCl7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgUGxlYXNlIHNlZSBlbnRyeSBkYXRlZCAwNy8yMy8yMDAyIHRvIHNlZSBob3cgdG8gZG8gdGhpcyBhZnRlciB0aGUgZGVwcmVjYXRpb24KICAgICAgICAgICAgb2YgdGhlIGFsbHNoYWRvd2NvZGUgcHJhZ21hLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDQvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIHJlZmVyZW5jZXMuICAgRGVjbGFyYXRpb25zIHN1Y2ggCiAgICAgICAgICAgIGFzIHRoaXMgc2hvdWxkIG5vdyB3b3JrOgoKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNvbnN0IHN0cmluZyAmeCA9ICJIZWxsbyIpOwoKMDQvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCB0eXBlbWFwICQqIHN1YnN0aXR1dGlvbnMgZm9yIHR5cGVtYXBzIGludm9sdmluZyBhcnJheXMuCiAgICAgICAgICAgIFJlcXVlc3RlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjA0LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gaXMgbm93IHN1cHBvcnRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgV2hlbiB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBpcyB1c2VkLCBpdCB3aWxsIHVzZSBhIHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgIGlmIG9uZSBpcyBkZWZpbmVkLiAgIFRoZXJlIGFyZSBzdGlsbCBzb21lIGxpbWl0YXRpb25zLiBQYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICBBIHRlbXBsYXRlIG9mIHR5cGUgPHZvaWQgKj4gZG9lcwogICAgICAgICAgICBub3QgbWF0Y2ggYWxsIHBvaW50ZXJzLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNC8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1ham9yIGNoYW5nZSB0byB0ZW1wbGF0ZSB3cmFwcGluZyBpbnRlcm5hbHMuIFRlbXBsYXRlIGRlY2xhcmF0aW9ucyBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHByb2Nlc3NlZCBhcyBtYWNyb3MgYnV0IG5vdyByZXN1bHQgaW4gcmVhbCBwYXJzZS10cmVlCiAgICAgICAgICAgIG5vZGVzLiAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgZXhwYW5kcyB0aGVzZSBub2RlcyBpbnRvIGEKICAgICAgICAgICAgc3BlY2lmaWMgaW5zdGFudGlhdGlvbi4gICBUaGlzIGNoYW5nZSBlbmFibGVzIGEgbnVtYmVyIG9mCiAgICAgICAgICAgIG5ldyBhbmQgaW50ZXJlc3RpbmcgY2FwYWJpbGl0aWVzOgoKICAgICAgICAgICAgRGlyZWN0aXZlcyBzdWNoIGFzICVyZW5hbWUsICVmZWF0dXJlLCBhbmQgJWFkZG1ldGhvZHMgY2FuCiAgICAgICAgICAgIG5vdyBiZSBhcHBsaWVkIHRvIHVuaW5zdGFudGlhdGVkIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcnNpemUpIHZlY3Rvcjo6YmFyKGNoYXIgKmJ1ZiwgaW50IGxlbik7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqYnVmKTsKICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpidWYsIGludCBsZW4pOyAgIC8vIFJlbmFtZWQKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoaW50dmVjdG9yKSB2ZWN0b3I8aW50PjsgICAvLyBSZW5hbWluZyBjYXJyaWVzIHRocm91Z2gKCiAgICAgICAgICAgIAogICAgICAgICAgICBCeSBwYXJzaW5nIHRlbXBsYXRlcyBpbnRvIGFuIGludGVybmFsIGRhdGEgc3RydWN0dXJlLCBpdCB3aWxsCiAgICAgICAgICAgIGJlIHBvc3NpYmxlIHRvIHN1cHBvcnQgc3BlY2lhbGl6YXRpb24gKGFuZCBtYXliZSBwYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbCBhbmQgYSB3b3JrIGluIHByb2dyZXNzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIEluIFNXSUctMS4zLjExLCB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMgd2VyZSBzaW1wbHkgcHJvY2Vzc2VkCiAgICAgICAgICAgIGFzIHdlaXJkIG1hY3Jvcy4gIE5vIG90aGVyIGluZm9ybWF0aW9uIHdhcyByZXRhaW5lZC4gICBUaGlzIAogICAgICAgICAgICBtYWRlIGl0IGltcG9zc2libGUgdG8gc3VwcG9ydCBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzIGFuZCAKICAgICAgICAgICAgY29tcGxpY2F0ZWQgbWFueSBvdGhlciBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24uCgowNC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byB0ZW1wbGF0ZSBjbGFzcyB3cmFwcGluZy4gICBUaGVyZSB3ZXJlIGEgdmFyaWV0eSBvZgogICAgICAgICAgICAiaXNzdWVzIiB3aXRoIHRoZSBvbGQgYXBwcm9hY2ggcmVsYXRlZCB0byBwYXJzaW5nLCB0aGUgdHlwZQogICAgICAgICAgICBzeXN0ZW0sIGFuZCBuYW1lc3BhY2VzLiAgIFRoZXNlIGNoYW5nZXMgYXJlIG1lYW50IHRvIHJlY3RpZnkKICAgICAgICAgICAgc29tZSBvZiB0aGVzZSBwcm9ibGVtczoKCiAgICAgICAgICAgIEEgc3BlY2lmaWMgaW5zdGFudGlhdGlvbiBvZiBhIHRlbXBsYXRlIGNhbiBub3cgYmUgc3BlY2lmaWVkCiAgICAgICAgICAgIGJ5IGluY2x1ZGluZyB0aGUgY2xhc3MgaW5saW5lIGxpa2UgdGhpczoKIAogICAgICAgICAgICAgICAgICBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgIH52ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAuLi4gd2hhdGV2ZXIgLi4uCgkgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyBpcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiwgYnV0IHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMKICAgICAgICAgICAgbm90IHlldCBpbXBsZW1lbnRlZC4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGV4cGFuZCByb3VnaGx5IGFzCiAgICAgICAgICAgIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgICAgICAlcmVuYW1lKHZlY2ludD4gdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAgY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBzaW1wbHkgYnVpbGRzIHVwb24gdGhlIGNvZGUgYWJvdmUgKHRlbXBsYXRlcwogICAgICAgICAgICBpbmNsdWRlZCBpbmxpbmUpLgoKICAgICAgICAgICAgVGhpcyBtb2RpZmllZCBhcHByb2FjaCB0byB3cmFwcGluZyBmaXhlcyBzb21lIHN1YnRsZSB0eXBlCiAgICAgICAgICAgIGlzc3Vlcy4gIEZvciBpbnN0YW5jZSwgeW91IGNhbiBub3cgZGVmaW5lIHR5cGVtYXBzIGFuZCB0eXBlZGVmcwogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8aW50PiBpbnR2ZWN0b3I7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludHZlY3RvciAqdik7ICAgLy8gR2V0cyB0aGUgYWJvdmUgdHlwZW1hcAoKICAgICAgICAgICAgVGhpcyBkaWQgbm90IHdvcmsgaW4gU1dJRy0xLjMuMTEgZHVlIHRvIGEgcGVjdWxpYXJpdHkgb2YKICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGltcGxlbWVudGF0aW9uLgoKICAgICAgICAgICAgJXRlbXBsYXRlKG5hbWUpIG5vIGxvbmdlciBpbnN0YWxscyB0aGUgdGVtcGxhdGUgYXMgYSBjbGFzcwogICAgICAgICAgICB3aXRoIG5hbWUgIm5hbWUiLiAgIFRoaXMgbWlnaHQgYnJlYWsgJWFkZG1ldGhvZHMgYXMgZGVzY3JpYmVkCiAgICAgICAgICAgIGluIHRoZSBtYW51YWwuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjaW50IHsgICAgLy8gRmFpbHMuIHZlY2ludCBub3QgYSBjbGFzcwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAKICAgICAgICAgICAgVG8gZml4IHRoaXMsIGp1c3QgdXNlIHRoZSB0ZW1wbGF0ZSBuYW1lIGluc3RlYWQ6CgogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZTogVGhpcyB0ZWNobmlxdWUgbWlnaHQgYmUgYSB3YXkgdG8gaW1wbGVtZW50IHNvbWUgYml6YXJyZQogICAgICAgICAgICB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0ZWNobmlxdWVzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgYXBwbGllZCBpZiB2ZWN0b3I8aW50PiBpbnN0YW50aWF0ZWQgbGF0ZXIKICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICAKMDQvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0MDg2OCBdICNpZiBkZWZpbmVkIHdoYXRldmVyIC0gbm90IHBhcnNlZC4gIFNXSUcgc2hvdWxkCiAgICAgICAgICAgIG5vdyBjb3JyZWN0bHkgaGFuZGxlIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgIAogICAgICAgICAgICBOb3RlOiB3YXMgaW1wbGVtZW50ZWQgcHJldmlvdXNseSwgYnV0IHRoZXJlIHdhcyBhIG1pbm9yIGJ1Zy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWRhbSBIdXBwLgogICAgICAgICAgICAgICAgICAgCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGFyZSBkZXByZWNhdGVkIGR1ZSB0byBhIGNoYW5nZSBpbiB0aGUgCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLiAgSW5zdGVhZCBvZiBiZWluZyBwcmFnbWFzLCBtdXRhYmlsaXR5IGlzIG5vdwogICAgICAgICAgICBjb250cm9sbGVkIGFzIGEgImZlYXR1cmUiIHVzaW5nIHRoZSBmb2xsb3dpbmcgdHdvIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICAgICVpbW11dGFibGU7CiAgICAgICAgICAgICAgICAgaW50IHg7ICAgICAgICAgICAvLyByZWFkLW9ubHkgdmFyaWFibGUKICAgICAgICAgICAgICAgICBpbnQgeTsgICAgICAgICAgIC8vIHJlYWQtb25seSB2YXJpYWJsZQogICAgICAgICAgICAgICAgICVtdXRhYmxlOwogICAgICAgICAgICAgICAgIGludCB6OyAgICAgICAgICAgLy8gTW9kaWZpYWJsZQoKICAgICAgICAgICAgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgYXJlIG11Y2ggbW9yZSBwb3dlcmZ1bCB0aGFuIHRoZWlyIG9sZGVyCiAgICAgICAgICAgIGNvdW50ZXJwYXJ0cy4gIFRoZXkgY2FuIG5vdyBwaW5wb2ludCBhIHNwZWNpZmljIGRlY2xhcmF0aW9uIGxpa2UKICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIHg7ICAgICAgICAgLyogQW55IHggKi8KICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgRm9vOjp4OyAgICAvKiB4IGluIGNsYXNzIEZvbyAqLwoKICAgICAgICAgICAgSW4gZmFjdCwgdGhlIG1hdGNoaW5nIGFsZ29yaXRobSBpcyB0aGUgc2FtZSBhcyBmb3IgJXJlbmFtZSwgCiAgICAgICAgICAgICVpZ25vcmUsIGFuZCBvdGhlciBkaXJlY3RpdmVzLiAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgZGVjbGFyYXRpb24KICAgICAgCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIEZvbzo6eDsKCiAgICAgICAgICAgIHdvdWxkIG5vdCBvbmx5IGFwcGx5IHRvIGNsYXNzIEZvbyBidXQgdG8gYWxsIGRlcml2ZWQgY2xhc3NlcwogICAgICAgICAgICBhcyB3ZWxsLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICVpbW11dGFibGUgYW5kICVtdXRhYmxlIG11c3QgYmUgdGVybWluYXRlZCBieSBhIHNlbWktY29sb24uICBUaGlzCiAgICAgICAgICAgIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSB0aGUgb2xkZXIgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGRpcmVjdGl2ZXMuCiAgICAgICAgICAgIFNpbmNlICVpbW11dGFibGUgYW5kICVtdXRhYmxlIGNhbiBiZSBhcHBsaWVkIHRvIGRlY2xhcmF0aW9ucyB0aGUKICAgICAgICAgICAgc2VtaWNvbG9uIGlzIG5lZWRlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgZ2xvYmFsIGZlYXR1cmUgYW5kIAogICAgICAgICAgICBvbmUgdGFyZ2V0ZWQgdG8gYSBzaW5nbGUgZGVjbGFyYXRpb24uICBOb3RlOiB0aGlzIGluY29tcGF0aWJpbGl0eSBpcyB0aGUKICAgICAgICAgICAgcHJpbWFyeSByZWFzb24gZm9yIGNoYW5naW5nIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RpdmUuCgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBoYW5kbGluZyBvZiBjb3B5IGNvbnN0cnVjdG9ycy4gIElmIGEgY2xhc3MgZGVmaW5lcyAKICAgICAgICAgICAgY29uc3RydWN0b3JzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgRm9vKCk7CiAgICAgICAgICAgICAgICAgICAgICBGb28oY29uc3QgRm9vICYpOyAgICAgICAvLyBDb3B5IGNvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgYSBmdW5jdGlvbiBjb3B5X0ZvbygpIGZvciB0aGUgY29weQogICAgICAgICAgICBjb25zdHJ1Y3Rvci4KCiAgICAgICAgICAgIEluIHByZXZpb3VzIHZlcmlvbnMsIHRoaXMgZ2VuZXJhdGVkIGEgbmFtZS1jbGFzaCBhbmQgYW4KICAgICAgICAgICAgZXJyb3IgbWVzc2FnZS4gICBUbyBwcmVzZXJ2ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgU1dJRwogICAgICAgICAgICBkb2VzIG5vdCBjaGFuZ2UgdGhlIGJlaGF2aW9yIGlmICVyZW5hbWUgaXMgdXNlZCB0byByZXNvbHZlCiAgICAgICAgICAgIHRoZSBuYW1lIGNvbmZsaWN0LiAgIEhvd2V2ZXIsIGlmIG5vIG5hbWUgcmVzb2x1dGlvbiBpcyBtYWRlLAogICAgICAgICAgICB0aGlzIG5ldyBhcHByb2FjaCBpcyB1c2VkLgoKICAgICAgICAgICAgQ29weSBjb25zdHJ1Y3RvcnMgbWF5IGJlIGhhbmRsZWQgYXMgYSBzcGVjaWFsIGNhc2UgaW4gdGhlCiAgICAgICAgICAgIHRhcmdldCBsYW5ndWFnZS4gIEhvd2V2ZXIsIHRoaXMgaXMgdXAgdG8gdGhlIGxhbmd1YWdlIG1vZHVsZQogICAgICAgICAgICBpdHNlbGYuCiAgICAgICAgICAgICAgICAgIAowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGlzIG5vdyBuYW1lc3BhY2UgYXdhcmUuICAgVGhpcyBhbGxvd3MKICAgICAgICAgICAgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gbWF4KFQgYSwgVCBiKSB7IHJldHVybiBhID4gYiA/IGEgOiBiOyB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGZvbzsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIG1heDxpbnQ+OyAgICAgICAgICAgIC8vIE9rCgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGJhciB7CiAgICAgICAgICAgICAgICAgICB1c2luZyBmb286Om1heDsKICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhkb3VibGUpIG1heDxkb3VibGU+OyAgIC8vIE9rCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBDYXZlYXQ6IHRoZSB0ZW1wbGF0ZSBuYW1lIHN1cHBsaWVkIHRvICV0ZW1wbGF0ZSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlCiAgICAgICAgICAgIHNhbWUgc2NvcGUgaW4gd2hpY2ggdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgYXBwZWFycy4gICBUaGlzIGNvZGUgaXMKICAgICAgICAgICAgaWxsZWdhbDoKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBmb286Om1heDxpbnQ+OwoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byBwcmVwcm9jZXNzb3IuICAgVGhlIHByZXByb2Nlc3NvciBjYW4gbm93IHBlcmZvcm0KICAgICAgICAgICAgc3RyaW5nIGNvbXBhcmlzb24uICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIEEgImhlbGxvIgogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgI2lmIEEgPT0gImhlbGxvIgogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBpcyBpbiBTV0lHIG1hY3Jvcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZGVmaW5lIEZPTyh4KSAKICAgICAgICAgICAgICAjaWYgI3ggPT0gImludCIKICAgICAgICAgICAgICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBpbnQgKi8KICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICBOb3JtYWwgdXNlcnMgY2FuIHByb2JhYmx5IHNhZmVseSBpZ25vcmUgdGhpcyBmZWF0dXJlLiAgSG93ZXZlciwgaXQgbWF5CiAgICAgICAgICAgIGJlIHVzZWQgaW4gcGFydHMgb2YgdGhlIFNXSUcgbGlicmFyeS4KCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRnVydGhlciByZWZpbmVtZW50IG9mIGRlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB3cmFwcGVyIGdlbmVyYXRpb24uCiAgICAgICAgICAgIFNXSUcgaXMgbm93IG11Y2ggbW9yZSBhd2FyZSBvZiBwdXJlIHZpcnR1YWwgbWV0aG9kcy4gRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICBjbGFzcyBBIHsgICAgICAgICAgICAgLyogQWJzdHJhY3QgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDEoKSA9IDA7CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDIoKSA9IDA7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEEgeyAgLyogQWJzdHJhY3QgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDEoKSB7IH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgY2xhc3MgQyA6IHB1YmxpYyBCIHsgIC8qIE9rICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QyKCkgeyB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIFNXSUcgd2lsbCBvbmx5IGdlbmVyYXRlIGRlZmF1bHQgY29uc3RydWN0b3JzIGZvciBDLgogICAgICAgICAgICBFdmVuIHRob3VnaCBCIGxvb2tzIGZpbmUsIGl0J3MgbWlzc2luZyBhIHJlcXVpcmVkIG1ldGhvZCBhbmQgaXMgYWJzdHJhY3QuCgowNC8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gc3RydWN0dXJlIGRhdGEgbWVtYmVyIGFjY2Vzcy4gIElmIHlvdQogICAgICAgICAgICBoYXZlIGEgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBCYXIgICBiOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIGIgYXJlIGdlbmVyYXRlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgKDEpIElmIGIgaXMgKm5vdCogZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBvciBjbGFzczoKCiAgICAgICAgICAgICAgICBCYXIgRm9vX2JfZ2V0KEZvbyAqc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLT5iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdm9pZCBGb29fYl9zZXQoRm9vICpzZWxmLCBCYXIgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5iID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAoMikgSWYgYiAqaXMqIGRlZmluZWQgYXMgYSBzdHJ1Y3R1cmUgb3IgY2xhc3M6CgogICAgICAgICAgICAgICAgQmFyICpGb29fYl9nZXQoRm9vICpzZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICZzZWxmLT5iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdm9pZCBGb29fYl9zZXQoRm9vICpzZWxmLCBCYXIgKnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi0+YiA9ICp2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgU2VlIHRoZSAiU3RydWN0dXJlIGRhdGEgbWVtYmVycyIgc2VjdGlvbiBvZiBEb2MvTWFudWFsL1NXSUcuaHRtbAogICAgICAgICAgICBmb3IgZnVydGhlciBkZXRhaWxzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIFRoaXMgbWF5IGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWxpZWQgb24gYSBsb3Qgb2YgYSB1bmRlY2xhcmVkCiAgICAgICAgICAgIHN0cnVjdHVyZSBhbmQgY2xhc3MgbmFtZXMuICAgIFRvIGdldCB0aGUgb2xkIGJlaGF2aW9yLCBzaW1wbHkKICAgICAgICAgICAgdXNlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBzdWNoIGFzICJzdHJ1Y3QgQmFyOyIKICAgICAgICAgICAgCjA0LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQysrIG5hbWVzcGFjZSBzdXBwb3J0IGFkZGVkLiAgU1dJRyBzdXBwb3J0cyBhbGwgYXNwZWN0cyBvZgogICAgICAgICAgICBuYW1lc3BhY2VzIGluY2x1ZGluZyBuYW1lc3BhY2UsIHVzaW5nLCBhbmQgbmFtZXNwYWNlIGFsaWFzCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucy4gICAgVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgU1dJRyBpcyB0byBmbGF0dGVuCiAgICAgICAgICAgIG5hbWVzcGFjZXMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEhvd2V2ZXIsIG5hbWVzcGFjZXMgYXJlCiAgICAgICAgICAgIGZ1bGx5IHN1cHBvcnRlZCBhdCB0aGUgQysrIGxldmVsIGFuZCBpbiB0aGUgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAgIFNlZSBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwgZm9yIGRldGFpbHMgb24gdGhlIGltcGxlbWVudGF0aW9uLgogICAgIAowNC8wMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFN1biBoYXMgbW9kaWZpZWQgamF2YWMgaW4gamRrMS40IHRvIG5vIGxvbmdlciBjb21waWxlCiAgICAgICAgICAgIGFuIGltcG9ydCBvZiBhbiB1bm5hbWVkIG5hbWVzcGFjZS4gVG8gZml4IHRoaXMgU1dJRyBubyBsb25nZXIgCiAgICAgICAgICAgIGdlbmVyYXRlcyB0aGUgaW1wb3J0IGZvciBwYWNrYWdlbGVzcyBjbGFzc2VzLgogICAgICAgICAgICBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDM2MTU3NS5odG1sCiAgICAgICAgICAgIEFzIHJlcG9ydGVkIFNGICM1Mzg0MTUuCgowMy8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgc3VwcG9ydCBmb3IgcG9pbnRlci10by1tZW1iZXIsIHNpbWlsYXIgdG8gdGhhdAogICAgICAgICAgICBmb3IgdGhlIFB5dGhvbiBtb2R1bGUuIFJlbWFya2FibHkgc2ltaWxhci4gQWxzbyBhZGRlZCBhIG5ldwogICAgICAgICAgICBleGFtcGxlIGZvciB0aGlzIChFeGFtcGxlcy9ydWJ5L21wb2ludGVyKSwgd2hpY2ggaXMgcmVtYXJrYWJseQogICAgICAgICAgICBzaW1pbGFyIHRvIHRoZSBQeXRob24gZXhhbXBsZSBvZiB0aGUgc2FtZSBuYW1lLgoKMDMvMjYvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hZGUgYSBmZXcgbWlub3IgZWRpdHMgdG8gdGhlICJBZHZhbmNlZCBUb3BpY3MiCiAgICAgICAgICAgIGNoYXB0ZXIgb2YgdGhlIFNXSUcgbWFudWFsIGFuZCBhZGRlZCBhIG5ldyBtYWpvciBzZWN0aW9uCiAgICAgICAgICAgIGFib3V0IGhvdyB0byBjcmVhdGUgbXVsdGktbW9kdWxlIFJ1YnkgcGFja2FnZXMgd2l0aCBTV0lHLgoKMDMvMjYvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFJlbW92ZWQgYWxsIG9mIHRoZSBvbGQgUnVieSBwcmFnbWFzLiBJZiBhbnkgb2YgdGhpcwogICAgICAgICAgICBmdW5jdGlvbmFsaXR5IGlzIHRydWx5IG1pc3NlZCB3ZSBjYW4gcmVzdXJyZWN0IGl0LCBwcmVmZXJhYmx5CiAgICAgICAgICAgIHdpdGggc29tZSBraW5kIG9mIGZlYXR1cmUtYmFzZWQgZGlyZWN0aXZlLgogICAgICAgICAgICAKMDMvMjUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFNXSUcgZXhjZXB0aW9uIGxpYnJhcnkgc3VwcG9ydCBmb3IgUnVieSwgd2hpY2gKICAgICAgICAgICAgaGFzIGFwcGFyZW50bHkgYmVlbiBicm9rZW4gZm9yIHNvbWUgdGltZS4gTHVja2lseSwgbm8gb25lIHNlZW1zCiAgICAgICAgICAgIHRvIGhhdmUgbm90aWNlZC4KCjAzLzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQysrLW5hbWVzcGFjZSBzdXBwb3J0IGluIFNXSUcgZGlyZWN0aXZlcy4KCiAgICAgICAgICAgICVhZGRtZXRob2RzOiAKCiAgICAgICAgICAgIFRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgbm93IGFjY2VwdHMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lCiAgICAgICAgICAgIGFuZCBjYW4gYmUgdXNlZCBpbnNpZGUgQysrIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgLy8gQXR0YWNoZXMgdG8gdGhlIGNsYXNzIEZvbzo6QmFyIGJlbG93CiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgRm9vOjpCYXIgewogICAgICAgICAgICAgICAgICAgICBpbnQgc29tZW1ldGhvZCgpIHsgLi4uIH0KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2hlcyB0byB0aGUgY2xhc3MgQmFyIGFib3ZlCiAgICAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgIGludCBvdGhlcm1ldGhvZCgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVmZWF0dXJlLCAlcmVuYW1lLCAlaWdub3JlLCAlZXhjZXB0aW9uLCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgTmFtZXNwYWNlcyBhcmUgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSByZW5hbWluZyBhbmQgZGVjbGFyYXRpb24KICAgICAgICAgICAgbWF0Y2hlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lKGRpc3BsYXkpIEZvbzo6cHJpbnQ7ICAgICAgICAgIC8vIFJlbmFtZSBpbiBuYW1lc3BhY2UgRm9vCiAgICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OkJhcjo6YmxhaDsgICAgICAgICAgICAgICAvLyBJZ25vcmUgYSBkZWNsYXJhdGlvbgoKICAgICAgICAgICAgJXJlbmFtZSBkaXJlY3RpdmVzIGNhbiBiZSBwbGFjZWQgaW5zaWRlIG5hbWVzcGFjZSBibG9ja3MgYXMgd2VsbC4gRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAlcmVuYW1lKGRpc3BsYXkpIHByaW50OyAgICAgICAgIC8vIEFwcGxpZXMgdG8gcHJpbnQgYmVsb3cKCiAgICAgICAgICAgICAgICAgICB2b2lkIHByaW50KCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW9zdCBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgc2hvdWxkIHdvcmsgcHJvcGVybHkgaW5zaWRlIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIE5vIG90aGVyIGNoYW5nZXMgYXJlIG5lZWRlZC4KICAgICAgCjAzLzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBjaGFuZ2VzIHRvIGludGVybmFsIHN5bWJvbCB0YWJsZSBoYW5kbGluZy4gICBTV0lHIG5vIGxvbmdlcgogICAgICAgICAgICBtYW5hZ2VzIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyBpbiBhIHNlcGFyYXRlIG5hbWVzcGFjZSB0aGFuIG5vcm1hbAogICAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSBBTlNJIEMuICBUaGlzIG1lYW5zIHlvdSBjYW4ndCBoYXZlIGEgc3RydWN0dXJlCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBGb28oKSB7IC4uLiB9CgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGlzIG1vcmUgbGlrZSBDKysuICAgSXQncyBub3QgY2xlYXIgdGhhdCBTV0lHIGV2ZXIKICAgICAgICAgICAgcmVhbGx5IHN1cHBvcnRlZCB0aGUgQU5TSSBDIGFueXdheXMtLS11c2luZyB0aGUgc2FtZSBuYW1lIHdvdWxkCiAgICAgICAgICAgIGFsbW9zdCBjZXJ0YWlubHkgZ2VuZXJhdGUgYSBuYW1lLWNsYXNoIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgowMy8yMi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgWyA1MTczMDIgXSBmb3IgaGFuZGxpbmcgb2YgcmVuYW1lZCBvdmVybG9hZGVkCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycy4gTm93LCByZW5hbWVkIG92ZXJsb2FkZWQgY29uc3RydWN0b3JzIGFyZSBjb252ZXJ0ZWQKICAgICAgICAgICAgaW50byBjbGFzcyBzaW5nbGV0b24gbWV0aG9kcyAoYmFzaWNhbGx5IGFjdGluZyBhcyAiZmFjdG9yeSIKICAgICAgICAgICAgbWV0aG9kcykuCgowMy8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTMyOTU3IF0gJWlnbm9yZSBwYXJzZSBlcnJvciBhbmQgY2FzdGluZyBvcGVyYXRvci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowMy8xOC8yMDAyOiBiZWF6bGV5ICgqKiBBRFZBTkNFRCBVU0VSUyBPTkxZICoqKQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkeW5hbWljIGNhc3RpbmcgaW4gcmV0dXJuIHZhbHVlcy4gIEEgc29tZXdoYXQKICAgICAgICAgICAgY29tbW9uIHByb2JsZW0gaW4gY2VydGFpbiBDKysgcHJvZ3JhbXMgaXMgZnVuY3Rpb25zIHRoYXQgaGlkZQogICAgICAgICAgICB0aGUgaWRlbnRpdHkgb2YgdW5kZXJseWluZyBvYmplY3RzIHdoZW4gdGhleSBhcmUgcmV0dXJuZWQgCiAgICAgICAgICAgIGZyb20gbWV0aG9kcyBhbmQgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGEgcHJvZ3JhbSBtaWdodCBpbmNsdWRlCiAgICAgICAgICAgIHNvbWUgZ2VuZXJpYyBtZXRob2QgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKmdldE5vZGUoKTsKCiAgICAgICAgICAgIEhvd2V2ZXIsIE5vZGUgKiBtYXkganVzdCBiZSBiYXNlIGNsYXNzIHRvIGEgd2hvbGUgaGllcmFyY2h5CiAgICAgICAgICAgIG9mIGRpZmZlcmVudCBvYmplY3RzLiAgIEluc3RlYWQgb2YgcmV0dXJuaW5nIHRoaXMgZ2VuZXJpYyBOb2RlICosCiAgICAgICAgICAgIGl0IG1pZ2h0IGJlIG5pY2UgdG8gYXV0b21hdGljYWxseSBkb3duY2FzdCB0aGUgb2JqZWN0IGludG8gdGhlCiAgICAgICAgICAgIGFwcHJvcHJpYXRlIHR5cGUgdXNpbmcgc29tZSBraW5kIGR5bmFtaWMgY2FzdC4KCiAgICAgICAgICAgIEFzc3VtaW5nIHlvdSB1bmRlcnN0YW5kIHRoZSBwZXJpbCBpbnZvbHZlZCwgYSBkb3duY2FzdCBjYW4gbm93CiAgICAgICAgICAgIGJlIHBlcmZvcm1lZCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGluIHRoZSBydW4tdGltZSB0eXBlCiAgICAgICAgICAgIGNoZWNrZXI6CgogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICpTV0lHX1R5cGVEeW5hbWljQ2FzdChzd2lnX3R5cGVfaW5mbyAqLCB2b2lkICoqcHRyKTsKCiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgdHlwZSBjYW4gYmUgY29udmVydGVkIHRvIGFub3RoZXIKICAgICAgICAgICAgdHlwZS4gIElmIHNvLCBhIGRpZmZlcmVudCB0eXBlIGRlc2NyaXB0b3IgKGZvciB0aGUgY29udmVydGVkIHR5cGUpCiAgICAgICAgICAgIGlzIHJldHVybmVkLiAgIFRoaXMgdHlwZSBkZXNjcmlwdG9yIHdvdWxkIHRoZW4gYmUgdXNlZCB0byBjcmVhdGUKICAgICAgICAgICAgYSBwb2ludGVyIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgogICAgICAgICAgICBUbyB1c2UgdGhpcywgeW91IHdvdWxkIHdyaXRlIGEgdHlwZW1hcCBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgTm9kZSAqIHsKICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFNXSUdfVHlwZUR5bmFtaWNDYXN0KCQxX2Rlc2NyaXB0b3IsICh2b2lkICoqKSAmJDEpOwogICAgICAgICAgICAgICAgJHJlc3VsdCA9IFNXSUdfTmV3UG9pbnRlck9iaigkMSwgdHkpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFsdGVybmF0aXZlbHksCgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgTm9kZSAqID0gU1dJR1RZUEUgKkRZTkFNSUM7CgogICAgICAgICAgICBUbyBtYWtlIHRoZSB0eXBlbWFwIGhhdmUgYW55IGVmZmVjdCwgeW91IGhhdmUgdG8gd3JpdGUgYSBzdXBwb3J0aW5nIAogICAgICAgICAgICBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBwZXJmb3JtIGRvd25jYXN0aW5nLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICBzdGF0aWMgc3dpZ190eXBlX2luZm8gKgogICAgICAgICAgICAgIE5vZGVfZHluYW1pY19jYXN0KHZvaWQgKipwdHIpIHsKICAgICAgICAgICAgICAgICBOb2RlICoqbnB0ciA9IChOb2RlICoqKSBwdHI7CiAgICAgICAgICAgICAgICAgRWxlbWVudCAqZSA9IGR5bmFtaWNfY2FzdDxFbGVtZW50ICo+KCpucHRyKTsKICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICpwdHIgPSAodm9pZCAqKSBlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTV0lHVFlQRV9wX0VsZW1lbnQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERhdGEgKmQgPSBkeW5hbWljX2Nhc3Q8RGF0YSAqPigqbnB0cik7CiAgICAgICAgICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHZvaWQgKikgZDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1dJR1RZUEVfcF9EYXRhOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uIGhvdyB0eXBlcyBhcmUgZGV0ZXJtaW5lZC4gZHluYW1pY19jYXN0PD4KICAgICAgICAgICAgdXNlcyBDKysgUlRUSS4gIEhvd2V2ZXIsIGlmIHlvdSBoYWQgc29tZSBvdGhlciBtZWNoYW5pc20gZm9yIGRldGVybWluaW5nCiAgICAgICAgICAgIHRoZSB0eXBlLCB5b3UgY291bGQgdXNlIHRoYXQgaGVyZS4gIE5vdGU6IGl0IGlzIGltcG9ydGFudCB0byBzYXZlCiAgICAgICAgICAgIHRoZSBuZXcgcG9pbnRlciB2YWx1ZSBiYWNrIGludG8gdGhlIGFyZ3VtZW50IGFzIHNob3duLiAgV2hlbiBkb3duY2FzdGluZywKICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyIGNvdWxkIGNoYW5nZS4gCgogICAgICAgICAgICBGaW5hbGx5LCB0byBtYWtlIHRoZSBjYXN0aW5nIGZ1bmN0aW9uIGF2YWlsYWJsZSwgeW91IGhhdmUgdG8gcmVnaXN0ZXIKICAgICAgICAgICAgaXQgd2l0aCB0aGUgcnVuLXRpbWUgdHlwZSBjaGVja2VyLiBQdXQgdGhpcyBtYWNybyBpbiB5b3VyIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAgICAgICAgRFlOQU1JQ19DQVNUKFNXSUdUWVBFX3BfTm9kZSwgTm9kZV9keW5hbWljX2Nhc3QpOwoKICAgICAgICAgICAgTm90ZTogdGhpcyBmZWF0dXJlIGRvZXMgbm90IGludHJvZHVjZSBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gCiAgICAgICAgICAgIG5vcm1hbCBTV0lHIG9wZXJhdGlvbi4gIFRoZSBmZWF0dXJlIGlzIG9ubHkgZW5hYmxlZCBieSB3cml0aW5nCiAgICAgICAgICAgIGEgbmV3IHR5cGVtYXAgdGhhdCBleHBsaWNpdGx5IGNhbGxzIFNXSUdfVHlwZUR5bmFtaWNDYXN0KCkgdG8KICAgICAgICAgICAgbWFrZSBhIGNvbnZlcnNpb24uIAogIAogICAgICAgICAgICBFeGFtcGxlcy90ZXN0LXN1aXRlL2R5bmFtaWNfY2FzdC5pIGNvbnRhaW5zIGEgc2ltcGxlIGV4YW1wbGUuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBKYXZhIG1vZHVsZSBkdWUgdG8gZGlmZmVyZW5jZXMKICAgICAgICAgICAgaW4gdGhlIHR5cGUtY2hlY2tpbmcgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgowMy8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNtYWxsIGNoYW5nZSB0byB0eXBlLW5hbWUgaGFuZGxpbmcgb2YgdW5uYW1lZCBzdHJ1Y3R1cmVzIGFuZAogICAgICAgICAgICB0eXBlZGVmLiAgSWYgYSBzdHJ1Y3R1cmUgb2YgdGhpcyBmb3JtIGFwcGVhcnM6CgogICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0gRm9vOwoKICAgICAgICAgICAgVGhlbiAnRm9vJyBpcyB1c2VkIGFzIHRoZSBwcm9wZXIgdHlwZW5hbWUgZm9yIHRoZSBzdHJ1Y3R1cmUuCiAgICAgICAgICAgIEZ1cnRoZXJtb3JlLCBGb28gY2FuIG5vdyBiZSB1c2VkIGFzIGEgbmFtZSBpbiBDKysgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIFNXSUcgd2FzIGFscmVhZHkga2luZCBvZiBkb2luZyB0aGlzLCBidXQgdGhpcyBtb2RpZmljYXRpb24gcmVmaW5lcwogICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gdG8gbW9yZSBjbG9zZWx5IGZvbGxvdyB0aGUgQysrIEFSTSwgc2VjdGlvbgogICAgICAgICAgICA3LjEuMywgcC4gMTA2LiAgVGhpcyBmaXhlcyBhIGNvdXBsZSBvZiBvYnNjdXJlIGNvcm5lciBjYXNlcy4KCjAzLzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgQysrIGluaGVyaXRhbmNlIHdpdGggYSBmZXcgZW5oYW5jZW1lbnRzLiAgRmlyc3QsIHR5cGUgaW5mb3JtYXRpb24KICAgICAgICAgICAgbmVlZGVkIGZvciBjYXN0aW5nIGFuZCB0eXBlLWVxdWl2YWxlbmNlIGlzIGdlbmVyYXRlZCBldmVuIHdoZW4gYmFzZS1jbGFzc2VzCiAgICAgICAgICAgIGFyZW4ndCBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyICB7ICAgIC8qIEJhciB1bnNwZWNpZmllZCAqLwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB2b2lkIGJsYWgoQmFyICpiKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGJsYWgoKSBmdW5jdGlvbiBzdGlsbCBhY2NlcHRzIEZvbyAqIGV2ZW4gdGhvdWdoIG5vdGhpbmcKICAgICAgICAgICAgaXMgcmVhbGx5IGtub3duIGFib3V0IEJhci4gICBQcmV2aW91cyBTV0lHIHZlcnNpb25zIHdvdWxkIGp1c3QgZ2VuZXJhdGUKICAgICAgICAgICAgYSB0eXBlIGVycm9yLgoKICAgICAgICAgICAgSW5oZXJpdGFuY2UgaGFzIGFsc28gYmVlbiBtb2RpZmllZCB0byB3b3JrIHRocm91Z2ggdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgQmFyIE90aGVyQmFyOwogICAgICAgICAgICAgICBjbGFzcyBGb286IHB1YmxpYyBPdGhlckJhciB7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGJhc2UgY2xhc3Mgb2YgT3RoZXJCYXIgaXMgY29ycmVjdGx5IHJlc29sdmVkIGJhY2sgdG8KICAgICAgICAgICAgQmFyLiAgIFRoZSB1c2Ugb2YgdGhlIG5hbWUgT3RoZXJCYXIgaXMgbG9zdCBpbiB0aGlzIHJlc29sdXRpb24gKHRoZSB3cmFwcGVycwogICAgICAgICAgICB3aWxsIHNpbXBseSB1c2UgQmFyIGluc3RlYWQgb2YgdGhlIHR5cGVkZWYgbmFtZSBPdGhlckJhcikuCiAgICAgICAgICAgCjAzLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJXR5cGVtYXAsICVhcHBseSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcyBjYW4gbm93IGFwcGVhciBpbnNpZGUKICAgICAgICAgICAgY2xhc3MgZGVmaW5pdGlvbnMuICAgCgowMy8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyByZWxhdGVkIHRvIGNvbXBpbGluZyBTV0lHIG9uIDY0LWJpdAogICAgICAgICAgICBwbGF0Zm9ybXMuCgowMy8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCAiaWdub3JlIiBhbmQgImluIiB0eXBlbWFwcy4gIExvY2FsIHZhcmlhYmxlcwogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggImluIiB3ZXJlIGJlaW5nIGFkZGVkIHRvIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIGV2ZW4KICAgICAgICAgICAgdGhvdWdoIHRoZXkgd2VyZSBuZXZlciB1c2VkLiAgIE1vc3RseSBoYXJtbGVzcywgYnV0IGl0IHdvdWxkIGxlYWQKICAgICAgICAgICAgdG8gYSB2YXJpZXR5IG9mIGNvbXBpbGF0aW9uIHdhcm5pbmdzLgogIAowMy8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgY2hhbmdlcyB0byB0aGUgaW50ZXJuYWwgdHlwZSBzeXN0ZW0gYW5kIGhhbmRsaW5nIG9mIG5lc3RlZCBDKysKICAgICAgICAgICAgdHlwZXMuICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgaWYgeW91IGhhZCB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEJsYWg7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzb21lbWV0aG9kKEJsYWggeCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0eXBlIGluIHNvbWVtZXRob2QoKSB3b3VsZCBpbXBsaWNpdGx5IGJlIHNldCB0byBCYXI6OkJsYWguCiAgICAgICAgICAgIEFsdGhvdWdoIHRoaXMgaXMgdGVjaG5pY2FsbHkgYWxsb3dlZCwgaXQgYnJlYWtzIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb286OkJsYWggeyAuLi4gfQoKICAgICAgICAgICAgZG9lc24ndCBtYXRjaCBsaWtlIHlvdSBleHBlY3QuICAgVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGluIFNXSUctMS4zLjEyLgogICAgICAgICAgICBOb3csIHR5cGVzIGFyZSBleHBhbmRlZCB1c2luZyB0aGUgY2xhc3MgaW4gd2hpY2ggdGhleSB3ZXJlIGRlZmluZWQuCiAgICAgICAgICAgIFNvLCB0aGUgYXJndW1lbnQgdHlwZSBpbiBzb21lbWV0aG9kKCkgd2lsbCBiZSBGb286OkJsYWgtLS1zaW5jZSB0aGUKICAgICAgICAgICAgdHlwZSBCbGFoIHdhcyBkZWZpbmVkIGluIEZvby4KIAowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgc3VidGxlIHR5cGUgc2NvcGluZyBwcm9ibGVtcyB3aXRoIHR5cGVkZWYgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgQmxhaDsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgQmxhaDsKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhCbGFoIHgsIDo6QmxhaCB5KTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsIGNoYW5nZSB0byBoYW5kbGUgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KICAgICAgICAgICAgRmlyc3QsIHRoZXJlIGlzIG5vIHBvcnRhYmxlIG9yIHJlbGlhYmxlIHdheSB0byB3cmFwCiAgICAgICAgICAgIGEgdmFyYXJncyBmdW5jdGlvbiBpbiBmdWxsIGdlbmVyYWxpdHkuICBIb3dldmVyLCB5b3UgKmNhbiogY2hhbmdlCiAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgdXNpbmcgJXZhcmFyZ3MuCgogICAgICAgICAgICAgICAldmFyYXJncyhjaGFyICopIGZwcmludGY7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB2b2lkIGZwcmludGYoRklMRSAqZiwgY2hhciAqZm10LCAuLi4pOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdmFyaWFibGUgbGVuZ3RoIHBhcmFtZXRlciAiLi4uIiBpcwogICAgICAgICAgICBzaW1wbHkgcmVwbGFjZWQgYnkgdGhlIHBhcmFtZXRlcnMgZ2l2ZW4gaW4gJXZhcmFyZ3MuIFRoaXMKICAgICAgICAgICAgcmVzdWx0cyBpbiBhIGZ1bmN0aW9uIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIHZvaWQgZnByaW50ZihGSUxFICpmLCBjaGFyICpmbXQsIGNoYXIgKnMpOwoKICAgICAgICAgICAgTW9yZSB0aGFuIG9uZSBhcmd1bWVudCBjYW4gYmUgdXNlZCBhbmQgZGVmYXVsdCB2YWx1ZXMKICAgICAgICAgICAgY2FuIGJlIGRlZmluZWQuICBGb3IgZXhhbXBsZSwgdGhpcyBjb2RlIHNwZWNpZmllcyBhCiAgICAgICAgICAgIG1heGltdW0gb2YgZm91ciBhcmd1bWVudHMuCgogICAgICAgICAgICAgICAldmFyYXJncyhjaGFyICp4MSA9IDAsIGNoYXIgKngyID0gMCwgY2hhciAqeDMgPSAwLCBjaGFyICp4NCA9IDApIGZwcmludGY7CiAKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKIAowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byBoYW5kbGluZyBvZiB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLiAgdmFyYXJncwogICAgICAgICAgICBpcyBub3cgaGFuZGxlZCBhcyBhIHByb3BlciBwYXJhbWV0ZXIgYW5kIGlzIHBhc3NlZCB0byB0aGUKICAgICAgICAgICAgY29kZSBnZW5lcmF0b3IuICBIb3dldmVyLCBpdCBzdGlsbCBjYW4ndCBiZSBoYW5kbGVkIGNvcnJlY3RseQogICAgICAgICAgICAoYW5kIHdpbGwgZ2VuZXJhdGUgYSB0eXBlbWFwIHdhcm5pbmcpLiAgIFRoaXMgY2hhbmdlIGhhcyBiZWVuCiAgICAgICAgICAgIG1hZGUgdG8gYmV0dGVyIGluY29ycG9yYXRlIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMgd2l0aCBvdGhlcgogICAgICAgICAgICBkaXJlY3RpdmVzIHN1Y2ggYXMgJWlnbm9yZSwgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4KCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1MjI1NTUgXSBTeW50YXggZXJyb3IgcGFyc2luZyAiZGVmaW5lIiBjb25zdHJ1Y3QuIFNXSUcKICAgICAgICAgICAgaXMgYSBsaXR0bGUgbW9yZSByZXN0cmljdGl2ZSBpbiBkZXRlcm1pbmluZyAjZGVmaW5lIHN0YXRlbWVudHMKICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHdyYXBwZWQgYXMgY29uc3RhbnRzLiAgQWxzbyBhZGRlZCBhIGJldHRlciBwYXJzZXIKICAgICAgICAgICAgZXJyb3IgcnVsZSBmb3IgaGFuZGxpbmcgYmFkIGNvbnN0YW50cy4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogQ2xhc3NlcyByZW5hbWVkIHdpdGggJXJlbmFtZSB0aGF0IGFyZSBkZXJpdmVkIGZyb20gCiAgICAgICAgICAgIGFub3RoZXIgY2xhc3MgZ2VuZXJhdGUgbW9yZSBhcHByb3ByaWF0ZSBzaGFkb3cgY2xhc3MgY29kZS4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgU0YgWyAjNTIzNjMyIF0gYW5kIFsgIzUxMzMzNSBdIGJvdGggcmVwb3J0ZWQgYnkgSXNyYWVsIAogICAgICAgICAgICBUYW5uZXIuIFN1cHBvcnQgZm9yIHR5cGVzIHRoYXQgYXJlIHVzZWQgd2hpY2ggYXJlIGluIGEgdHlwZWRlZi4gVGhlCiAgICAgICAgICAgIGFwcHJvcHJpYXRlIHNoYWRvdyBjbGFzcyBuYW1lIGlzIGdlbmVyYXRlZC4gQWxzbyBnZW5lcmF0ZWQgY29ycmVjdAogICAgICAgICAgICBzaGFkb3cgY2xhc3NuYW1lIHdoZW4gYSB0ZW1wbGF0ZWQgY2xhc3MgaXMgdXNlZCB3aXRoaW4gYW5vdGhlciAKICAgICAgICAgICAgdGVtcGxhdGVkIGNsYXNzLiBTZWUgdGhlIGNwcF90eXBlZGVmLmkgdGVzdGNhc2UuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE5vIHR5cGUgd2FzIGdlbmVyYXRlZCBpbiBzaGFkb3cgY2xhc3NlcyBmb3IgdHlwZXMgCiAgICAgICAgICAgIHRoYXQgd2VyZW4ndCB3cmFwcGVkIGJ5IFNXSUcuICBUaGUgdHlwZSBpcyB0cmVhdGVkIGFzIGEgcmF3IAogICAgICAgICAgICBwb2ludGVyLCBpZSBubyBzaGFkb3cgY2xhc3MuCgowMi8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZWQgdGhlIG1hdGNoaW5nIGFsZ29yaXRobSB1c2VkIGJ5ICVyZW5hbWUsICVpZ25vcmUsIGFuZAogICAgICAgICAgICAlZmVhdHVyZS4gICBJZiBhIHR5cGUgc2lnbmF0dXJlIGlzIHN1cHBsaWVkLCBpdCBtdXN0IGV4YWN0bHkKICAgICAgICAgICAgbWF0Y2ggdGhhdCB1c2VkIGluIHRoZSBkZWNsYXJhdGlvbi0tLWluY2x1ZGluZyBhbnkgdXNlIG9mCiAgICAgICAgICAgIGNvbnN0LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXJlbmFtZShmb28xKSAgIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgJXJlbmFtZShiYXIxKSAgIGJhcihpbnQpIGNvbnN0OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsgICAgICAgLy8gTWF0Y2hlZCAtLT4gZm9vMQogICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KSBjb25zdDsgLy8gTm90IG1hdGNoZWQgCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpOyAgICAgICAvLyBOb3QgbWF0Y2hlZAogICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KSBjb25zdDsgLy8gTWF0Y2hlZCAtLT4gYmFyMQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGEgbm9uLWNvbnN0IHNwZWNpZmljYXRpb24gd291bGQgbWF0Y2gKICAgICAgICAgICAgYm90aCB0aGUgbm9uLWNvbnN0IGFuZCBjb25zdCBkZWNsYXJhdGlvbnMuICBIb3dldmVyLCB0aGUgd2hvbGUKICAgICAgICAgICAgcG9pbnQgb2YgJXJlbmFtZSBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzIGlzIHRoYXQgdGhleSBiZSBhYmxlCiAgICAgICAgICAgIHRvIHByZWNpc2VseSBwaW5wb2ludCBleGFjdCBkZWNsYXJhdGlvbnMgaW4gYW4gaW50ZXJmYWNlLiAgVGhpcwogICAgICAgICAgICBmaXhlcyB0aGUgcHJvYmxlbS4KCjAyLzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV3b3JrZWQgdGhlIGhhbmRsaW5nIG9mIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3JzLgogICAgICAgICAgICBTV0lHIG5vdyBtYWtlcyBhIHByZWxpbWluYXJ5IHBhc3Mgb3ZlciB0aGUgcGFyc2UgdHJlZSB0byBkaXNjb3ZlcgogICAgICAgICAgICB3aGljaCBjbGFzc2VzIHN1cHBvcnQgZGVmYXVsdCBhbGxvY2F0aW9uLiAgIFRoaXMgZml4ZXMgYSBudW1iZXIKICAgICAgICAgICAgb2YgdmVyeSBzdWJ0bGUgaXNzdWVzIGluIGNvZGUgZ2VuZXJhdGlvbiBhbmQgY2FsbC9yZXR1cm4gYnkgdmFsdWUuCgowMi8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgSW1wcm92ZWQgc3VwcG9ydCBvbiBDeWd3aW46IFBlcmwsIFB5dGhvbiwgVGNsLCBSdWJ5IGFuZCBKYXZhIHNob3VsZAogICAgICAgICAgICB3b3JrIG91dCBvZiB0aGUgYm94LCBiYXJyaW5nIHRoZSBydW50aW1lIGxpYnJhcnkuIFJlbW92ZWQgZGxsd3JhcCAKICAgICAgICAgICAgYW5kIHJlcGxhY2VkIHdpdGggbmV3bHkgd29ya2luZyBnY2MgLXNoYXJlZCBpbnN0ZWFkIGZvciBDeWd3aW4uIAogICAgICAgICAgICBBbGwgdGhpcyB3aWxsIHJlcXVpcmUgdGhlIG5ldyBpbXByb3ZlZCBiaW51dGlscyAyMDAxMDgwMiBhbmQgbGF0ZXIsCiAgICAgICAgICAgIGJ1dCB0aGUgbGF0ZXN0IEN5Z3dpbiBpcyB1c3VhbGx5IHRoZSBiZXN0IHJlY29tbWVuZGF0aW9uLgoKMDIvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gd3JhcHBpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgICBhbmQgUGVybCBzaGFkb3cgY2xhc3Nlcy4gUmVwb3J0ZWQgYnkgQ2hpYS1saWFuZyBLYW8uCgowMi8xNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZpeCB0byB0aGUgY29kZSBnZW5lcmF0aW9uIGZvciBDKysgY2xhc3MKICAgICAgICAgICAgY29uc3RydWN0b3JzIHNvIHRoYXQgd2UgZ2V0IGJvdGggYSAibmV3IiBzaW5nbGV0b24gbWV0aG9kCiAgICAgICAgICAgIGFuZCBhbiAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvciBlYWNoIGNsYXNzLiBUaGlzCiAgICAgICAgICAgIGNoYW5nZSBlbmFibGVzIGRldmVsb3BlcnMgdG8gZGVyaXZlIG5ldyBSdWJ5IGNsYXNzZXMgZnJvbQogICAgICAgICAgICBTV0lHLXdyYXBwZWQgQysrIGNsYXNzZXMgYW5kIHRoZW4gb3ZlcnJpZGUgdGhlaXIgaW5pdGlhbGl6ZQogICAgICAgICAgICBtZXRob2RzIHRvIHByb3ZpZGUgc3ViY2xhc3Mtc3BlY2lmaWMgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24uCgowMi8xNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFzc2l2ZSBkb2N1bWVudGF0aW9uIHVwZGF0ZSBmb3IgdGhlIFJ1YnkgbW9kdWxlLAogICAgICAgICAgICBjb250cmlidXRlZCBieSBDcmFpZyBGaWxlcy4KCjAyLzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBCdWcgZml4OiBBbiBlcnJvciBpbiB0aGUgU1dJRyBydW50aW1lIHN1cHBvcnQgZm9yIFJ1YnkKICAgICAgICAgICAgd2FzIGNhdXNpbmcgc2V2ZXJhbCBvZiB0aGUgZXhhbXBsZXMgdG8gZmFpbC4gUmVwb3J0ZWQgYnkKICAgICAgICAgICAgV2lsbGlhbSBGdWx0b24uCgowMi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQnVnIGZpeDogRW51bWVyYXRpb25zIGRlZmluZWQgd2l0aGluIGEgY2xhc3MgKHN1Y2gKICAgICAgICAgICAgYXMgdGhvc2Ugc2VlbiBpbiB0aGUgRXhhbXBsZXMvcnVieS9lbnVtIGV4YW1wbGUpIHdlcmUgbm90CiAgICAgICAgICAgIGJlaW5nIGV4cG9ydGVkIHdpdGggdGhlIGNvcnJlY3QgbmFtZXMuIFJlcG9ydGVkIGJ5IFdpbGxpYW0KICAgICAgICAgICAgRnVsdG9uLgoKMDIvMTMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIHdoZW4gd2UgcnVuIGFjcm9zcyBvdmVybG9hZGVkCiAgICAgICAgICAgIGNsYXNzIGNvbnN0cnVjdG9ycyBmb3IgQysrIGNvZGUsIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgbm90CiAgICAgICAgICAgIHN1cHBvcnRlZCAoZXZlbiBpZiB0aGUgb3ZlcmxvYWRzIGhhdmUgYmVlbiAlcmVuYW1lZCkuIEZvciBhbgogICAgICAgICAgICBleGFtcGxlIG9mIHdoZXJlIHRoaXMgZG9lc24ndCB3b3JrLCBzZWUgRXhhbXBsZXMvcnVieS9vcGVyYXRvci4KCjAyLzEzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhbiAiaWdub3JlZCIgd2FybmluZyBtZXNzYWdlIHdoZW4gdGhlIHBhcnNlciBydW5zCiAgICAgICAgICAgIGFjcm9zcyBhbiBvcGVyYXRvciE9KCkgZGVjbGFyYXRpb24gZm9yIEMrKyBjb2RlLgoKMDIvMTEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAiaW1wb3J0IiwgImltcG9ydF90ZW1wbGF0ZSIsICJvcGVyYXRvciIgYW5kCiAgICAgICAgICAgICJ0ZW1wbGF0ZSIgZXhhbXBsZXMuCgowMi8xMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbXVsdGktbW9kdWxlIHN1cHBvcnQuCgowMi8wOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlIG1pc3NpbmcgIiNkZWZpbmUgU1dJR19OT0lOQ0xVREUiIGF0IHRoZSB0b3Agb2YKICAgICAgICAgICAgdGhlIHdyYXBwZXIgY29kZSB3aGVuIHRoZSAnLWMnIG9wdGlvbiBpcyB1c2VkLgoKMDIvMDkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgQ29ycmVjdGVkIGEgbWlub3Igb2ZmLWJ5LW9uZSBlcnJvciBmb3IgdGhlIHNpemUgb2YgdGhlCiAgICAgICAgICAgIHN3aWdfdHlwZXNbXSBhcnJheSB0aGF0J3MgZ2VuZXJhdGVkIGluIHRoZSB3cmFwcGVyIGNvZGUuCgowMi8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFNGIFsgIzUxNTA1OCBdIFdyb25nIGNvZGUgZm9yIEMrKyB0ZW1wbGF0ZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IElzcmFlbCBUYWxsZXIuCgpWZXJzaW9uIDEuMy4xMSAoSmFudWFyeSAzMSwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCB0byBwYXNzL3JldHVybiBieSB2YWx1ZSBmb3IgQysrIG9iamVjdHMgdGhhdCBkZWZpbmUKICAgICAgICAgICAgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIENoYW5nZXMgdG8gdGhlIHR5cGVtYXAgc3lzdGVtCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byB3cmFwIEMrKyBvYmplY3RzIHdpdGggbm8gZGVmYXVsdAogICAgICAgICAgICBjb25zdHJ1Y3Rvci4gICBUaGlzIGhhcyBiZWVuIGZpeGVkLCBidXQgdGhlIHNvbHV0aW9uIAogICAgICAgICAgICBpbnZvbHZlcyBzb21lIGNsZXZlciB0ZW1wbGF0ZSBtYWdpYyBjb250cmlidXRlZCBieSAKICAgICAgICAgICAgV2lsbGlhbSBGdWx0b24uICBQbGVhc2Ugc2VlIHRoZSBjb21tZW50cyBpbiB0aGUgZmlsZQogICAgICAgICAgICBMaWIvc3dpZy5zd2cgZm9yIGZ1cnRoZXIgZGV0YWlscy4gIFRoaXMgc29sdXRpb24gaXMKICAgICAgICAgICAgZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmVmaW5lZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgoKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBHbG9iYWwgdmFyaWFibGVzIGFuZCBtZW1iZXIgZGF0YSBvZiB0eXBlICJjb25zdCBjaGFyICoiCiAgICAgICAgICAgIGNhbiBiZSBzZXQsIGJ1dCB0aGUgb2xkIHZhbHVlIGlzIHNpbGVudGx5IGRpc2NhcmRlZCB3aXRob3V0CiAgICAgICAgICAgIGFueSBnYXJiYWdlIGNvbGxlY3Rpb24uICAgVGhpcyBtYXkgZ2VuZXJhdGUgYSBtZW1vcnkgbGVhay4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgbmVlZGVkIHRvIG1vcmUgc2FmZWx5IGhhbmRsZSB2YXJpYWJsZXMKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvbyA9ICJIZWxsbyBXb3JsZFxuIjsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQncyBub3Qgc2FmZSB0byBmcmVlIHRoZSBvbGQgdmFsdWUuICBIb3dldmVyLAogICAgICAgICAgICBTV0lHIGNhbiBkeW5hbWljYWxseSBhbGxvY2F0ZSBhIG5ldyB2YWx1ZSBhbmQgbWFrZSBmb28gcG9pbnQKICAgICAgICAgICAgdG8gaXQuICAgVG8gZml4IHRoaXMgbWVtb3J5IGxlYWssIHlvdSBjYW4gcHJvYmFibHkgZG8gdGhpczoKCiAgICAgICAgICAgICAgICVjbGVhciBjb25zdCBjaGFyICpmb287CiAgICAgICAgICAgICAgICVhcHBseSBjaGFyICoge2NvbnN0IGNoYXIgKmZvb307CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVHdvIG1pbm9yIHR5cGVtYXAgZW5oYW5jZW1lbnRzIGhhdmUgYmVlbiBhZGRlZC4gIEZpcnN0LAogICAgICAgICAgICB0eXBlbWFwcyBjYW4gaXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UgYnkgaW5jbHVkaW5nIGEgc3BlY2lhbAogICAgICAgICAgICB3YXJuaW5nIGF0dHJpYnV0ZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJXR5cGVtYXAoaW4sd2FybmluZz0iSSdtIGdvaW5nIHRvIGRvIHNvbWV0aGluZyBkYW5nZXJvdXMiKSAuLi4KCiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBzaG93IHVwIHdoZW5ldmVyIHRoZSB0eXBlbWFwIGlzCiAgICAgICAgICAgIGFwcGxpZWQuCgogICAgICAgICAgICBTZWNvbmQsIGEgdHlwZW1hcCBjYW4gZm9yY2UgYSBuby1tYXRjaCBieSBkZWZpbmluZwoKICAgICAgICAgICAgICV0eXBlbWFwKGluKSBzb21ldHlwZSAicGFzcyI7CgogICAgICAgICAgICBJZiB0aGlzIGlzIHVzZWQsIHRoZSB0eXBlbWFwIHN5c3RlbSB3aWxsICpub3QqIHJlY29yZCBhCiAgICAgICAgICAgIHR5cGVtYXAgbWF0Y2ggZm9yICJzb21ldHlwZSIuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBibG9jawogICAgICAgICAgICBzZWxlY3RlZCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGRpc2FibGUKICAgICAgICAgICAgYSB0eXBlbWFwIGZlYXR1cmUgZm9yIHNvbWUgdHlwZSwgeW91IGNvdWxkIGRvIHRoaXMuCgogICAgICAgICAgICAgICAvLyBEbyBub3QgYWxsb3cgZ2xvYmFsIHZhcmlhYmxlcyBvZiB0eXBlICdjb25zdCBjaGFyIConIHRvIGJlIHNldC4KICAgICAgICAgICAgICAgJXR5cGVtYXAodmFyaW4pIGNvbnN0IGNoYXIgKiAicGFzcyI7CgogICAgICAgICAgICBJdCBtaWdodCBhbHNvIGJlIHBvc3NpYmxlIHRvIHVzZSB0aGlzIHRvIGRvIHN1YnRsZSBhbmQKICAgICAgICAgICAgc3RyYW5nZSB0aGluZ3Mgd2l0aCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgIG1ha2UgJ2JsYWggKicgYW4gb3V0cHV0IHZhbHVlIGFuZCAnY29uc3QgYmxhaCAqJyBhbiBpbnB1dAogICAgICAgICAgICBwYXJhbWV0ZXIsIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgYmxhaCAqKGJsYWggdGVtcCkgewogICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogQmxvY2sgdW5xdWFsaWZpZWQgdHlwZW1hcHMgZGVmaW5lZCBhYm92ZSAqLwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBjb25zdCBibGFoICogInBhc3MiOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBjb25zdCBibGFoICogInBhc3MiOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pICAgICBjb25zdCBibGFoICogewogICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgaW5wdXQgdmFsdWUgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgKFRoaXMgcG90ZW50aWFsIGFwcGxpY2F0aW9ucyBvZiB0eXBlbWFwcyBzdWdnZXN0ZWQgYnkgR3JlZyBTdGVpbikuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAxLzI5LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBObyBlbnVtZXJhdGlvbnMgd2VyZSB3cmFwcGVkIHdoZW4gdGhlIC1zaGFkb3cgCiAgICAgICAgICAgY29tbWFuZGxpbmUgb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLiBSZXBvcnRlZCBieSBJc3JhZWwgVGFsbGVyLgoKMDEvMjgvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEdsb2JhbCBhcnJheXMgYXJlIHN1Y2Nlc3NmdWxseSB3cmFwcGVkLiBJbiBmYWN0IHRoZXkgc3RhcnRlZAogICAgICAgICAgIG1vc3RseSB3b3JraW5nIGluIFNXSUctMS4zLjEwLgoKMDEvMjgvMjAwMjpyaWNoYXJkcAoJICAgQWRkZWQgZmlyc3QgYXR0ZW1wdCBhdCBDKysgYW5kIC1zaGFkb3cgc3VwcG9ydCBmb3IgUEhQNCBtb2R1bGUsCgkgICBwbGVhc2UgdGVzdCBhbmQgbWFpbCBtZSBpZiBhbnkgcHJvYmxlbXMvaWRlYXMgb24gaW1wcm92aW5nIGl0LgoKCSAgIFRoZXJlIGlzIGEga25vd24gcHJvYmxlbSB3aXRoIHVuaW5pdGlhbGl6ZWQgbWVtYmVyIHZhcmlhYmxlcywKCSAgIHBsZWFzZSBzZWUgRXhhbXBsZXMvcGhwNC9zeW5jL1JFQURNRSBmb3IgZGV0YWlscy4KCgkgICBBbHNvIG1vcmUgUEhQIGRvY3VtZW50YXRpb24gYWRkZWQgdG8gRG9jL01hbnVhbC9QaHAuaHRtbAoKMDEvMjcvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgVGhlIEFOU0kgQyBzaXplX3QgdHlwZSBpcyBub3cgcmVjb2duaXplZCBhcyBhbiBpbnRlZ2VyIGJ5IGRlZmF1bHQuCgowMS8yNi8yMDAyOmJlYXpsZXkKICAgICAgICAgICBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyBzdXBwb3J0IGFkZGVkIHRvIG1hbnkgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICBUaGlzIGlzIG5vdCBhIHBvcnRhYmxlIGZlYXR1cmUgYW5kIHdpbGwgcmVxdWlyZSBjb21waWxlciBzdXBwb3J0CiAgICAgICAgICAgZm9yIHRoZSBsb25nIGxvbmcgdHlwZS4gIEluIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBkbyBub3Qgc3VwcG9ydAogICAgICAgICAgIGxvbmcgbG9uZyAoZS5nLiwgVGNsIGFuZCBQZXJsKSwgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgc3RyaW5nCiAgICAgICAgICAgb2YgZGlnaXRzLiAgVGhpcyBwcmV2ZW50cyB0aGVpciB1c2UgaW4gYXJpdGhtZXRpYyBjYWxjdWxhdGlvbnMsIGJ1dAogICAgICAgICAgIHN0aWxsIGFsbG93cyB2YWx1ZXMgdG8gYmUgc2V0IGZyb20gYSBzdHJpbmcuICAKCiAgICAgICAgICAgbG9uZyBsb25nIHN1cHBvcnQgcmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgc3RydG9sbCgpIGFuZCBzdHJ0b3VsbCgpCiAgICAgICAgICAgZnVuY3Rpb25zIGFzIHdlbGwgYXMgdGhlICdsbGQnIGFuZCAnbGx1JyBmb3JtYXQgc3BlY2lmaWVycwogICAgICAgICAgIG9mIHNwcmludGYoKS4KCjAxLzI2LzIwMDI6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzUwMTgyNyBdIERlbGV0ZSBtZXRob2QgaXMgbm90IGNhbGxlZC4gICBUaGUgVGNsCiAgICAgICAgICAgbW9kdWxlIHdhc24ndCBjb3JyZWN0bHkgY2FsbGluZyBkZXN0cnVjdG9ycyB3aGVuIHRoZXkKICAgICAgICAgICB3ZXJlIGRlZmluZWQgdXNpbmcgJWFkZG1ldGhvZHMuICBUaGlzIGhhcyBiZWVuIGZpeGVkLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IFJlaW5oYXJkIEZvYmJlLgoKMDEvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgIEJldHRlciBzdXBwb3J0IGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZy4gIFR5cGVtYXBzCiAgICAgICAgICAgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIGEgbnVtYmVyIG9mIG1vZHVsZXMgZm9yIGhhbmRsaW5nIHRoZXNlIHR5cGVzLgogICAgICAgICAgIEluIGFkZGl0aW9uLCB0aGUgcGFyc2VyIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGFjY2VwdCBsb25nIGxvbmcKICAgICAgICAgICBsaXRlcmFscyBzdWNoIGFzIDEyMzRMTCBhbmQgMTIzNFVMTC4KCjAxLzI3LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBBIEMgY2hhcltdIGlzIG1hcHBlZCB0byBhIEphdmEgU3RyaW5nIHdoaWNoIGlzIHRoZSBkZWZhdWx0IAogICAgICAgICAgIFNXSUcgaGFuZGxpbmcgb2YgY2hhcltdIGFuZCBjaGFyKi4gSXQgdXNlZCB0byBiZSBtYXBwZWQgdG8gYnl0ZVtdLiAKICAgICAgICAgICBOb3RlIHRoYXQgYSBDIHNpZ25lZCBjaGFyW10gYXJyYXkgaXMgbWFwcGVkIHRvIGJ5dGVbXS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowMS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggcmV0dXJuLWJ5LXZhbHVlLCBDKyssIGFuZAogICAgICAgICAgIG9iamVjdHMgdGhhdCBkZWZpbmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KICAgICAgICAgICBSZXBvcnRlZCBieSBKb2VsIFJlZWQuCgowMS8yNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gT3ZlcmhhdWwgb2YgdGhlIEphdmEgbW9kdWxlLiBUaGUgQyBjb2RlIGdlbmVyYXRpb24gaXMgbm93IAogICAgICAgICAgIGRvbmUgZnJvbSB0eXBlbWFwcy4KCjAxLzI0LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBTdXBwb3J0IGZvciBhcnJheXMgb2YgZW51bSBwb2ludGVycwoKMDEvMjAvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEVycm9yIGNoZWNraW5nIGZvciBudWxsIEphdmEgb2JqZWN0cyBiZWluZyBwYXNzZWQgdG8gbmF0aXZlIAogICAgICAgICAgIGZ1bmN0aW9ucy4gIEV4Y2VwdGlvbiB0aHJvd24gbm93IHdoZXJlYXMgYmVmb3JlIHRoZSBKVk0gY3Jhc2hlZC4KCjAxLzE4LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDb3JyZWN0ZWQgYmVoYXZpb3VyIGZvciBmdW5jdGlvbnMgdGhhdCB0YWtlIGFycmF5cy4gRm9yIAogICAgICAgICAgIGV4YW1wbGUsIHdoZW4gdGhpcyBjIGZ1bmN0aW9uOiAKCiAgICAgICAgICAgdm9pZCBhcnJheWZuKGludCBhcnJheVtdKTsKICAgICAgICAgICAKICAgICAgICAgICBpcyB3cmFwcGVkIHRoZSBjb3JyZXNwb25kaW5nIG5hdGl2ZSBmdW5jdGlvbgoKICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSB2b2lkIGFycmF5Zm4oaW50W10gYXJyYXkpOwoKICAgICAgICAgICBpcyBwcm9kdWNlZC4gUHJldmlvdXNseSBpZiB0aGUgQyBmdW5jdGlvbiBtYWRlIGFueSBjaGFuZ2VzIHRvIHRoZSAKICAgICAgICAgICBhcnJheSBlbGVtZW50cywgdGhlc2Ugd2VyZSBub3QgcmVmbGVjdGVkIGJhY2sgaW50byB0aGUgSmF2YSBhcnJheS4gCiAgICAgICAgICAgVGhpcyBoYXMgbm93IGJlZW4gY29ycmVjdGVkIHNvIHRoYXQgdGhlIGNoYW5nZXMgYXJlIHByb3BvZ2F0ZWQgYmFjawogICAgICAgICAgIHRvIEphdmEgYW5kIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHdpbGwgc2VlIHRoZXNlIGNoYW5nZXMuIFRoaXMgaXMgCiAgICAgICAgICAgaG93IHB1cmUgSmF2YSBmdW5jdGlvbnMgd29yaywgaWUgYXJyYXlzIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLgoKMDEvMTUvMjAwMjpta29lcHBlCiAgICAgICAgICAgW0d1aWxlXSBOZXcgZmlsZSBjcGx1c3BsdXMuaSB3aXRoIEMrKyB0eXBlbWFwcyBjb250cmlidXRlZAogICAgICAgICAgIGJ5IE1hcmNpbyBMdWlzIFRlaXhlaXJhIDxtYXJjaW90QGhvbGx5LmNvbG9zdGF0ZS5lZHU+LgoKMDEvMTEvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENoYW5nZWQgbWFwcGluZyBvZiBDIGxvbmcgdG8gSmF2YSB0eXBlLiBXYXMgbWFwcGVkIHRvIEphdmEKICAgICAgICAgICBsb25nLCBub3cgbWFwcGVkIHRvIEphdmEgaW50LiBJZiB5b3Ugd2FudCB0aGUgcHJldmlvdXMgbWFwcGluZyB0byAKICAgICAgICAgICBKYXZhIGxvbmcgdXNlIHRoaXMgYXBwcm9hY2ggaW4geW91ciBpbnRlcmZhY2UgZmlsZToKICAgICAgICAgICAKICAgICAgICAgICAgICVjbGVhciBsb25nOwogICAgICAgICAgICAgJXR5cGVtYXAoam5pKSBsb25nICAgICAgICAgICAgICJqbG9uZyIKICAgICAgICAgICAgICV0eXBlbWFwKGp0eXBlKSBsb25nICAgICAgICAgICAibG9uZyIKICAgICAgICAgICAgICV0eXBlbWFwKGpzdHlwZSkgbG9uZyAgICAgICAgICAibG9uZyIKCiAgICAgICAgICAgICAlY2xlYXIgbG9uZ1tBTlldOwogICAgICAgICAgICAgJXR5cGVtYXAoam5pKSBsb25nW0FOWV0gICAgICAgICJqbG9uZ0FycmF5IgogICAgICAgICAgICAgJXR5cGVtYXAoanR5cGUpIGxvbmdbQU5ZXSAgICAgICJsb25nW10iCiAgICAgICAgICAgICAldHlwZW1hcChqc3R5cGUpIGxvbmdbQU5ZXSAgICAgImxvbmdbXSIKICAgICAgICAgICAgICV0eXBlbWFwKGluKSBsb25nW0FOWV0gICAgICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGxvbmdbQU5ZXSAgICAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBsb25nW0FOWV0gICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKGZyZWVhcmcpIGxvbmdbQU5ZXSAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKICAgICAgICAgICBUaGlzIG5ldyBtYXBwaW5nIGlzIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiBpbnRlcmZhY2luZyB0byAzMiBiaXQgCiAgICAgICAgICAgYXBwbGljYXRpb25zIHdoaWNoIGFyZSB1c2VkIGluIHRoZSBjdXJyZW50IDMyLWJpdCBKVk1zLiBGb3IgZnV0dXJlIAogICAgICAgICAgIDY0LWJpdCBKVk1zIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2UgdGhlc2UgbWFwcGluZ3MgLSBlZyBvbiBVbml4IExQNjQgCiAgICAgICAgICAgc3lzdGVtcywgYnV0IG5vdCBvbiBNaWNyb3NvZnQgNjRiaXQgV2luZG93cyB3aGljaCB3aWxsIGJlIHVzaW5nIGEgCiAgICAgICAgICAgUDY0IElMMzIgbW9kZWwuIFRoaXMgbWF5IGJlIGF1dG9tYXRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFNXSUcuCgowMS8xMC8yMDAyOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbIDUwMTY3NyBdICVpbml0IGJsb2NrIGluIHdyb25nIHBsYWNlLiBSZXBvcnRlZAogICAgICAgICAgIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMDEvMDkvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIERlZmF1bHQgc3VwcG9ydCBmb3IgdGhlIGxvbmcgbG9uZyB0eXBlLiBzaWduZWQgbG9uZyBsb25nIGlzIAogICAgICAgICAgIG1hcHBlZCB0byBhIEphdmEgbG9uZy4gdW5zaWduZWQgbG9uZyBsb25nIGlzIG1hcHBlZCB0byBCaWdJbnRlZ2VyLgoKMDEvMDkvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRXhwZXJpbWVudGFsIGNoYW5nZSB0byBwYXJzZXIgdG8gYmV0dGVyIHN1cHBvcnQgbWl4aW5nIG9mCiAgICAgICAgICAgaW50LCBsb25nLCBzaG9ydCwgdW5zaWduZWQsIGZsb2F0LCBhbmQgZG91YmxlLiAgIFRoZSBwYXJzZXIKICAgICAgICAgICBzaG91bGQgbm93IHN1cHBvcnQgdHlwZXMgbGlrZSB0aGlzOgogICAgCiAgICAgICAgICAgICAgICBzaG9ydCB1bnNpZ25lZCBpbnQKICAgICAgICAgICAgICAgIGludCAgIHVuc2lnbmVkIHNob3J0CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaG9ydAoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBlbmFibGVzIGEgdHlwZSBvZiAnbG9uZyBkb3VibGUnIChwcmV2aW91c2x5CiAgICAgICAgICAgIHVuc3VwcG9ydGVkKSB0byBiZSB1c2VkLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ2FzdGluZyBmaXggZm9yIHdoZW4gZnVuY3Rpb24gcmV0dXJuIHR5cGUgaXMgYSBwb2ludGVyIGFzIAogICAgICAgICAgIHJlcG9ydGVkIGJ5IEdhcnkgUGVubmluZ3RvbiAyMDAyLTAxLTA1LiBUaGUgdXBwZXIgMzJiaXRzIG9mIHRoZSAKICAgICAgICAgICA2NCBiaXQgamxvbmcgd2lsbCBoYXZlIGNvbnRhaW5lZCBqdW5rIGZvciAzMmJpdCBwb2ludGVycy4KCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBCZXR0ZXIgcG9pbnRlciBoYW5kbGluZyBpbiBKYXZhIGlzIHBvc3NpYmxlIGFzIHRoZSAKICAgICAgICAgICBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBoYXZlIGJlZW4gYWRkZWQgaW50byB0eXBlbWFwcy5pLgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdICRudWxsIGNhbiBiZSB1c2VkIGluIGlucHV0IHR5cGVtYXBzIHRvIHJldHVybiBlYXJseSBmcm9tIEpOSSAKICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBoYXZlIGVpdGhlciB2b2lkIG9yIGEgbm9uLXZvaWQgcmV0dXJuIHR5cGUuIEV4YW1wbGU6CgogICAgICAgICAgICAgJXR5cGVtYXAoY2hlY2spIGludCAqICV7IAogICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuICRudWxsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAlfQoKICAgICAgICAgICBJZiB0aGUgdHlwZW1hcCBnZXRzIHB1dCBpbnRvIGEgZnVuY3Rpb24gd2l0aCB2b2lkIGFzIHJldHVybiwgJG51bGwgCiAgICAgICAgICAgd2lsbCBleHBhbmQgdG8gbm90aGluZzoKCiAgICAgICAgICAgICB2b2lkIGpuaV9mbiguLi4pIHsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH0KCiAgICAgICAgICAgb3RoZXJ3aXNlICRudWxsIGV4cGFuZHMgdG8gemVybywgd2hlcmUgamF2YXJldHVybnR5cGUgaXMgZWl0aGVyIGEgCiAgICAgICAgICAgcG9pbnRlciBvciBhIHByaW1pdGl2ZSB0eXBlOgoKICAgICAgICAgICAgIGphdmFyZXR1cm50eXBlIGpuaV9mbiguLi4pIHsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9CgowMS8wMi8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gVGhlIEphdmEgbW9kdWxlIGluY29ycmVjdGx5IHVzZWQgYXJnb3V0IHR5cGVtYXBzIGZvciAKICAgICAgICAgICBzdHJpbmdzLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQgYW5kIHRoZSBjb2RlIG5vdyByZXNpZGVzCiAgICAgICAgICAgaW4gdGhlIGZyZWVhcmcgdHlwZW1hcC4gVGhlIGFyZ291dCBhcnJheSB0eXBlbWFwcyBoYXZlIGJlZW4gc3BsaXQgaW50byAKICAgICAgICAgICBhcmdvdXQgYW5kIGZyZWVhcmcgdHlwZW1hcHMuIFRoaXMgY29ycmVjdGlvbiBtYXkgcmVxdWlyZSBzb21lIHVzZXIgCiAgICAgICAgICAgd3JpdHRlbiB0eXBlbWFwcyB0byBiZSBtb2RpZmllZC4gCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8yOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gTXVsdGkgdHlwZW1hcHMgbm93IHdvcmtpbmcgZm9yIEphdmEgc2VlIG11bHRpbWFwIGV4YW1wbGUuCiAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgcmVjZW50bHkgaW50cm9kdWNlZCBidWcgLSBmcmVlYXJnIHR5cGVtYXAgY29kZSB3YXMgYXBwZWFyaW5nCiAgICAgICAgICAgYmVmb3JlIHRoZSBmdW5jdGlvbiBjYWxsLgoKMTIvMjgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEpDQUxMIG1hY3JvIGZvciBKTkkgY2FsbHMgdGhhdCB3b3JrIGluIGJvdGggQyBhbmQgQysrIHR5cGVtYXBzCiAgICAgICAgICAgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggSkNBTEwwLCBKQ0FMTDEsIEpDQUxMMiwgSkNBTEwzIGFuZCBKQ0FMTDQgCiAgICAgICAgICAgbWFjcm9zLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgUmVzb2x2ZWQgc29tZSBpbmNvbnNpc3RlbnQgYmVoYXZpb3Igd2l0aCAlcmVuYW1lIGFuZCBjbGFzcyByZW5hbWluZy4KICAgICAgICAgICBJZiB5b3Ugc3BlY2lmeSB0aGUgZm9sbG93aW5nOgogCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSAgQmFyOwoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGVuIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBhcHBsaWVzIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwKICAgICAgICAgICBhbmQgdGhlIGRlc3RydWN0b3IgKGFsbCB3aWxsIGJlIHJlbmFtZWQgdG8gRm9vKS4KCiAgICAgICAgICAgSWYgYSBjbGFzcyBkZWZpbmVzIG1vcmUgdGhhbiBvbmUgY29uc3RydWN0b3IsIHRoZSBvdmVybG9hZGVkIHZhcmlhbnRzCiAgICAgICAgICAgY2FuIHN0aWxsIGJlIHJlbmFtZWQgYnkgc3BlY2lmeWluZyBwYXJhbWV0ZXJzIHRvICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVyZW5hbWUoQmFyX2NvcHkpIEJhcihCYXIgJik7CiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICAgIEJhcihCYXIgJik7CiAgICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGVyZSBhcmUgc3RpbGwgc29tZSBvZGQgY29ybmVyIGNhc2VzLiAgSWYgeW91IHNwZWNpZnkKCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSA6OkJhcjsKCiAgICAgICAgICAgdGhlbiBvbmx5IHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBjaGFuZ2VkIGFuZCB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcgogICAgICAgICAgIG5hbWVzIGFyZSBsZWZ0IHVubW9kaWZpZWQuICBJZiB5b3Ugc3BlY2lmeSAKCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSAqOjpCYXI7CgogICAgICAgICAgIHRoZW4gdGhlIG5hbWVzIG9mIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGZ1bmN0aW9ucyBhcmUgbW9kaWZpZWQgYnV0CiAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIG5vdC4KCjEyLzIxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBqbmksIGp0eXBlIGFuZCBqc3R5cGUgdHlwZW1hcHMgbm8gbG9uZ2VyIGhhcmRjb2RlZCBidXQgcmVhbCAKICAgICAgICAgICB0eXBlbWFwcy4gTmV3IHZhcmlhYmxlIHN1YnN0aXR1dGlvbiwgJGphdmFjbGFzc25hbWUsIGNhbiBiZSB1c2VkIGluCiAgICAgICAgICAgdGhlIGpzdHlwZSB0eXBlbWFwcy4gSXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgSmF2YSBzaGFkb3cgY2xhc3MgbmFtZQogICAgICAgICAgIHdoZXJlIGFwcGxpY2FibGUuCiAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgcmVjZW50bHkgaW50cm9kdWNlZCBidWcgdG8gZG8gd2l0aCBpbmhlcml0YW5jZSB3aGVuIAogICAgICAgICAgIHVzaW5nICVpbXBvcnQuCiAgICAgICAgICAgW0phdmFdIEEgZmV3IG1vcmUgYnVnIGZpeGVzLCB0b2RvIHdpdGggJXJlbmFtZSBhbmQgdXNpbmcgdGhlIGtpbmQKICAgICAgICAgICB3aXRoIHRoZSB0eXBlLCBlZyAKICAgICAgICAgICB2b2lkIGZuKHVuaW9uIHVuaSBteXVuaSwgc3RydWN0IHN0ciBteXN0ciwgY2xhc3MgY2wgbXljbCk7CgoxMi8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0OTQ1MjQgXSBQcmVwcm9jZXNzb3IgYnVnIC0gYXBvc3Ryb3BoZSBhbmQgI3N1YnN0LgoKMTIvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgU1dJR19WRVJTSU9OIHByZXByb2Nlc3NvciBzeW1ib2wuICAgVGhpcyBpcyBhIGhleGFkZWNpbWFsCiAgICAgICAgICAgaW50ZWdlciBzdWNoIGFzIDB4MDEwMzExIChjb3JyZXNwb25kaW5nIHRvIFNXSUctMS4zLjExKS4gIFRoaXMgY2FuCiAgICAgICAgICAgYmUgdXNlZCBpbiB0aGUgaW50ZXJmYWNlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAjaWYgU1dJR19WRVJTSU9OID49IDB4MDEwMzExCiAgICAgICAgICAgICAgIC8qIFVzZSBzb21lIGZhbmN5IG5ldyBmZWF0dXJlICovCiAgICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICBOb3RlOiBUaGUgdmVyc2lvbiBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCBTV0lHCiAgICAgICAgICAgd3JhcHBlciBmaWxlLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMi8yMC8yMDAxOm1rb2VwcGUKCSAgIFtNelNjaGVtZV06IFJlbmFtZWQgbXpzd2lnX21ha2VfYm9vbGVhbiB0bwoJICAgc3dpZ19tYWtlX2Jvb2xlYW4sIGFzIHRoZSBsYXR0ZXIgaXMgdXNlZCBpbiB0aGUgdHlwZW1hcHMuCgkgICBSZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCjEyLzE3LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogUmV3cm90ZSBsaXN0LXZlY3Rvci5pIHVzaW5nIG11bHRpLWRpc3BhdGNoCgkgICB0eXBlbWFwcy4gIFVwZGF0ZWQgcG9pbnRlci1pbi1vdXQuaS4gIE1ha2UgdGhlCgkgICBkZXByZWNhdGVkIHR5cGVtYXAtc3Vic3RpdHV0aW9uIG9mICIkc291cmNlIiBpbiAiYXJnb3V0IgoJICAgd29yayBhcyBiZWZvcmUuCgoxMi8xNi8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IEZpeGVkIG1hY3JvcyAldmFsdWVzX2FzX2xpc3QsICV2YWx1ZXNfYXNfdmVjdG9yLAoJICAgJW11bHRpcGxlX3ZhbHVlcyB0byB1c2UgdGhlIHByb3BlciAlcHJhZ21hIHN5bnRheC4gIE5ldwoJICAgR3VpbGUgZXhhbXBsZS90ZXN0ICJtdWx0aXZhbHVlIjsgbmV3IEd1aWxlIHJ1bi10ZXN0IGZvcgoJICAgdGVzdC1zdWl0ZSBpdGVtICJsaXN0LXZlY3RvciIgKGN1cnJlbnRseSBicm9rZW4pLgoKMTIvMTQvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBGaXhlZCB0eXBlbWFwLXN1YnN0aXRpb24gYnVnIGZvciAidmFyaW4iLiAgUmVsYXhlZAoJICAgdmFsaWQtaWRlbnRpZmllciBjaGVjayB0byBhbGxvdyBhbGwgUjVSUyBpZGVudGlmaWVycy4KCgpWZXJzaW9uIDEuMy4xMCAoRGVjZW1iZXIgMTAsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkICV0eXBlbWFwIHNvIHRoYXQgJXsgLi4uICV9IGNhbiBhbHNvIGJlIHVzZWQgYXMgYQogICAgICAgICAgIGNvZGUgYmxvY2sgKG1vc3RseSBmb3IgY29tcGxldGVuZXNzKS4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGJsYWggJXsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICBUaGlzIGZvcm0gZG9lcyBub3QgaW50cm9kdWNlIGEgbmV3IGJsb2NrIHNjb3BlLiAgQWxzbywgdGhlCiAgICAgICAgICAgY29kZSBlbmNsb3NlZCBpbiAleyAuLi4gJX0gaXMgbm90IHByb2Nlc3NlZCBieSB0aGUgcHJlcHJvY2Vzc29yLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDU5NjE0IF0gU1dJRyB3aXRoIG11bHRpcGxlIFRDTCBpbnRlcnByZXRlcnMuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0MTcxNDEgXSBydWJ5ZGVjLnN3ZyBpcyB3cm9uZwogICAgICAgICAgIFJlcG9ydGVkIGJ5IFBhdWwgQnJhbm5hbi4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQxMDU1NyBdIFByb2JsZW0gd2l0aCAlYWRkbWV0aG9kcyBvbiBOVC4KICAgICAgICAgICBSZXBvcnRlZCBieSBNYWdudXMgTGp1bmcuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NDUyMzMgXSBFbmhhbmNlbWVudDogaGFuZGxlIGFjY2VzcyBjaGFuZ2UuCiAgICAgICAgICAgU1dJRyBub3cgcGFyc2VzIChidXQgaWdub3JlcykgQysrIGFjY2VzcyBjaGFuZ2VzIGZvciB0aGUKICAgICAgICAgICB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgdm9pZCBzb21ldGhpbmcoKSB7IH0KICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIEEoKSB7fQogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBjbGFzcyBCIDogcHJpdmF0ZSBBIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIEIoKSA6IEEoKSB7IH0KICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIEE6OnNvbWV0aGluZzsgICAgPC0tLS0gUGFyc2VkLCBidXQgaWdub3JlZAogICAgICAgICAgICAgfTsKIAogICAgICAgICAgIFN1Z2dlc3RlZCBieSBLcnp5c3p0b2YgS296bWluc2tpLgoKMTIvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgRml4IGZvciBSdWJ5IHRvIHdvcmsgdXNpbmcgVmlzdWFsIEMrKy4KCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ2NTY4NyBdIHVuc2lnbmVkIHNob3J0IHBhcmFtZXRlcnMgZmFpbC4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0ODk1OTQgXSBQeVN0cmluZ19Gcm9tU3RyaW5nIGNhbid0IHRha2UgTlVMTCBhcmcuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9obiBNZXJyaXR0LiAgIFNXSUcgbm93IGNvbnZlcnRzIHN0cmluZyB2YWx1ZXMKICAgICAgICAgICB0byBQeXRob24gdXNpbmcgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgIHJlc3VsdG9iaiA9IHJlc3VsdCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcocmVzdWx0KSA6IFB5X0J1aWxkVmFsdWUoIiIpOwoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDYzNTYxIF0gVHlwZSBjb252ZXJzaW9ucyBub3QgZ2VuZXJhdGVkLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCQoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzAyMTcgXSBUY2wgZGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZy4KICAgICAgICAgICBSZXBvcnRlZCBieSBTaGF1biBMb3dyeS4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3MjA4OCBdIGRlZmluZWQoTUFDUk8pIGV4cGFuZGVkIGV2ZXJ5d2hlcmUuCiAgICAgICAgICAgRW1iZWRkZWQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgc3VjaCBhcwoKICAgICAgICAgICAgICAlI2lmIGRlZmluZWQoRk9PKQoKICAgICAgICAgICBhcmUgbm90IGV4cGFuZGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzY0NjcgXSBQcm9ibGVtcyB3aXRoICNkZWZpbmUgJiBjb21tYXMuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0Nzc1NDcgXSB3cm9uZyBkZWNsYXJhdGlvbiBvZiBwb2ludGVyIGZ1bmN0aW9ucy4KICAgICAgICAgICBCYWQgcHJvdG90eXBlcyBpbiBMaWIvdGNsL3B0cmxhbmcuaS4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ4MzE4MiBdIENvbnN0YW50cyBjYW4gdGFrZSBhcmdzIGJ5IG1pc3Rha2UuIAogICAgICAgICAgIFdoZW4gc3dpZyAtcGVybDUgLWNvbnN0IGlzIHVzZWQsIGNvbnN0YW50cyBhcmUgZGVjbGFyZWQKICAgICAgICAgICB3aXRoIGEgdm9pZCBwcm90b3R5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdWIgSUNPTlNUICgpIHsgJGV4YW1wbGVjOjpJQ09OU1QgfQoKICAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgUmljaCBXYWxlcy4KCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIE5ldyAlZXhjZXB0aW9uIGRpcmVjdGl2ZS4gICBUaGlzIGlzIGludGVuZGVkIHRvIHJlcGxhY2UgJWV4Y2VwdC4KICAgICAgICAgICBJdCB3b3JrcyBpbiBleGFjdGx5IHRoZSBzYW1lIG1hbm5lciBleGNlcHQgaXQgZG9lcyBub3QgYWNjZXB0IGEgCiAgICAgICAgICAgbGFuZ3VhZ2Ugc3BlY2lmaWVyLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVleGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICBjYXRjaChTb21lRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICBlcnJvcgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CgogICAgICAgICAgICVleGNlcHRpb24gaXMgYWxzbyBuYW1lIGF3YXJlLS0tYWxsb3dpbmcgaXQgdG8gYmUgYXBwbGllZCB0bwogICAgICAgICAgIHNwZWNpZmljIGRlY2xhcmF0aW9ucyBpbiBhbiBpbnRlcmZhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBmb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBhbnkgZnVuY3Rpb24vbWV0aG9kIGZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICVleGNlcHRpb24gRm9vOjpiYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBtZXRob2QgYmFyIGluIGNsYXNzIEZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAlZXhjZXB0aW9uIEZvbzo6YmFyKGRvdWJsZSkgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBtZXRob2QgYmFyKGRvdWJsZSkgaW4gY2xhc3MgRm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlIHNlbWFudGljcyBvZiB0aGlzIG5hbWUgbWF0Y2hpbmcgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3IgJXJlbmFtZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIFN1YnN0YW50aWFsIGNsZWFudXAgb2YgdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgY29kZS4gIFNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgdXNlZCB0byBiZSBjcmVhdGVkIGluIHRoaXMgcmF0aGVyIGNvbXBsaWNhdGVkIG1hbm5lciBpbnZvbHZpbmcgYWJvdXQKICAgICAgICAgICBhIGhhbGYtZG96ZW4gc3RyaW5ncyBjcmVhdGVkIGluIGJpdHMgYW5kIHBpZWNlcy4gICBTaGFkb3cgY2xhc3NlcwogICAgICAgICAgIGFyZSBub3cgZ2VuZXJhdGVkIGluIGEgbW9yZSBzdHJhaWdodGZvcndhcmQgbWFubmVyLS1pbiB0aGUgc2FtZQogICAgICAgICAgIG9yZGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIFRoZSBvcmRlciBpbiB3aGljaCBkZWNsYXJhdGlvbnMgYXBwZWFyIGluIHRoZSBzaGFkb3cgZmlsZSBtYXkgZGlmZmVyLgogICAgICAgICAgIAoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgJWluc2VydCBkaXJlY3RpdmUgKCV7IC4uLiAlfSwgJXJ1bnRpbWUsICVoZWFkZXIsICV3cmFwcGVyLCBldGMuKQogICAgICAgICAgIGNhbiBub3cgYmUgdXNlZCBpbnNpZGUgb2YgYSBjbGFzcyBkZWZpbml0aW9uLiAgIFRoaXMgaGFzIHBvdGVudGlhbAogICAgICAgICAgIHVzZXMgd2hlbiBnZW5lcmF0aW5nIHNoYWRvdyBjbGFzcyBjb2RlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICVpbnNlcnQoInNoYWRvdyIpICV7CiAgICAgICAgICAgICAgICAgIyBTb21lIHB5dGhvbiBjb2RlCiAgICAgICAgICAgICAgICAgZGVmIGJsYWgoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgICBwcmludCAiSSdtIGJsYWghIgogICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZSBzdXBwb3J0IGZvciBjbGFzcyBjb2RlIGluc2VydGlvbiBkZXBlbmRzIG9uIHRoZSBsYW5ndWFnZSBtb2R1bGUuCiAgICAgICAgICAgSG93ZXZlciwgdGhlIGludGVudCBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gc2ltcGxpZnkgdGhlIHRhc2sgb2YgZXh0ZW5kaW5nCiAgICAgICAgICAgc2hhZG93IGNsYXNzIGNvZGUuICAgSW4gdGhlIFB5dGhvbiBtb2R1bGUsIHRoaXMgaW5zZXJ0cyBjb2RlIHdpdGggdGhlCiAgICAgICAgICAgcHJvcGVyIGxldmVsIG9mIGluZGVuZGF0aW9uIChyZWdhcmRsZXNzIG9mIHdoYXQgd2FzIHVzZWQgaW4gdGhlIFNXSUcKICAgICAgICAgICBpbnRlcmZhY2UpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzI5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIEphdmEgYW5kIFB5dGhvbiBtb2R1bGVzIHRvIHdvcmsgb24gY3lnd2luLgogICAgICAgICAgIFVuZm9ydHVuYXRlbHkgYSBsb3Qgb2YgdGhlIHB5dGhvbiBtb2R1bGUgaGFzIHN0YXJ0ZWQgdG8gcHJvZHVjZXMgY29kZSAKICAgICAgICAgICB3aGljaCBjYW5ub3QgYmUgYXV0by1pbXBvcnRlZCB1c2luZyBjeWd3aW4gbGlidG9vbHMgc28gbW9zdCBvZiBpdCBpcyAKICAgICAgICAgICBzdGlsbCBicm9rZW4uCgoxMS8yOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgJXJlbmFtZSBhbmQgJWZlYXR1cmUgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCBpbnNpZGUKICAgICAgICAgICBvZiBhIGNsYXNzIGRlZmluaXRpb24uIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgJXJlbmFtZShmb29faSkgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgJXJlbmFtZShmb29fZCkgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgV2hlbiB1c2VkIGluIHRoaXMgbWFubmVyLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgb25seSBhcHBsaWVzCiAgICAgICAgICAgdG8gbWVtYmVycyBvZiB0aGUgY2xhc3MgaW4gd2hpY2ggaXQgYXBwZWFycyBhcyB3ZWxsIGFzIGFsbAogICAgICAgICAgIGRlcml2ZWQgY2xhc3Nlcy4gIEluIGZhY3QsIHRoaXMgaXMgcmVhbGx5IGp1c3QgdGhlIHNhbWUKICAgICAgICAgICBhcyBzYXlpbmc6CgogICAgICAgICAgICAgJXJlbmFtZShmb29faSkgRm9vOjpmb28oaW50KTsKICAgICAgICAgICAgICVyZW5hbWUoZm9vX2QpIEZvbzo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCB0aGUgZXhwZXJpbWVudGFsICVmZWF0dXJlIGRpcmVjdGl2ZS4gICVmZWF0dXJlIGNhbiBiZQogICAgICAgICAgIHVzZWQgdG8gYXR0YWNoIGFyYml0cmFyeSBzdHJpbmcgYXR0cmlidXRlcyB0byBwYXJzZSB0cmVlIG5vZGVzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIGJsYWggewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICB3aGF0ZXZlcjsgICAgICAKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic2V0IikgKjo6eF9zZXQgIngiOwoKICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiYmxhaCIpIEZvbzo6YmFyKGludCxkb3VibGUpIGNvbnN0ICJzcGFtIjsKCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBib3Jyb3dlZCBmcm9tIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZS4gIEluIGZhY3QsIHRoZQogICAgICAgICAgIGV4YWN0IHNhbWUgc2VtYW50aWNzIGFwcGx5IChpbmhlcml0YW5jZSwgbWF0Y2hpbmcsIGV0Yy4pLgoKICAgICAgICAgICAlZmVhdHVyZSBpcyBhIHZlcnkgcG93ZXJmdWwgbG93LWxldmVsIHByaW1pdGl2ZSB0aGF0IGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICAgY3VzdG9taXplIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgdG8gcHJvdmlkZSBoaW50cyB0byAKICAgICAgICAgICBhbnkgc3RhZ2Ugb2YgY29kZSBnZW5lcmF0aW9uLiAgIEZlYXR1cmVzIGFyZSBhdHRhY2hlZCB0bwogICAgICAgICAgIHBhcnNlIHRyZWUgbm9kZXMgYXMgYXR0cmlidXRlcyB3aXRoIG5hbWVzIGxpa2UgImZlYXR1cmU6KiIgd2hlcmUgKiAKICAgICAgICAgICBpcyByZXBsYWNlZCBieSB0aGUgZmVhdHVyZSBuYW1lIChlLmcuLCAiZmVhdHVyZTpleGNlcHQiLCAiZmVhdHVyZTpzZXQiLCAKICAgICAgICAgICBldGMuKS4gICBMYW5ndWFnZSBtb2R1bGVzIGNhbiB0aGVuIGxvb2sgZm9yIHRoZSBmZWF0dXJlcyB1c2luZyAKICAgICAgICAgICBhIHNpbXBsZSBhdHRyaWJ1dGUgbG9va3VwLgoKICAgICAgICAgICAlZmVhdHVyZSBpcyBpbnRlbmRlZCB0byBiZSBhIHJlcGxhY2VtZW50IGZvciBhIG51bWJlciBvZgogICAgICAgICAgIG9sZGVyIFNXSUcgZGlyZWN0aXZlcyBpbmNsdWRpbmcgJWV4Y2VwdCBhbmQgc3BlY2lhbGl6ZWQKICAgICAgICAgICBwcmFnbWFzLiBJdCBpcyBtb3JlIHBvd2VyZnVsIChkdWUgdG8gaXRzIHBhcmFtZXRlcml6ZWQKICAgICAgICAgICBuYW1lIG1hdGNoaW5nKSBhbmQgaXQgcHJvdmlkZXMgdmVyeSBwcmVjaXNlIGNvbnRyb2wgb3ZlcgogICAgICAgICAgIGhvdyBjdXN0b21pemF0aW9uIGZlYXR1cmVzIGFyZSBhdHRhY2hlZCB0byBpbmRpdmlkdWFsCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgIFRoZXJlIGFyZSBmdXR1cmUgZXhwYW5zaW9uIHBsYW5zIHRoYXQgd2lsbAogICAgICAgICAgIGJ1aWxkIHVwb24gdGhpcyBjYXBhYmlsaXR5IGFzIHdlbGwuCgogICAgICAgICAgIEl0J3Mgbm90IGNlcnRhaW4gdGhhdCAlZmVhdHVyZSB3aWxsIGV2ZXIgYmUgdXNlZCBkaXJlY3RseQogICAgICAgICAgIGJ5IFNXSUcgdXNlcnMuICBJbnN0ZWFkLCBpdCBtYXkgYmUgYSBsb3ctbGV2ZWwgcHJpbWl0aXZlCiAgICAgICAgICAgdGhhdCBpcyB1c2VkIGluIGhpZ2gtbGV2ZWwgbWFjcm8gZGVmaW5pdGlvbnMuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgdG8gc3VwcG9ydCBwcm9wZXJ0aWVzLCB5b3UgbWlnaHQgZGVmaW5lIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAlZGVmaW5lICVwcm9wZXJ0eShuYW1lLCBzZXRmLCBnZXRmKQogICAgICAgICAgICVmZWF0dXJlKCJzZXQiKSBzZXRmICNuYW1lOwogICAgICAgICAgICVmZWF0dXJlKCJnZXQiKSBnZXRmICNuYW1lOwogICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgV2hpY2ggYWxsb3dzIGEgdXNlciB0byBzcGVjaWZ5IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgICVwcm9wZXJ0eShwLCBnZXRfcCwgc2V0X3ApOwoKICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgaW50ICBnZXRfcCgpOwogICAgICAgICAgICAgIHZvaWQgc2V0X3AoaW50KTsKICAgICAgICAgICB9OwoKICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogIAoxMS8yNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgVGNsIG1vZHVsZSBoYXMgYmVlbiBleHBhbmRlZCB3aXRoIHNvbWUgbmV3IGZlYXR1cmVzIGZvcgogICAgICAgICAgIG1hbmFnaW5nIG9iamVjdCBvd25lcnNoaXAuICBGb3IgZXhhbXBsZToKICAgICAgICAgCiAgICAgICAgICAgICAgICBzZXQgYyBbQ2lyY2xlIC1hcmdzIDIwXQogICAgICAgICAgICAgICAgJGMgYXJlYSAgICAgICAgICAgICAjIEludm9rZSBhIG1ldGhvZAogICAgICAgICAgICAgICAgJGMgLWRpc293biAgICAgICAgICAjIFJlbGVhc2VzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0CiAgICAgICAgICAgICAgICAkYyAtYWNxdWlyZSAgICAgICAgICMgQWNxdWlyZXMgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QKCiAgICAgICAgICAgSWYgVGNsIG93bnMgdGhlIG9iamVjdCwgaXRzIGRlc3RydWN0b3IgaXMgaW52b2tlZCB3aGVuIHRoZSAKICAgICAgICAgICBjb3JyZXNwb25kaW5nIG9iamVjdCBjb21tYW5kIGlzIGRlbGV0ZWQgaW4gVGNsLiAgCgogICAgICAgICAgIFRvIHNpbXBsaWZ5IHRoZSBkZXN0cnVjdGlvbiBvZiBvYmplY3RzLCB0aGUgZm9sbG93aW5nIHN5bnRheAogICAgICAgICAgIGNhbiBiZSB1c2VkOgoKICAgICAgICAgICAgICAgICRjIC1kZWxldGUgICAgICAgICAjIERlbGV0ZSBhbiBvYmplY3QKCiAgICAgICAgICAgVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSBmb3IgdGhlIG1vcmUgb2JzY3VyZSB2YXJpYW50IG9mIAoKICAgICAgICAgICAgICAgIHJlbmFtZSAkYyB7fQoKICAgICAgICAgICBUaGVzZSBmZWF0dXJlcyBhbHNvIGFkZCBmdW5jdGlvbmFsaXR5IGF0IHRoZSBDIEFQSSBsZXZlbC4KICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYW5hZ2Ugb3duZXJzaGlwIGZyb20gQyBhbmQKICAgICAgICAgICBjYW4gYmUgdXNlZCBpbiB0eXBlbWFwcy4KCiAgICAgICAgICAgICAgICBTV0lHX0FjcXVpcmUodm9pZCAqcHRyKTsKICAgICAgICAgICAgICAgIFNXSUdfRGlzb3duKHZvaWQgKnB0cik7CgogICAgICAgICAgIEEgbmV3IGZ1bmN0aW9uIGZvciBjb25zdHJ1Y3RpbmcgaW5zdGFuY2VzIGlzIGFsc28gYXZhaWxhYmxlOgoKICAgICAgICAgICAgICAgIFRjbF9PYmogKgogICAgICAgICAgICAgICAgU1dJR19OZXdJbnN0YW5jZU9iaihUY2xfSW50ZXJwICppbnRlcnAsIHZvaWQgKnB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5cGUsIGludCBvd24pOwoKICAgICAgICAgICBXaGVuIHVzZWQgaW4gYSB0eXBlbWFwLCB0aGlzIGNyZWF0ZXMgYSBwb2ludGVyIG9iamVjdCBhbmQKICAgICAgICAgICBhbiBpbnRlcnByZXRlciBjb21tYW5kIHRoYXQgY2FuIGJlIHVzZWQgdG8gaXNzdWUgbWV0aG9kcyBhbmQKICAgICAgICAgICBhY2Nlc3MgYXR0cmlidXRlcyBhcyBzaG93biBhYm92ZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjExLzIzLzIwMDE6YmVhemxleQogICAgICAgICAgIEFsbCBQeXRob24tcmVsYXRlZCAlcHJhZ21hIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQuCiAgICAgICAgICAgTW9zdCBvZiB0aGVzZSB3ZXJlIHdyaXR0ZW4gZm9yIG9sZGVyIFNXSUcgdmVyc2lvbnMgaW4gb3JkZXIgdG8KICAgICAgICAgICBjb21wZW5zYXRlIGZvciBsaW1pdGF0aW9ucyBpbiBlYXJsaWVyIHJlbGVhc2VzLiAgSW4gYW4gZWZmb3J0CiAgICAgICAgICAgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgY29kZS1jbHV0dGVyIGFuZCBwb3RlbnRpYWwgZm9yIGVycm9ycywKICAgICAgICAgICBpdCBpcyBlYXNpZXIgdG8gc2ltcGx5IGVsaW1pbmF0ZSB0aGUgcHJhZ21hcyBhbmQgdG8gc3RhcnQgb3ZlcgogICAgICAgICAgIChpZiBuZWVkZWQpLiAgVG8gYmUgaG9uZXN0LCBJJ20gbm90IGV2ZW4gc3VyZSB0aGUgcHJhZ21hcwogICAgICAgICAgIHdvcmtlZCBpbiAxLjMuOSBhbmQgcmVjZW50IHJlbGVhc2VzLgoKICAgICAgICAgICBOb3RlOiBJZiB5b3UgbmVlZCB0byBpbnNlcnQgY29kZSBpbnRvIHRoZSBzaGFkb3cgY2xhc3MgZmlsZQogICAgICAgICAgIGNyZWF0ZWQgYnkgU1dJRywgc2ltcGx5IHVzZSB0aGUgJXNoYWRvdyBkaXJlY3RpdmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlc2hhZG93ICV7CiAgICAgICAgICAgICAgZGVmIHNvbWVfcHl0aG9uX2NvZGUoKTogICAgICAgICAKICAgICAgICAgICAgICAgICAgcHJpbnQgImJsYWghIgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3dlZXBpbmcgY2hhbmdlcyB0byB0aGUgd2F5IGluIHdoaWNoIHRoZSBQeXRob24gbW9kdWxlIGhhbmRsZXMKICAgICAgICAgICBzaGFkb3cgY2xhc3Nlcy4gICBJbiBlYXJseSBpbXBsZW1lbnRhdGlvbnMsIHNoYWRvdyBjbGFzc2VzIHdlcmUKICAgICAgICAgICBtZXJlbHkgUHl0aG9uIHdyYXBwZXJzIGFyb3VuZCB0eXBlZCBwb2ludGVyIG9iamVjdHMuIEhvd2V2ZXIsIAogICAgICAgICAgIHNvbWUgdXNlcnMgYWN0dWFsbHkgd2FudGVkIHRvIHJlY2VpdmUgdGhlIHNoYWRvdyBjbGFzcyBvYmplY3QgaW4gQy4KICAgICAgICAgICBUbyBhY2NvbW1vZGF0ZSB0aGlzLCB0aGUgZGVyZWZlcmVuY2luZyBvZiB0aGUgInRoaXMiIHBvaW50ZXIgaW4KICAgICAgICAgICBhIHNoYWRvdyBjbGFzcyB3YXMgbW92ZWQgdG8gQyBhcyBkZXNjcmliZWQgaW4gQ0hBTkdFUyBbOC84Lzk5XS4KICAgICAgICAgICBIb3dldmVyLCB0aGUgcHJvY2VzcyBvZiByZXR1cm5pbmcgcG9pbnRlcnMgdG8gUHl0aG9uIHdhcyBzdGlsbAogICAgICAgICAgIHNvbWV3aGF0IHByb2JsZW1hdGljLiAgU3BlY2lmaWNhbGx5LCBzaGFkb3cgY2xhc3NlcyBuZXZlciB3b3JrZWQKICAgICAgICAgICBpbiBzaXR1YXRpb25zIHN1Y2ggYXMgdGhlc2U6CgogICAgICAgICAgICAgLSAgIFVzZSBvZiBhbnkga2luZCBvZiBvdXRwdXQgdHlwZW1hcCAoJ291dCcgb3IgJ2FyZ291dCcpCiAgICAgICAgICAgICAtICAgR2xvYmFsIHZhcmlhYmxlcyAoYnJva2VuIGFzIGZhciBhcyBJIGNhbiB0ZWxsKS4KCiAgICAgICAgICAgSW4gdGhlIHBhc3QsIHNvbWUgdXNlcnMgaGF2ZSBkZWFsdCB3aXRoIHRoaXMgYnkgbWFudWFsbHkgdHJ5aW5nCiAgICAgICAgICAgdG8gY3JlYXRlIHNoYWRvdyBjbGFzcyBvYmplY3RzIHRoZW1zZWx2ZXMgZnJvbSBDL0MrKy4gIEhvd2V2ZXIsCiAgICAgICAgICAgdGhpcyB3YXMgZGlmZmljdWx0IGJlY2F1c2UgdGhlIEMgd3JhcHBlcnMgZG9uJ3QgcmVhbGx5IGtub3cgaG93CiAgICAgICAgICAgdG8gZ2V0IGFjY2VzcyB0byB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gY2xhc3MuCgogICAgICAgICAgIFRoZSBQeXRob24gbW9kdWxlIGhhcyBub3cgYmVlbiBtb2RpZmllZCB0byBhdXRvbWF0aWNhbGx5IGF0dGFjaAogICAgICAgICAgIHNoYWRvdyBjbGFzcyBvYmplY3RzIHRvIHBvaW50ZXJzIHdoZW4gdGhleSBhcmUgcmV0dXJuZWQgdG8gCiAgICAgICAgICAgUHl0aG9uLiAgIFRoaXMgcHJvY2VzcyBvY2N1cnMgaW4gdGhlIGZ1bmN0aW9uIFNXSUdfTmV3UG9pbnRlck9iaigpCiAgICAgICAgICAgc28gdGhlIHByb2Nlc3MgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudCB0byB1c2Vycy4gICAgQXMgYSByZXN1bHQsCiAgICAgICAgICAgc2hhZG93IGNsYXNzZXMgYXJlIG5vdyBtb3JlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCB3aXRoIHR5cGVtYXBzCiAgICAgICAgICAgYW5kIG90aGVyIGZlYXR1cmVzIG9mIFNXSUcuCgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBpbnRyb2R1Y2UgYSBudW1iZXIgb2YgaW5jb21wYXRpYmlsaXRpZXMuICBUaGUKICAgICAgICAgICBTV0lHX05ld1BvaW50ZXJPYmooKSBub3cgdGFrZXMgYW4gZXh0cmEgcGFyYW1ldGVyICJvd24iIHRvIAogICAgICAgICAgIGluZGljYXRlIG9iamVjdCBvd25lcnNoaXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byByZXR1cm4gYSBwb2ludGVyCiAgICAgICAgICAgdG8gUHl0aG9uIHRoYXQgUHl0aG9uIHNob3VsZCBkZXN0cm95LiAgIEluIGFkZGl0aW9uLCBvbGRlciBjb2RlCiAgICAgICAgICAgdGhhdCB0cmllcyB0byBtYW51YWxseSBjb25zdHJ1Y3Qgc2hhZG93IGNsYXNzIG9iamVjdHMgb3Igd2hpY2gKICAgICAgICAgICBleHBlY3RzIGJhcmUgcG9pbnRlcnMgbWF5IGJyZWFrLS0tc3VjaCBwb2ludGVycyBtYXkgYWxyZWFkeSBiZQogICAgICAgICAgIGVuY2Fwc3VsYXRlZCBieSBhIHNoYWRvdyBjbGFzcy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSAlaW5zZXJ0IGRpcmVjdGl2ZSB0byBhY2NlcHQgc2luZ2xlIGJyYWNlcyB7IC4uLiB9LgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpbnNlcnQoImhlYWRlciIpIHsKICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgd29ya3MgZXhhY3RseSBsaWtlICV7IC4uLiAlfSBleGNlcHQgdGhhdCB0aGUgY29kZSBpbiB0aGUKICAgICAgICAgICBicmFjZXMgaXMgcHJvY2Vzc2VkIHVzaW5nIHRoZSBwcmVwcm9jZXNzb3IuICAgVGhpcyBjYW4gYmUgdXNlZnVsCiAgICAgICAgICAgaW4gY2VydGFpbiBjb250ZXh0cyBzdWNoIGFzIGxvdy1sZXZlbCBjb2RlIGdlbmVyYXRpb24gaW4gCiAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBub3cgdHJhbnNsYXRlZCBpbnRvIHByZXByb2Nlc3NvcgogICAgICAgICAgIHN5bWJvbHMuICBGb3IgZXhhbXBsZToKCQogICAgICAgICAgICAgIC4vc3dpZyAtcHl0aG9uIC1zaGFkb3cgLW1vZHVsZSBibGFoIGludGVyZmFjZS5pCgogICAgICAgICAgIENyZWF0ZXMgdGhlIHN5bWJvbHM6CgogICAgICAgICAgICAgIFNXSUdPUFRfUFlUSE9OIDEKICAgICAgICAgICAgICBTV0lHT1BUX1NIQURPVyAxCiAgICAgICAgICAgICAgU1dJR09QVF9NT0RVTEUgYmxhaAogICAgICAgICAgICAgIAogICAgICAgICAgIE1vZHVsZXMgY2FuIGxvb2sgZm9yIHRoZXNlIHN5bWJvbHMgdG8gYWx0ZXIgdGhlaXIgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICAgaWYgbmVlZGVkLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgIAoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIG92ZXJoYXVsIG9mIHRoZSBQZXJsNSBtb2R1bGUuICBBIGxvdCBvZiBjb2RlIGdlbmVyYXRpb24gaXMKICAgICAgICAgICBub3cgZHJpdmVuIGJ5IHRhYmxlcyBhbmQgdHlwZW1hcHMuICAgVGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgCiAgICAgICAgICAgYWxzbyBtYWtlcyB1c2Ugb2YgdGFibGVzIHRvIGluc3RhbGwgY29uc3RhbnRzLCB2YXJpYWJsZXMsIGFuZAogICAgICAgICAgIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIGlubGluaW5nIGEgYnVuY2ggb2YgcHJvY2VkdXJlIGNhbGxzLiAgVGhlCiAgICAgICAgICAgc2VwYXJhdGUgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gaXMgZ29uZS4gICBNb3N0CiAgICAgICAgICAgY29kZSBnZW5lcmF0aW9uIGlzIGNvbnRyb2xsZWQgdmlhIHRoZSBwZXJsNS5zd2cgZmlsZSBpbiB0aGUKICAgICAgICAgICBsaWJyYXJ5LgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIAoxMS8xMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIHRoZSBDKysgdHlwZW5hbWUga2V5d29yZC4gIFByaW1hcmlseSB0aGlzCiAgICAgICAgICAgaXMgYWRkZWQgdG8gYmV0dGVyIHN1cHBvcnQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCAgYmxhaChDJiB2KSB7CiAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6aXRlcmF0b3IgaSA9IHYuYmVnaW4oKTsKICAgICAgICAgICAgIH0KCiAgICAgICAgICAgTm90ZTogdHlwZW5hbWUgaXMgc3VwcG9ydGVkIGluIHRoZSBwYXJzZXIgaW4gdGhlIHNhbWUgd2F5IGFzICdzdHJ1Y3QnCiAgICAgICAgICAgb3IgJ2NsYXNzJy4gIFlvdSBwcm9iYWJseSBzaG91bGRuJ3QgdXNlIGl0IGFueXdoZXJlIGV4Y2VwdCBpbiB0ZW1wbGF0ZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMTEvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBvdmVyaGF1bCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlIEFQSS4gICBNb3N0IGZ1bmN0aW9ucyBub3cKICAgICAgICAgICB1c2UgYSBjb21tb24sIHZlcnkgc2ltcGxlLCAgQVBJLiAgIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mCiAgICAgICAgICAgaW50ZXJlc3Rpbmcgc2VtYW50aWMgc2lkZS1lZmZlY3RzIG9mIGhvdyBjb2RlIGlzIGFjdHVhbGx5IGdlbmVyYXRlZC4KICAgICAgICAgICBEZXRhaWxzIHdpbGwgYmUgZm9ydGhjb21pbmcgaW4gRG9jL01hbnVhbC9FeHRlbmRpbmcuaHRtbC4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIExhbmd1YWdlIG1vZHVsZXMgd3JpdHRlbiBmb3IKICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHIHdpbGwgbm8gbG9uZ2VyIHdvcmssCgoxMS8xMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIHZlcnkgc3VidGxlIGJ1ZyBkdWUgdG8gdW5uYW1lZCBjbGFzcyB3cmFwcGluZy4gRm9yIGV4YW1wbGUsIGlmCiAgICAgICAgICAgeW91IGRpZCB0aGlzCgogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgaW50IHgseTsKICAgICAgICAgICAgICB9IGdkUG9pbnQsICpnZFBvaW50UHRyOwoKICAgICAgICAgICAgICB2b2lkIGZvbyhnZFBvaW50UHRyIHgpOwoKICAgICAgICAgICBUaGVuIHRoZSBmb28gZnVuY3Rpb24gd291bGQgZ2V0IGEgdHlwZS1lcnJvci4gICBUaGUgcHJvYmxlbSBoYXMKICAgICAgICAgICB0byBkbyB3aXRoIGludGVybmFsIHR5cGVkZWYgaGFuZGxpbmcgYW5kIHRoZSBmYWN0IHRoYXQgdGhlIHR5cGVkZWYKICAgICAgICAgICBkZWNsYXJhdGlvbnMgYWZ0ZXIgdGhlIHN0cnVjdCBhcHBlYXIgbGF0ZXIgaW4gdGhlIHBhcnNlIHRyZWUuCiAgICAgICAgICAgSXQgc2hvdWxkIHdvcmsgbm93LiAgUHJvYmxlbSByZXBvcnRlZCBieSBWaW4gSm92YW5vdmljLgoKMTEvMDkvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byAib3V0IiB0eXBlbWFwcyAoYW5kIHJlbGF0ZWQgdmFyaWF0aW9ucykuICBUaGUgbmFtZQogICAgICAgICAgIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIHR5cGVtYXAgaXMgbm93IHRoZSByYXcgQyBpZGVudGlmaWVyIHRoYXQKICAgICAgICAgICBhcHBlYXJzIG9uIGEgZGVjbGFyYXRpb24uICBUaGlzIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mCiAgICAgICAgICAgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgZm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgaW50IGZvbygpOyAgICAvLyB0eXBlbWFwIGdldHMgYXBwbGllZAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgIFByZXZpb3VzIHZlcnNpb25zIG5ldmVyIHJlYWxseSBzcGVjaWZpZWQgaG93IHRoaXMgd2FzIHN1cHBvc2VkIHRvCiAgICAgICAgICAgd29yay4gIEluIFNXSUcxLjEsIHlvdSBjb3VsZCBwcm9iYWJseSB3cml0ZSBhIHR5cGVtYXAgZm9yIHRoZQogICAgICAgICAgIHdyYXBwZXIgbmFtZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgQmxhaF9mb28geyAuLi4gfQoKICAgICAgICAgICBIb3dldmVyLCB0aGlzIG9sZCBiZWhhdmlvciBpcyBub3cgd2l0aGRyYXduIGFuZCBub3Qgc3VwcG9ydGVkLiAKICAgICAgICAgICBKdXN0IHVzZSB0aGUgbWVtYmVyIG5hbWUgd2l0aG91dCBhbnkgc29ydCBvZiBzcGVjaWFsIHByZWZpeC4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gVGNsIG1vZHVsZSBpbml0aWFsaXphdGlvbjoKCiAgICAgICAgICAgKDEpIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGNvZGUgbmVlZGVkIHRvIHdvcmsgd2l0aAogICAgICAgICAgICAgICAgVGNsIHN0dWJzLiAgU2ltcGx5IGNvbXBpbGUgd2l0aCAtRFVTRV9UQ0xfU1RVQlMuCgogICAgICAgICAgICgyKSBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGNhbGxzIFRjbF9Qa2dQcm92aWRlIHRvIHJlZ2lzdGVyCiAgICAgICAgICAgICAgIGEgcGFja2FnZSBuYW1lLiAgVGhlIHBhY2thZ2UgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZQogICAgICAgICAgICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgJW1vZHVsZSBkaXJlY3RpdmUuICBUaGUgdmVyc2lvbiBudW1iZXIgaXMKICAgICAgICAgICAgICAgc2V0IHRvICIwLjAiIGJ5IGRlZmF1bHQuICBUbyBjaGFuZ2UgdGhlIHZlcnNpb24gbnVtYmVyLCB1c2UKICAgICAgICAgICAgICAgc3dpZyAtcGtndmVyc2lvbiAxLjIgaW50ZXJmYWNlLmkuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIE1vZHVsZXMgdGhhdCBwcm92aWRlZCBzdHVicyBhbmQgVGNsX1BrZ1Byb3ZpZGUgb24gdGhlaXIgb3duIG1pZ2h0CiAgICAgICAgICAgYnJlYWsuICBTaW1wbHkgcmVtb3ZlIHRoYXQgY29kZS4KCjExLzA1LzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZWQgY29kZSBnZW5lcmF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgVGNsIG1vZHVsZS4gIENvbnN0YW50cwogICAgICAgICAgIGFyZSBub3cgc3RvcmVkIGluIGEgbGFyZ2UgdGFibGUgdGhhdCBnZXQgaW5zdGFsbGVkIGF0IG1vZHVsZSBzdGFydHVwLgogICAgICAgICAgIFRoZXJlIGFyZSBhbHNvIG5vIGxvbmdlciBhbnkgc3RhdGljIHZhcmlhYmxlcyBzbyBpdCBzaG91bGQgZ2VuZXJhdGUKICAgICAgICAgICBzb21ld2hhdCBsZXNzIGNvZGUuCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgImNvbnN0IiB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gImNvbnN0YW50IiBpbiBtYW55IGxhbmd1YWdlCiAgICAgICAgICAgbW9kdWxlcy4gICJjb25zdCIgaXMgYSBDIGtleXdvcmQgd2hpY2ggbWFkZSB0aGUgaGFuZGxpbmcgb2YgdGhlIHR5cGVtYXAKICAgICAgICAgICBkaXJlY3RpdmUgc29tZXdoYXQgYXdrd2FyZCBpbiB0aGUgcGFyc2VyLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgJXR5cGVtYXAgZGlyZWN0aXZlIGNhbiBub3cgYWNjZXB0IG5lYXJseSBhcmJpdHJhcnkga2V5d29yZCBwYXJhbWV0ZXJzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbixwYXJzZT0iaSIsZG9jPSJpbnRlZ2VyIikgaW50ICIuLi4iOwoKICAgICAgICAgICBUaGUgcHVycG9zZSBvZiB0aGUga2V5d29yZCBwYXJhbWV0ZXJzIGlzIHRvIHN1cHBseSBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICBoaW50cyB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlIG1vZHVsZS4gICBUaGUgaW50ZXByZXRhdGlvbiBvZiB0aGUKICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGxhbmd1YWdlIHNwZWNpZmljLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIFNsaWdodCBzZW1hbnRpYyBjaGFuZ2UgdG8gaW50ZXJuYWwgY2FsbC9yZXR1cm4gYnkgdmFsdWUgaGFuZGxpbmcuCiAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgY2FsbC1ieS12YWx1ZSB3YXMgdHJhbnNsYXRlZAogICAgICAgICAgIGludG8gcG9pbnRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGRvdWJsZSBkb3RfcHJvZHVjdChWZWN0b3IgYSwgVmVjdG9yIGIpOwoKICAgICAgICAgICB0dXJuZWQgaW50byB0aGlzOgoKICAgICAgICAgICAgICAgZG91YmxlIHdyYXBfZG90X3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdF9wcm9kdWN0KCphLCpiKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHRyYW5zbGF0aW9uIHdhcyBub3JtYWxseSBwZXJmb3JtZWQgYnkgdGhlIFNXSUcgY29yZSwgb3V0c2lkZQogICAgICAgICAgIG9mIHRoZSBjb250cm9sIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBIb3dldmVyLCBhIHNpZGUgZWZmZWN0CiAgICAgICAgICAgb2YgdGhpcyB3YXMgYSBsb3Qgb2YgYml6YXJyZSB0eXBlbWFwIGJlaGF2aW9yLiAgIEZvciBleGFtcGxlLAogICAgICAgICAgIGlmIHlvdSBkaWQgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50MzIgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBZb3Ugd291bGQgZmluZCB0aGF0IGludDMyIHdhcyB0cmFuc2Zvcm1lZCBpbnRvIGEgcG9pbnRlciBldmVyeXdoZXJlIQogICAgICAgICAgIChuZWVkbGVzcyB0byBzYXksIHN1Y2ggYmVoYXZpb3IgaXMgdW5leHBlY3RlZCBhbmQgcXVpdGUgYXdrd2FyZCB0bwogICAgICAgICAgIGRlYWwgd2l0aCkuICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIGlmIGEgdHlwZWRlZiB3YXMgYWxzbyB1c2VkLAogICAgICAgICAgIHRoZSBwb2ludGVyIGJlaGF2aW9yIHN1ZGRlbmx5IGRpc2FwcGVhcmVkLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgdGhlIHBvaW50ZXIgdHJhbnNmb3JtYXRpb24gaXMgbm93IHB1c2hlZCB0byB0aGUKICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLiAgIFRoaXMgcHJvZHVjZXMgd3JhcHBlcnMgdGhhdCBsb29rIHJvdWdobHkKICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBkb3VibGUgd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMSA9ICphOwogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMiA9ICpiOwogICAgICAgICAgICAgICAgICByZXR1cm4gZG90X3Byb2R1Y3QoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIG1ha2VzIGl0IGVhc3kgdG8gZGVmaW5lIHR5cGVtYXBzIGZvcgogICAgICAgICAgIGFyYml0cmFyeSB1bmRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBkbyB0aGlzIChhbmQgaXQKICAgICAgICAgICB3aWxsIHdvcmsgcmVnYXJkbGVzcyB3aGF0IGludDMyIGlzKToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICQxID0gKGludDMyKSBQeUludF9Bc0xvbmcoJGlucHV0KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElNQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgY2FsbC9yZXR1cm4gYnkgdmFsdWUgY29kZSBnZW5lcmF0aW9uIGluCiAgICAgICAgICAgc29tZSBsYW5ndWFnZSBtb2R1bGVzLgoKMTEvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlZCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCB0eXBlbWFwcyB0byB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAgeyAKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBvYmplY3QgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAqIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAmIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHJlZmVyZW5jZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIFtdIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIGVudW0gU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAuLi4gYW4gZW51bSB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIChDTEFTUzo6KikgewogICAgICAgICAgICAgICAgICAgLi4uIHBvaW50ZXIgdG8gbWVtYmVyIC4uLgogICAgICAgICAgICAgICB9CgoKICAgICAgICAgICBUaGVzZSB0eXBlcyBhcmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIHR5cGVzIHRoYXQgZG9uJ3QgbWF0Y2gKICAgICAgICAgICBhbnl0aGluZyBlbHNlLiAgU2VlIENIQU5HRVMgbG9nIGVudHJ5IGZvciA4LzI3LzIwMDAgZm9yIHRoZQogICAgICAgICAgIG9sZCBiZWhhdmlvci4gIFRoZSByb2xlIG9mIHRoZXNlIHR5cGVzIGlzIGFsc28gZGVzY3JpYmVkIGluIAogICAgICAgICAgIERvYy9NYW51YWwvVHlwZW1hcHMuaHRtbAoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIAoxMC8yNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCBHdWlsZSBhbmQgTXpzY2hlbWUgbW9kdWxlcyB0byBzdXBwb3J0CiAgICAgICAgICAgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgoxMC8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRml4IHRvIGhhbmRsZSBwb2ludGVycyB0byBhcnJheXMuCgoxMC8yNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBEZWZpbmluZyBhIHR5cGVtYXAgcnVsZSBmb3IgZW51bSBTV0lHRU5VTSBjYW4gbm93IGJlIHVzZWQKICAgICAgICAgICB0byBkZWZpbmUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZW51bSB2YXJpYWJsZXMuCgoxMC8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBSdWJ5IG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzLgoKMTAvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFJ1YnkgbW9kdWxlIGNhbiBub3cgaGFuZGxlIGZ1bmN0aW9ucyB3aXRoIGFuIGFyYml0cmFyeQogICAgICAgICAgIG51bWJlciBvZiBhcmd1bWVudHMuICBQcmV2aW91cyB2ZXJzaW9ucyB3ZXJlIGxpbWl0ZWQgdG8gCiAgICAgICAgICAgdG8gZnVuY3Rpb25zIHdpdGggb25seSA5IG9yIDE2IGFyZ3VtZW50cyBkZXBlbmRpbmcgb24KICAgICAgICAgICB0aGUgdXNlIG9mIGRlZmF1bHQgYXJndW1lbnRzLiAgIE5vdGU6IGZyb20gc29tZSBpbnNwZWN0aW9uCiAgICAgICAgICAgb2YgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIgc291cmNlLCB0aGUgbmV3IGFwcHJvYWNoIG1pZ2h0IGJlCiAgICAgICAgICAgYSBsaXR0bGUgZmFzdGVyIGFzIHdlbGwuCgoxMC8xOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgIHRlbXBsYXRlcy4KCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDxTLFQ+OwoKICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgSXJpbmEgS290bG92YS4KCjEwLzE2LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIHR5cGVtYXBzIGFkZGVkLiAgVGhlIHR5cGVtYXBzCiAgICAgICAgICAgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgc3ludGF4IGJlbG93LiAgIFdpdGhpbiBlYWNoCiAgICAgICAgICAgdHlwZW1hcCwgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIGhhbmRsZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgICAgICAgICAgICAgICRhcmc7ICAvLyBUaGUgaW5wdXQgb2JqZWN0IGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgICAgJDE7ICAgIC8vIEMgbG9jYWwgdmFyaWFibGUgZm9yIGZpcnN0IGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgICQyOyAgICAvLyBDIGxvY2FsIHZhcmlhYmxlIGZvciBzZWNvbmQgYXJndW1lbnQKCiAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHZhcmlhYmxlcyByZWZlciB0byBlaXRoZXIgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgJDFfdHlwZSwgJDFfbHR5cGUsICQxX2Jhc2V0eXBlLCBldGMuLi4gIChhcmdjKQogICAgICAgICAgICAgICAgICAkMl90eXBlLCAkMl9sdHlwZSwgJDJfYmFzZXR5cGUsIGV0Yy4uLiAgKGFyZ3ZbXSkKCiAgICAgICAgICAgICAgICAgIC8vIEFycmF5IGRpbWVuc2lvbiBvZiBhcmd2CiAgICAgICAgICAgICAgICAgICQyX2RpbTAKICAgICAgICAgICAgICB9CgogICAgICAgICAgIEJhc2ljYWxseSBhbnkgdmFyaWFibGUgdGhhdCB3YXMgYXZhaWxhYmxlIGluIG5vcm1hbCB0eXBlbWFwcwogICAgICAgICAgIGlzIGF2YWlsYWJsZSBmb3IgZWl0aGVyIGFyZ3VtZW50IGJ5IHByZWZhY2luZyB0aGUgdmFyaWFibGUKICAgICAgICAgICBuYW1lIGJ5ICckbl8nIHdoZXJlIG4gaXMgdGhlIGFyZ3VtZW50IHBvc2l0aW9uLgoKICAgICAgICAgICBOb3RlczogIAogICAgICAgICAgICgxKSBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIHNpbmdsZQogICAgICAgICAgICAgICBvYmplY3QgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuICAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgICAgIHlvdSBjYW4gc3BsaXQgYSBzdHJpbmcgaW50byBhIChjaGFyICosIGludCkgcGFpciBvcgogICAgICAgICAgICAgICBzcGxpdCBhIGxpc3QgaW50byBhIChpbnQsIGNoYXIgW10pIHBhaXIuICBJdCBpcyBub3QKICAgICAgICAgICAgICAgcG9zc2libGUgdG8gbWFwIG11bHRpcGxlIG9iamVjdHMgdG8gbXVsdGlwbGUgYXJndW1lbnRzLgoKICAgICAgICAgICAoMikgVG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIFNXSUcgdmVyc2lvbnMsIHRoZQogICAgICAgICAgICAgICB2YXJpYWJsZXMgc3VjaCBhcyAkdGFyZ2V0IGFuZCAkdHlwZSBhcmUgcHJlc2VydmVkIGFuZAogICAgICAgICAgICAgICBhcmUgbWFwcGVkIG9udG8gdGhlIGZpcnN0IGFyZ3VtZW50IG9ubHkuCgogICAgICAgICAgICgzKSBUaGlzIHNob3VsZCBub3QgYWZmZWN0IGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlLgogICAgICAgICAgICAgICBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgYXJlIGFuIGV4dGVuc2lvbiB0byB0eXBlbWFwIGhhbmRsaW5nLgogICAgICAgICAgICAgICBTaW5nbGUgdmFsdWVkIHR5cGVtYXBzIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIHVzdWFsCiAgICAgICAgICAgICAgIHdheS4KCiAgICAgICAgICAgVGhlIG9sZCAkc291cmNlIGFuZCAkdGFyZ2V0IHZhcmlhYmxlcyBhcmUgb2ZmaWNpYWxseQogICAgICAgICAgIGRlcHJlY2F0ZWQuICBJbnB1dCB2YXJpYWJsZXMgYXJlIHJlZmVyZW5jZWQgdGhyb3VnaAogICAgICAgICAgICRhcmckIGFuZCBvdXRwdXQgdmFsdWVzIGFyZSByZWZlcmVuY2UgdGhyb3VnaCAkcmVzdWx0JC4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvMTYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBtdWx0aXZhbHVlZCB0eXBlbWFwcy4gIFRoZSBzeW50YXgKICAgICAgICAgICBpcyBhIGxpdHRsZSBmdW5reSwgYnV0IGhlcmUgZ29lczoKCiAgICAgICAgICAgICAgLy8gRGVmaW5lIGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBNdWx0aXZhbHVlZCB0eXBlbWFwIHdpdGggbG9jYWxzCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKShpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIC8vIENvcHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSA9IChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKCiAgICAgICAgICAgICAgLy8gQXBwbHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJWFwcGx5IChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7IChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSB9OwoKICAgICAgICAgICBOb3RlOiB0aGlzIGV4dHJhIHBhcnNpbmcgc3VwcG9ydCBpcyBhZGRlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbi4KICAgICAgICAgICBObyBsYW5ndWFnZSBtb2R1bGVzIGN1cnJlbnRseSBzdXBwb3J0IG11bHRpLXZhbHVlZCB0eXBlbWFwcy4KCjEwLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIG1hdGNoaW5nIGNvZGUgdG8gZGlzY2FyZCBxdWFsaWZpZXJzIHdoZW4KICAgICAgICAgICBjaGVja2luZyBmb3IgYSBtYXRjaC4gICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBkZWNsYXJhdGlvbgogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IGNoYXIgKngpOwoKICAgICAgICAgICBUaGUgdHlwZW1hcCBjaGVja2VyIGNoZWNrcyBmb3IgYSBtYXRjaCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgoKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp4CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICAgY2hhciAqeAogICAgICAgICAgICAgICAgIGNoYXIgKgoKICAgICAgICAgICBJZiB0eXBlZGVmJ3MgYXJlIGludm9sdmVkLCBxdWFsaWZpZXIgc3RyaXBwaW5nIG9jY3VycyBiZWZvcmUKICAgICAgICAgICB0eXBlZGVmIHJlc29sdXRpb24uICBTbyBpZiB5b3UgaGFkIHRoaXMsCgogICAgICAgICAgICAgICAgdHlwZWRlZiBjaGFyICpzdHJpbmc7CiAgICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3Qgc3RyaW5nIHgpOwoKICAgICAgICAgICB0eXBlbWFwIGNoZWNraW5nIHdvdWxkIGJlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHgKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZwogICAgICAgICAgICAgICAgc3RyaW5nIHgKICAgICAgICAgICAgICAgIHN0cmluZwogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqeAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICBjaGFyICp4CiAgICAgICAgICAgICAgICBjaGFyICoKCiAgICAgICAgICAgVGhlIHByaW1hcnkgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24KICAgICAgICAgICBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV2l0aG91dCBxdWFsaWZpZXIgc3RyaXBwaW5nLCBvbmUgaGFzIHRvIHdyaXRlCiAgICAgICAgICAgc2VwZXJhdGUgdHlwZW1hcHMgZm9yIGFsbCB2YXJpYXRpb25zIG9mIGNvbnN0IGFuZCB2b2xhdGlsZSAod2hpY2gKICAgICAgICAgICBpcyBhIHBhaW4pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFR5cGVtYXBzIG1pZ2h0IGJlIGFwcGxpZWQgaW4KICAgICAgICAgICBwbGFjZXMgd2hlcmUgdGhleSB3ZXJlbid0IGJlZm9yZS4KCgoxMC85LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBkaXNhbWJpZ3VhdGUKICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBvbmx5IHZhcnkgaW4gY29uc3RuZXNzLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUbyBoYW5kbGUgdGhpcywgdGhlICVyZW5hbWUgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIG5vcm1hbGx5LgogICAgICAgICAgIAogICAgICAgICAgICAgICAlcmVuYW1lKGJsYWhfY29uc3QpIGJsYWgoKSBjb25zdDsKCiAgICAgICAgICAgSW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUsIG1ldGhvZCBjYWxscyBsaWtlIHRoaXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgIChvYmopLT5ibGFoKCkgICAgICAgICAgICAgICAvLyBOb24tY29uc3QgdmVyc2lvbgogICAgICAgICAgICAgICAoKEZvbyBjb25zdCAqKW9iaiktPmJsYWgoKSAgLy8gY29uc3QgdmVyc2lvbgoKICAgICAgICAgICBUaGlzIHNob3VsZCBmb3JjZSB0aGUgcmlnaHQgbWV0aG9kIHRvIGJlIGludm9rZWQuCiAgICAgICAgICAgQWRtaXR0ZWRseSwgdGhpcyBpcyBwcm9iYWJseSBvYnNjdXJlLCBidXQgd2UgbWlnaHQKICAgICAgICAgICBhcyB3ZWxsIGdldCBpdCByaWdodC4KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSBwcmVwcm9jZXNzb3Igbm93IGlnbm9yZXMgJ1xyJyBpbiB0aGUgaW5wdXQuCiAgICAgICAgICAgVGhpcyBzaG91bGQgZml4IHRoZSBmb2xsb3dpbmcgYnVnOgogICAgICAgICAgIFsgIzQ2ODQxNiBdIFNXSUcgdGhpbmtzIG1hY3JvIGRlZnMgYXJlIGRlY2xhcmF0aW9ucz8KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHx8LCAmJiwgYW5kICEgaW4gY29uc3RhbnRzLiAgVGhpcwogICAgICAgICAgIGZpeGVzIFNGIFsgIzQ2ODk4OCBdIExvZ2ljYWwgb3BzIGJyZWFrIHByZXByb2Nlc3Nvci4KICAgICAgICAgICBIb3dldmVyLCBhdCB0aGlzIHRpbWUsIGNvbnN0YW50cyB1c2luZyB0aGVzZSBvcGVyYXRvcnMKICAgICAgICAgICBhcmUgbm90IHN1cHBvcnRlZCAodGhlIHBhcnNlciB3aWxsIGlzc3VlIGEgd2FybmluZykuCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAtc2hvd190ZW1wbGF0ZXMgY29tbWFuZCBsaW5lIG9wdGlvbi4gIFRoaXMgbWFrZXMKICAgICAgICAgICBTV0lHIGRpc3BsYXkgdGhlIGNvZGUgaXQgYWN0dWFsbHkgcGFyc2VzIHRvIGdlbmVyYXRlCiAgICAgICAgICAgdGVtcGxhdGUgd3JhcHBlcnMuICBNb3N0bHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHNlbWFudGljcyBvZiAldGVtcGxhdGUgZGlyZWN0aXZlLiAgV2hlbgogICAgICAgICAgIHVzaW5nICV0ZW1wbGF0ZSwgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgaGFuZGxlZAogICAgICAgICAgIGFzIHR5cGVzIGJ5IGRlZmF1bHQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNkb3VibGUpIHZlY3Rvcjxkb3VibGU+OwoKICAgICAgICAgICBUbyBzcGVjaWZ5IGEgdGVtcGxhdGUgYXJndW1lbnQgdGhhdCBpcyAqbm90KiBhIHR5cGUsIHlvdQogICAgICAgICAgIG5lZWQgdG8gdXNlIGRlZmF1bHQtdmFsdWUgc3ludGF4LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50LGludD01MD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjZG91YmxlKSB2ZWN0b3I8aW50LHNpemU9MTAwPjsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdHlwZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IG1hdHRlci0tb25seQogICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIChlLmcuLCA1MCwgMTAwKSBpcyB1c2VkIGR1cmluZwogICAgICAgICAgIGV4cGFuc2lvbi4gIFRoaXMgZGlmZmVycyBmcm9tIG5vcm1hbCBDKyssIGJ1dCBJIGNvdWxkbid0CiAgICAgICAgICAgZmlndXJlIG91dCBhIGJldHRlciB3YXkgdG8gZG8gaXQgaW4gdGhlIHBhcnNlci4gIE1pZ2h0CiAgICAgICAgICAgaW1wbGVtZW50IGFuIGFsdGVybmF0aXZlIGxhdGVyLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1ham9yIGNoYW5nZXMgdG8gdGVtcGxhdGUgaGFuZGxpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZQogICAgICAgICAgIGJldHRlciBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBDKysgdHlwZS1zeXN0ZW0uIFRoZSBtYWluCiAgICAgICAgICAgcHJvYmxlbSBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICBTdXBwb3NlIHlvdSBoYXZlIGEgdGVtcGxhdGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGJsYWgoY29uc3QgVCB4KSB7IHN0dWZmIH07CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBOb3cgc3VwcG9zZSwgdGhhdCB5b3UgaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIG9uIGEKICAgICAgICAgICB0eXBlIGxpa2UgdGhpcyBpbiBTV0lHOgoKICAgICAgICAgICAgICAldGVtcGxhdGUoYmxhaGludCkgYmxhaDxpbnQgKj47CgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyAqc3VwcG9zZWQqIHRvIGdlbmVyYXRlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50ICpjb25zdCB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIEhvd2V2ZXIsIGluIFNXSUctMS4zLjksIHRoZSB0ZW1wbGF0ZSBzdWJzdGl0dXRpb24gZ2V0cyBpdCB3cm9uZwogICAgICAgICAgIGFuZCBwcm9kdWNlcwoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgaW50ICp4KSB7IHN0dWZmIH07CgogICAgICAgICAgIChub3RpY2UgdGhlIGJhZCBwbGFjZW1lbnQgb2YgdGhlICdjb25zdCcgcXVhbGlmaWVyKS4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsIHRoZSBTV0lHIHBhcnNlciBub3cgZ2VuZXJhdGVzIGltcGxpY2l0IHR5cGVkZWZzCiAgICAgICAgICAgZm9yIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzIHRoYXQgcHJvZHVjZXMgY29kZSByb3VnaGx5CiAgICAgICAgICAgZXF1aXZhbGVudCB0byBkb2luZyB0aGlzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCAqX19zd2lndG1wbDE7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGJsYWhpbnQpIGJsYWg8X19zd2lndG1wbDE+OwoKICAgICAgICAgICB3aGljaCBnZW5lcmF0ZXMgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBfX3N3aWd0bXBsMSB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIFNpbmNlIHRoaXMgaXMgY29ycmVjdCBpbiBib3RoIEMrKyBhbmQgU1dJRywgaXQgcHJvdmlkZXMgdGhlIHJpZ2h0CiAgICAgICAgICAgc2VtYW50aWNzIGFuZCBhbGxvd3MgZXZlcnl0aGluZyB0byBjb21waWxlIHByb3Blcmx5LiAgSG93ZXZlciwKICAgICAgICAgICB0byBjbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGNvZGUgYSBsaXR0bGUgYml0LCB0aGUgcGFyc2VyIGtlZXBzCiAgICAgICAgICAgdHJhY2sgb2YgdGhlIHRlbXBsYXRlIHR5cGVzIGFuZCBwZXJmb3JtcyBiYWNrLXN1YnN0aXR1dGlvbiB0bwogICAgICAgICAgIHRoZSBvcmlnaW5hbCB0eXBlIHdoZW4gYnVpbGRpbmcgdGhlIHBhcnNlIHRyZWUuICBUaHVzLCBldmVuCiAgICAgICAgICAgdGhvdWdoIHRoZSBpbXBsaWNpdCB0eXBlZGVmIGlzIHVzZWQgaW4gdGhlIGlucHV0IGFuZCBtYXkgYXBwZWFyCiAgICAgICAgICAgaW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGZpbGUgKGZvciBwcm9wZXIgY29tcGlsYXRpb24pLCB0aGUgcGFyc2UKICAgICAgICAgICB0cmVlIHdpbGwgaGlkZSBhIGxvdCBvZiB0aGVzZSBkZXRhaWxzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgX19zd2lndG1wbDEgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICB3aWxsIGxvb2sgbGlrZSBpdCB3YXMgZGVjbGFyZWQgYXMgZm9sbG93cyAod2hpY2ggaXMgd2hhdAogICAgICAgICAgIHlvdSB3YW50KToKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGludCAqY29uc3QgeCkgeyBzdHVmZiB9CgogICAgICAgICAgIFRoZSBvbmx5IHBsYWNlIHlvdSBhcmUgbGlrZWx5IHRvIG5vdGljZSB0aGUgdHlwZWRlZiBoYWNrCiAgICAgICAgICAgaXMgaW4gYm9kaWVzIG9mIHRlbXBsYXRlIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICBkaWQgdGhpcywKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmxhaCB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHsKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgdGVtcHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgIHlvdSB3aWxsIGZpbmQgdGhhdCAnVCB0ZW1wdmFsdWUnIGdvdCBleHBhbmRlZCBpbnRvIHNvbWUKICAgICAgICAgICBzdHJhbmdlIHR5cGVkZWYgdHlwZS4gIFRoaXMgKnN0aWxsKiBjb21waWxlcyBjb3JyZWN0bHkgCiAgICAgICAgICAgc28gaXQncyBub3QgYSBiaWcgZGVhbCAob3RoZXIgdGhhbiBsb29raW5nIGtpbmQgb2YgdWdseQogICAgICAgICAgIGluIHRoZSB3cmFwcGVyIGZpbGUpLgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgc29tZSBpbmhlcml0YW5jZSBwcm9ibGVtcyBpbiBUY2wgT2JqZWN0IGludGVyZmFjZS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFRjbCBtb2R1bGUgaGFzIGNoYW5nZWQgdG8gdXNlIGJ5dGUtYmFja2VkIHBvaW50ZXIgc3RyaW5ncy4gIFRoaXMKICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgc2FmZSBvbiA2NC1iaXQgcGxhdGZvcm1zLiAgSG93ZXZlciwKICAgICAgICAgICB0aGUgb3JkZXIgaW4gd2hpY2ggZGlnaXRzIGFwcGVhciBpbiBwb2ludGVyIHZhbHVlcyBubyBsb25nZXIKICAgICAgICAgICBkaXJlY3RseSBjb3JyZXNwb25kcyB0byB0aGUgYWN0dWFsIG51bWVyaWNhbCB2YWx1ZSBvZiBhCiAgICAgICAgICAgcG9pbnRlciAob24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgcGFpcnMgb2YgZGlnaXRzIGFwcGVhcgogICAgICAgICAgIGluIHJldmVyc2Ugb3JkZXIpLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUGVybDUgbW9kdWxlIGlzIG5vdyBkcml2ZW4gYnkgYSBjb25maWd1cmF0aW9uIGZpbGUgJ3Blcmw1LnN3ZycKICAgICAgICAgICBpbiB0aGUgU1dJRyBsaWJyYXJ5LgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlIHBlcmw1IG1vZHVsZSBubyBsb25nZXIgdHJpZXMgdG8gYXBwbHkgdGhlICJvdXQiIHR5cGVtYXAKICAgICAgICAgICBpbiBjb2RlIGdlbmVyYXRlZCBmb3IgbWFnaWMgdmFyaWFibGVzLiAgSSdtIHN1cnByaXNlZCB0aGF0CiAgICAgICAgICAgdGhpcyBldmVyIHdvcmtlZCBhdCBhbGwgKHNpbmNlIGFsbCBvZiB0aGUgY29kZSB0aGF0IHdhcyB0aGVyZQogICAgICAgICAgIHdhcyB3cm9uZyBhbnl3YXlzKS4gICBVc2UgdGhlICJ2YXJvdXQiIHR5cGVtYXAgdG8gaGFuZGxlCiAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcy4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgYnVnIHJlbGF0ZWQgdG8gY2hhcmFjdGVyIGFycmF5IG1lbWJlcnMgb2Ygc3RydWN0dXJlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGNoYXIgbmFtZVszMl07CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBTV0lHIGlzIG5vcm1hbGx5IHN1cHBvc2VkIHRvIHJldHVybiBhIHN0cmluZywgYnV0IHRoaXMgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy45LiAgIFRoZSByZWFzb24gaXQgd2FzIGJyb2tlbiB3YXMgYWN0dWFsbHkKICAgICAgICAgICBkdWUgdG8gYSBzdWJ0bGUgbmV3IGZlYXR1cmUgb2YgdHlwZW1hcHMuICBXaGVuIGEgZGF0YSBtZW1iZXIKICAgICAgICAgICBpcyBzZXQgdG8gYW4gYXJyYXkgbGlrZSB0aGlzLCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIHJlbGF0ZWQKICAgICAgICAgICBhY2Nlc3NvciBmdW5jdGlvbiBpcyBhY3R1YWxseSBzZXQgdG8gYW4gYXJyYXkuICBUaGlzIG1lYW5zCiAgICAgICAgICAgdGhhdCB5b3UgY2FuIG5vdyB3cml0ZSB0eXBlbWFwcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKHB5dGhvbixvdXQpIGNoYXIgW0FOWV0gewogICAgICAgICAgICAgICAgICR0YXJnZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgkc291cmNlLCRkaW0wKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHRoZSBkZWZ1bmN0CiAgICAgICAgICAgbWVtYmVyb3V0IHR5cGVtYXAgaW4gYSBtb3JlIGVsZWdhbnQgbWFubmVyLgoKOS8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU29tZSBmdXJ0aGVyIHJlZmluZW1lbnQgb2YgcXVhbGlmaWVkIEMrKyBtZW1iZXIgZnVuY3Rpb25zLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAoaSkgVGhlIFNXSUcgcGFyc2VyIHdhcyBleHRlbmRlZCBzbGlnaHRseSB0byBhbGxvdyAndm9sYXRpbGUnCiAgICAgICAgICAgYW5kIGNvbWJpbmF0aW9ucyBvZiAnY29uc3QnIGFuZCAndm9sYXRpbGUnIHRvIGJlIHVzZWQuICBUaGlzCiAgICAgICAgICAgaXMgcHJvYmFibHkgcmFyZSwgYnV0IHRlY2huaWNhbGx5IGxlZ2FsLiAgT25seSBhZGRlZCBmb3IKICAgICAgICAgICBjb21wbGV0ZW5lc3MuCgogICAgICAgICAgIChpaSkgRm9yIHRoZSBwdXJwb3NlcyBvZiBvdmVybG9hZGluZywgcXVhbGlmaWVkIGFuZCBub24tcXVhbGlmaWVkCiAgICAgICAgICAgZnVuY3Rpb25zIGFyZSBkaWZmZXJlbnQuICBUaHVzLCB3aGVuIGEgY2xhc3MgaGFzIG1ldGhvZHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CgogICAgICAgICAgIFR3byBkaXN0aW5jdCBtZXRob2RzIGFyZSBkZWNsYXJlZC4gIFRvIGRlYWwgd2l0aCB0aGlzLCAlcmVuYW1lCiAgICAgICAgICAgYW5kIHNpbWlsYXIgZGlyZWN0aXZlcyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gcmVjb2duaXplIGNvbnN0LgogICAgICAgICAgIFRodXMsIG9uZSBjYW4gZGlzYW1iaWd1YXRlIHRoZSB0d28gZnVuY3Rpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb2NvbnN0KSBGb286OmZvbygpIGNvbnN0OwoKICAgICAgICAgICBvciBzaW1wbHkgaWdub3JlIHRoZSBjb25zdCB2YXJpYW50IGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6Zm9vKCkgY29uc3Q7CgogICAgICAgICAgIE5vdGU6IFNXSUcgY3VycmVudGx5IGhhcyBubyB3YXkgdG8gYWN0dWFsbHkgaW52b2tlIHRoZSBjb25zdAogICAgICAgICAgIG1lbWJlciBzaW5jZSB0aGUgJ2NvbnN0JyBpcyBkaXNjYXJkZWQgd2hlbiBnZW5lcmF0aW5nIHdyYXBwZXJzCiAgICAgICAgICAgZm9yIG9iamVjdHMuICAKCjkvMjcvMjAwMTogYmVhemxleQogICAgICAgICAgIE5ldyBkaXJlY3RpdmUuICVuYW1ld2FybiBjYW4gYmUgdXNlZCB0byBpc3N1ZSB3YXJuaW5nCiAgICAgICAgICAgbWVzc2FnZXMgZm9yIGNlcnRhaW4gZGVjbGFyYXRpb24gbmFtZXMuICAgVGhlIG5hbWUKICAgICAgICAgICBtYXRjaGluZyBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlICVyZW5hbWUgZGlyZWN0aXZlLgogICAgICAgICAgIFRoZSBpbnRlbnQgb2YgdGhpcyBkaXJlY3RpdmUgaXMgdG8gaXNzdWUgd2FybmluZ3MgZm9yCiAgICAgICAgICAgcG9zc2libGUgbmFtZXNwYWNlIGNvbmZsaWN0cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbmFtZXdhcm4oInByaW50IGlzIGEgcHl0aG9uIGtleXdvcmQiKSBwcmludDsKCiAgICAgICAgICAgVGhlIG5hbWUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHBlcmZvcm1lZCBhZnRlciBhIG5hbWUKICAgICAgICAgICBoYXMgYmVlbiByZXNvbHZlZCB1c2luZyAlcmVuYW1lLiAgVGhlcmVmb3JlLCBhCiAgICAgICAgICAgZGVjbGFyYXRpb24gbGlrZSB0aGlzIHdpbGwgbm90IGdlbmVyYXRlIGEgd2FybmluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiUHJpbnQiKSBwcmludDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB2b2lkIHByaW50KCk7ICAgIC8qIE5vIHdhcm5pbmcgZ2VuZXJhdGVkICovCgogICAgICAgICAgIFNpbmNlIHRoZSB3YXJuaW5nIG1lY2hhbmlzbSBmb2xsb3dzICVyZW5hbWUgc2VtYW50aWNzLCBpdCBpcwogICAgICAgICAgIGFsc28gdG8gaXNzdWUgd2FybmluZ3MgZm9yIHNwZWNpZmljIGNsYXNzZXMgb3IganVzdCBmb3IKICAgICAgICAgICBjZXJ0YWluIG1lbWJlciBmdW5jdGlvbiBuYW1lcy4KCiAgICAgICAgICAgKERhdmUgLSBJJ3ZlIGJlZW4gdGhpbmtpbmcgYWJvdXQgYWRkaW5nIHNvbWV0aGluZyBsaWtlIHRoaXMKICAgICAgICAgICBmb3IgcXVpdGUgc29tZSB0aW1lLiAgSnVzdCBuZXZlciBnb3QgYXJvdW5kIHRvIGl0KQogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCgo5LzI3LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBFbmhhbmNlZCB0aGUgJWlnbm9yZSBkaXJlY3RpdmUgc28gdGhhdCB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICAgY2FuIGJlIGlzc3VlZCB0byB1c2Vycy4gICBUaGlzIGlzIGRvbmUgdXNpbmcgJWlnbm9yZXdhcm4KICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWlnbm9yZXdhcm4oIm9wZXJhdG9yIG5ldyBpZ25vcmVkIikgb3BlcmF0b3IgbmV3OwoKICAgICAgICAgICBUaGUgbmFtZXMgYW5kIHNlbWFudGljcyBvZiAlaWdub3Jld2FybiBpcyBleGFjdGx5IHRoZSAKICAgICAgICAgICBzYW1lIGFzICVpZ25vcmUuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBkaXJlY3RpdmUKICAgICAgICAgICBpcyBmb3IgbW9kdWxlIHdyaXRlcnMgd2hvIHdhbnQgdG8gaWdub3JlIGNlcnRhaW4gdHlwZXMKICAgICAgICAgICBvZiBkZWNsYXJhdGlvbnMsIGJ1dCB3aG8gYWxzbyB3YW50IHRvIGFsZXJ0IHVzZXJzIGFib3V0IGl0LgogICAgICAgICAgIEEgdXNlciBtaWdodCBhbHNvIHVzZSB0aGlzIGZvciBkZWJ1Z2dpbmcgKHNpbmNlIG1lc3NhZ2VzCiAgICAgICAgICAgd2lsbCBhcHBlYXIgd2hlbmV2ZXIgYW4gaWdub3JlZCBkZWNsYXJhdGlvbiBhcHBlYXJzKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzI2LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTdXBlci1leHBlcmltZW50YWwgc3VwcG9ydCBmb3Igb3ZlcmxvYWRlZCBvcGVyYXRvcnMuIAogICAgICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gY29uc2lzdHMgb2YgYSBmZXcgZGlmZmVyZW50IHBhcnRzLgoKICAgICAgICAgICAoaSkgT3BlcmF0b3IgbmFtZXMgc3VjaCBhcyAnb3BlcmF0b3IrJyBhcmUgbm93IGFsbG93ZWQKICAgICAgICAgICBhcyB2YWxpZCBkZWNsYXJhdG9yIG5hbWVzLiAgVGh1cyB0aGUgJ29wZXJhdG9yJyBzeW50YXgKICAgICAgICAgICBjYW4gYXBwZWFyICphbnlwbGFjZSogYSBub3JtYWwgZGVjbGFyYXRvciBuYW1lIHdhcyB1c2VkCiAgICAgICAgICAgYmVmb3JlLiAgT24gdGhlIHN1cmZhY2UsIHRoaXMgbWVhbnMgdGhhdCBvcGVyYXRvcnMgY2FuCiAgICAgICAgICAgYmUgcGFyc2VkIGp1c3QgbGlrZSBub3JtYWwgZnVuY3Rpb25zIGFuZCBtZXRob2RzLiAKICAgICAgICAgICBIb3dldmVyLCBpdCBhbHNvIG1lYW5zIHRoYXQgb3BlcmF0b3IgbmFtZXMgY2FuIGJlIHVzZWQKICAgICAgICAgICBpbiBtYW55IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBsaWtlICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVyZW5hbWUoX19hZGRfXykgQ29tcGxleDo6b3BlcmF0b3IrKGNvbnN0IENvbXBsZXggJik7CgogICAgICAgICAgIChpaSkgT3BlcmF0b3JzIGFyZSB3cmFwcGVkICpleGFjdGx5KiBsaWtlIG5vcm1hbCBmdW5jdGlvbnMKICAgICAgICAgICBhbmQgbWV0aG9kcy4gIEludGVybmFsbHksIHRoZSBvcGVyYXRvciBuYW1lIGlzIHVzZWQgCiAgICAgICAgICAgZGlyZWN0bHkgbWVhbmluZyB0aGF0IHRoZSB3cmFwcGVyIGNvZGUgbWlnaHQgY29udGFpbgogICAgICAgICAgIHN0YXRlbWVudHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGFyZzAtPm9wZXJhdG9yKigoQ29tcGxleCBjb25zdCAmKSphcmcxKTsKCiAgICAgICAgICAgVGhpcyBhbGwgc2VlbXMgdG8gcGFyc2UgYW5kIGNvbXBpbGUgY29ycmVjdGx5IChhdCBsZWFzdAogICAgICAgICAgIG9uIG15IG1hY2hpbmUpLgoKICAgICAgICAgICAoaWlpKSBTV0lHIHdpbGwgbm8gbG9uZ2VyIHdyYXAgYSBkZWNsYXJhdGlvbiBpZiBpdHMgc3ltYm9sCiAgICAgICAgICAgdGFibGUgbmFtZSBjb250YWlucyBpbGxlZ2FsIGlkZW50aWZpZXIgY2hhcmFjdGVycy4gIElmCiAgICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXJzIGFyZSBkZXRlY3RlZCwgeW91IHdpbGwgc2VlIGFuIGVycm9yCiAgICAgICAgICAgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICBXYXJuaW5nLiBDYW4ndCB3cmFwIG9wZXJhdG9yKiB1bmxlc3MgcmVuYW1lZCB0byBhIHZhbGlkIGlkZW50aWZpZXIuCgogICAgICAgICAgIFRoZSBvbmx5IHdheSB0byBmaXggdGhpcyBpcyB0byB1c2UgJXJlbmFtZSBvciAlbmFtZSB0byBiaW5kCiAgICAgICAgICAgdGhlIG9wZXJhdG9yIHRvIGEgbmljZSBuYW1lIGxpa2UgImFkZCIgb3Igc29tZXRoaW5nLiBOb3RlOgogICAgICAgICAgIHRoZSBsZWdhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMgYXJlIGRldGVybWluZWQgYnkgdGhlIHRhcmdldAogICAgICAgICAgIGxhbmd1YWdlLgoKICAgICAgICAgICBUaGVyZSBhcmUgY2VydGFpbiBpc3N1ZXMgd2l0aCBmcmllbmQgZnVuY3Rpb25zIGFuZCBvcGVyYXRvcnMuCiAgICAgICAgICAgU29tZXRpbWVzLCBmcmllbmRzIGFyZSB1c2VkIHRvIGRlZmluZSBtaXhlZCBvcGVyYXRvcnMgc3VjaAogICAgICAgICAgIGFzIGFkZGluZyBhIENvbXBsZXggYW5kIGEgZG91YmxlIHRvZ2V0aGVyLiAgQ3VycmVudGx5LCBTV0lHCiAgICAgICAgICAgaWdub3JlcyBhbGwgZnJpZW5kIGRlY2xhcmF0aW9ucyBpbiBhIGNsYXNzLiAgQSBnbG9iYWwgb3BlcmF0b3IKICAgICAgICAgICBkZWNsYXJhdGlvbiBjYW4gcHJvYmFibHkgYmUgbWFkZSB0byB3b3JrLCBidXQgeW91J2xsIGhhdmUgdG8KICAgICAgICAgICByZW5hbWUgaXQgYW5kIGl0IHByb2JhYmx5IHdvbid0IHdvcmsgdmVyeSBjbGVhbmx5IGluIHRoZQogICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSBzaW5jZSBpdCdzIG5vdCBhIGNsYXNzIG1lbWJlci4KCiAgICAgICAgICAgU1dJRyBkb2Vzbid0IGtub3cgaG93IHRvIGhhbmRsZSBvcGVyYXRvciBzcGVjaWZpY2F0aW9ucyAKICAgICAgICAgICBzb21ldGltZXMgdXNlZCBmb3IgYXV0b21hdGljIHR5cGUgY29udmVyc2lvbi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgIGNsYXNzIFN0cmluZyB7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgb3BlcmF0b3IgY29uc3QgY2hhciooKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9OwoKICAgICAgICAgICAodGhpcyBkb2Vzbid0IHBhcnNlIGNvcnJlY3RseSBhbmQgZ2VuZXJhdGVzIGEgc3ludGF4IGVycm9yKS4KCiAgICAgICAgICAgQWxzbzogb3BlcmF0b3JzIG5vIGxvbmdlciBzaG93IHVwIGFzIHNlcGFyYXRlIHBhcnNlLXRyZWUKICAgICAgICAgICBub2RlcyAoaW5zdGVhZCB0aGV5IGFyZSBub3JtYWwgJ2NkZWNsJyBub2RlcykuICBJIG1heQogICAgICAgICAgIHNlcGFyYXRlIHRoZW0gYXMgYSBzcGVjaWFsIGNhc2UgbGF0ZXIuCgogICAgICAgICAgIFNlZSBFeGFtcGxlcy9weXRob24vb3BlcmF0b3IgZm9yIGFuIGV4YW1wbGUuCgogICAgICAgICAgICoqKiBTVVBFUi1FWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgpWZXJzaW9uIDEuMy45IChTZXB0ZW1iZXIgMjUsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMjUvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHBhcnNpbmcgcHJvYmxlbSB3aXRoIHR5cGUgZGVjbGFyYXRpb25zIGxpa2UgCiAgICAgICAgICAgJ2NoYXIgKiogY29uc3QnLiAgU1dJRyBwYXJzZWQgdGhpcyBjb3JyZWN0bHksIGJ1dCB0aGUKICAgICAgICAgICBpbnRlcm5hbCB0eXBlIHdhcyByZXByZXNlbnRlZCBpbmNvcnJlY3RseSAodGhlIHBvaW50ZXJzCiAgICAgICAgICAgYW5kIHF1YWxpZmllcnMgd2VyZSBpbiB0aGUgd3Jvbmcgb3JkZXIpLgoKOS8yNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgV2l0aGRyZXcgZXhwZXJpbWVudGFsIGZlYXR1cmUgKG5vdGVkIGJlbG93KSB0aGF0IHdhcwogICAgICAgICAgIGNhdXNpbmcgc2VyaW91cyBwYXJzaW5nIHByb2JsZW1zLgoKVmVyc2lvbiAxLjMuOCAoU2VwdGVtYmVyIDIzLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCBpbXByb3ZlZCBkaXN0dXRpbHMgc2V0dXAucHkgZmlsZSBpbiB0aGUgVG9vbHMgCiAgICAgICAgICAgZGlyZWN0b3J5IChsb29rIGZvciB0aGUgc2V0dXAucHkudG1wbCBmaWxlKS4gIENvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICAgVG9ueSBTZXdhcmQuCgo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCB0d28gbmV3IFJQTSBzcGVjIGZpbGVzIGluIHRoZSBUb29scyBkaXJlY3RvcnkuIENvbnRyaWJ1dGVkCiAgICAgICAgICAgYnkgVG9ueSBTZXdhcmQgYW5kIFV3ZSBTdGVpbm1hbm4uCiAgCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjM2MzUgXSBQZXJsNS5zd2cgZG9lcyBub3QgY29tcGlsZSBpbiBWaXN1YWwgQysrCgo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUd28gbmV3IGRpcmVjdGl2ZXMgY29udHJvbCB0aGUgY3JlYXRpb24gb2YgZGVmYXVsdAogICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdAogICAgICAgICAgICAgICAgJW1ha2VkZWZhdWx0CgogICAgICAgICAgIFRoZXNlIHJlcGxhY2UgJXByYWdtYSBub2RlZmF1bHQgYW5kICVwcmFnbWEgbWFrZWRlZmF1bHQuCiAgICAgICAgICAgKG9sZCBjb2RlIHdpbGwgc3RpbGwgd29yaywgYnV0IGRvY3VtZW50YXRpb24gd2lsbCBvbmx5CiAgICAgICAgICAgZGVzY3JpYmUgdGhlIG5ldyBkaXJlY3RpdmVzKS4KCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjIzNTQgXSAlaW1wb3J0IGJyb2tlbiBpbiAxLjMuNy4KCjkvMjAvMjAwMTogYmVhemxleQoKICAgICAgICAgICBQYXJzZXIgbW9kaWZpZWQgdG8gaWdub3JlIG91dC1vZi1jbGFzcyBjb25zdHJ1Y3RvcgogICAgICAgICAgIGFuZCBkZXN0cnVjdG9yIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW5saW5lIEZvbzo6Rm9vKCkgOgogICAgICAgICAgICAgICAgICAgIEJhcigiZm9vIikKICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgfSAKCiAgICAgICAgICAgICAgIGlubGluZSBGb286On5Gb28oKSB7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEphc29uIFN0ZXdhcnQuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciB0byBpZ25vcmUgZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcwogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgViwgbG9uZyBTPiBjbGFzcyBNYXBJdGVyOwoKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgYW4gZW1haWwgZXhhbXBsZSBmcm9tIElyaW5hIEtvdGxvdmEuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdW5kZWNsYXJlZCB0Y2xfcmVzdWx0IHZhcmlhYmxlIGluIAogICAgICAgICAgIHRoZSAib3V0IiB0eXBlbWFwIGZvciBUY2wuICBSZXBvcnRlZCBieSBTaGF1biBMb3dyeS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY29ycG9yYXRlZCBjaGFuZ2VzIHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggQWN0aXZlUGVybC4gIAogICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZWwgUmVlZC4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBhcnNpbmcgb2YgQysrIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBGb28oKSA6IEJhciguLi4pIHsuLi59CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgU1dJRyBub3cgZGlzY2FyZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSAoLi4uKSByZWdhcmRsZXNzIG9mIAogICAgICAgICAgIHdoYXQgbWlnaHQgZW5jbG9zZWQgKGV2ZW4gaWYgc3ludGFjdGljYWxseSB3cm9uZykuICBTV0lHCiAgICAgICAgICAgZG9lc24ndCBuZWVkIHRoaXMgaW5mb3JtYXRpb24gYW5kIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwogICAgICAgICAgIG5lZWRsZXNzIGFkZCBzeW50YXggcnVsZXMgdG8gaGFuZGxlIGFsbCBvZiB0aGUgcG9zc2liaWxpdGllcwogICAgICAgICAgIGhlcmUuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdHlwZW1hcHMgZm9yIHN0cnVjdHVyZSBtZW1iZXJzLiAgSWYgeW91IGhhdmUgYQogICAgICAgICAgIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgaW50ICpiYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlIG1lbWJlciBuYW1lICdiYXInIGlzIG5vdyB1c2VkIGluIGFueSBhY2Nlc3NvciBmdW5jdGlvbnMuCiAgICAgICAgICAgVGhpcyBhbGxvd3MgdGhlICJpbiIgdHlwZW1hcCB0byBiZSB1c2VkIHdoZW4gc2V0dGluZyB0aGUgdmFsdWUuCiAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgdHlwZW1hcAoKICAgICAgICAgICAgICAgJXR5cGVtYXAocHl0aG9uLGluKSBpbnQgKmJhciB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBub3cgbWF0Y2hlcyBWZWN0b3I6OmJhci4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgd2lsbCBhbHNvCiAgICAgICAgICAgbWF0Y2ggYW55IGZ1bmN0aW9uIHdpdGggYW4gYXJndW1lbnQgb2YgImludCAqYmFyIiAoc28geW91IHNob3VsZAogICAgICAgICAgIGJlIGNhcmVmdWwpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRS4gUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyNjQyIHNldHRpbmcgc3RyaW5nIHZhbHVlcyBpbiBzdHJ1Y3R1cmVzCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MjM5OCBwcm9ibGVtIHdpdGggbmVzdGVkIHRlbXBsYXRlcy4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYxNjI2IHByb2JsZW0gd2l0aCBmb3JtYXR0aW5nIGFuZCBDKysgY29tbWVudHMuCiAgICAgICAgICAgIAo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2Mjg0NSBXcm9uZyBvd25lcnNoaXAgb2YgcmV0dXJuZWQgb2JqZWN0cy4KICAgICAgICAgICAKOS8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NTkzNjcuICBEZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IgY2xhc3NlcwogICAgICAgICAgIHdpdGggcHVyZSB2aXJ0dWFsIG1ldGhvZHMuCgo5LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIGNsYXNzIHNjb3BlLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgZW51bSBiYXIgeyBGT08sIEJBUiB9OwogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyIGIgPSBGT08pOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBTV0lHIG5vdyBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgZGVmYXVsdCB2YWx1ZSBvZiAiRm9vOjpGT08iIGZvcgogICAgICAgICAgIHRoZSBibGFoKCkgbWV0aG9kIGFib3ZlLiAgVGhpcyB1c2VkIHRvIHdvcmsgaW4gMS4xLCBidXQgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy43LiAgIEJ1ZyByZXBvcnRlZCBieSBNaWtlIFJvbWJlcmcuCgpWZXJzaW9uIDEuMy43ICAoU2VwdGVtYmVyIDMsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHNwZWNpYWwgJWlnbm9yZSBkaXJlY3RpdmUgdG8gaWdub3JlIGRlY2xhcmF0aW9ucy4gIFRoaXMKICAgICAgICAgICBmZWF0dXJlIHdvcmtzIGV4YWN0bHkgbGlrZSAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSAgZm9vOyAgICAgICAgLy8gSWdub3JlIGFsbCBkZWNsYXJhdGlvbnMgZm9vCiAgICAgICAgICAgICAlaWdub3JlICA6OmZvbzsgICAgICAvLyBPbmx5IGlnbm9yZSBmb28gaW4gZ2xvYmFsIHNjb3BlCiAgICAgICAgICAgICAlaWdub3JlICBTcGFtOjpmb287ICAvLyBPbmx5IGlnbm9yZSBpbiBjbGFzcyBTcGFtCiAgICAgICAgICAgICAlaWdub3JlICAqOjpmb287ICAgICAvLyBJZ25vcmUgaW4gYWxsIGNsYXNzZXMKCiAgICAgICAgICAgJWlnbm9yZSBjYW4gYWxzbyBiZSBwYXJhbWV0ZXJpemVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgOjpmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgU3BhbTo6Zm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlICo6OmZvbyhpbnQpOwoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAoKOS8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gc2hhZG93Y29kZSBwcmFnbWEgbW9kaWZpZWQgc28gdGhhdCB0aGUgY29kZSB0aGF0IGlzIG91dHB1dCAKICAgICAgICAgICBpbiB0aGUgc2hhZG93IGZpbGUgaXMgcGxhY2VkIHJlbGF0aXZlIHRvIHdoZXJlIGl0IGlzIHBsYWNlZCBpbiB0aGUgCiAgICAgICAgICAgYy9jKysgY29kZS4gVGhpcyBhbGxvd3Mgc3VwcG9ydCBmb3IgSmF2YURvYyBmdW5jdGlvbiBjb21tZW50cy4gCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBQYXRjaCBbICM0NDc3OTEgXSBGaXggZm9yIHB5dGhvbiAtaW50ZXJmYWNlIG9wdGlvbi4KICAgICAgICAgICBTdWJtaXR0ZWQgYnkgVGFybiBXZWlzbmVyIEJ1cnRvbi4KCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycwogICAgICAgICAgIGZvciBhIGNsYXNzIGlmIGl0IG9ubHkgZGVmaW5lcyBhIHByaXZhdGUvcHJvdGVjdGVkIGNvbnN0cnVjdG9yCiAgICAgICAgICAgb3IgZGVzdHJ1Y3RvciBvciBpZiBhbnkgb25lIG9mIGl0cyBiYXNlIGNsYXNzZXMgb25seSBoYXMKICAgICAgICAgICBwcml2YXRlIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycy4gIFRoaXMgd2FzIHJlcG9ydGVkIGluCiAgICAgICAgICAgU0YgUGF0Y2ggWyAjNDQ0MjgxIF0gbm9ucHVibGljL2RlZmF1bHQvaW5oZXJldGVkIGN0b3IvZHRvcgogICAgICAgICAgIGJ5IE1hcmNlbG8gTWF0dXMuCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXRjaCB0byBQZXJsNSBtb2R1bGUgdGhhdCBhbGxvd3MgY29uc3RhbnRzIHRvIGJlCiAgICAgICAgICAgd3JhcHBlZCBhcyBjb25zdGFudHMgdGhhdCBkb24ndCByZXF1aXJlIHRoZSBsZWFkaW5nICQuCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgdXNpbmcgdGhlIC1jb25zdCBvcHRpb24uCiAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgUmljaCBXYWxlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIHRoZSAndm9sYXRpbGUnIHR5cGUgcXVhbGlmaWVyLgogICAgICAgICAgIHZvbGF0aWxlIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyB0byBTV0lHLCBidXQgaXQgaXMKICAgICAgICAgICBuZWVkZWQgdG8gcHJvcGVybHkgZ2VuZXJhdGUgcHJvdG90eXBlcyBmb3IgZGVjbGFyYXRpb25zCiAgICAgICAgICAgdGhhdCB1c2UgaXQuICBJdCdzIGFsc28gYmVlbiBhZGRlZCB0byBtYWtlIHRoZSBTV0lHIHR5cGUKICAgICAgICAgICBzeXN0ZW0gbW9yZSBjb21wbGV0ZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBwYXJhbWV0ZXJpemVkICVyZW5hbWUgZGlyZWN0aXZlLiAgKioqIFRoaXMKICAgICAgICAgICBuZXcgZmVhdHVyZSBjYW4gYmUgdXNlZCB0byBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mCiAgICAgICAgICAgcmVzb2x2aW5nIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgZnVuY3Rpb25zLiAqKioKICAgICAgICAgICAKICAgICAgICAgICBJbiBwcmlvciB2ZXJzaW9ucyBvZiBTV0lHLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgd2FzCiAgICAgICAgICAgdXNlZCB0byBjb25zaXN0ZW50bHkgYXBwbHkgYW4gaWRlbnRpZmllciByZW5hbWluZy4gRm9yIAogICAgICAgICAgIGV4YW1wbGUsIGlmIHlvdSBzYWlkIHRoaXM6CgogICAgICAgICAgICAgICAgJXJlbmFtZSBmb28gYmFyOwoKICAgICAgICAgICBFdmVyeSBvY2N1cnJlbmNlIG9mICdmb28nIHdvdWxkIGJlIHJlbmFtZWQgdG8gJ2JhcicuIAogICAgICAgICAgIEFsdGhvdWdoIHRoaXMgd29ya3MgZmluZSBmb3IgcmVzb2x2aW5nIGEgY29uZmxpY3Qgd2l0aCBhCiAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIHJlc2VydmVkIHdvcmQsIGl0IGlzIHVzZWxlc3MgZm9yCiAgICAgICAgICAgZm9yIGRlYWxpbmcgd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMuICAgIFRoaXMgaXMgYmVjYXVzZQogICAgICAgICAgIGFsbCBtZXRob2RzIGFyZSBzaW1wbHkgcmVuYW1lZCB0byB0aGUgc2FtZSB0aGluZyAKICAgICAgICAgICAoZ2VuZXJhdGluZyB0aGUgc2FtZSBjb25mbGljdCBhcyBiZWZvcmUpLgoKICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSBvbmx5IHdheSB0byBkZWFsIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzCiAgICAgICAgICAgd2FzIHRvIGdvIHRocm91Z2ggYW5kIGluZGl2aWR1YWxseSByZW5hbWUgdGhlbSBhbGwgdXNpbmcKICAgICAgICAgICAlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJhcih2b2lkKTsKICAgICAgICAgICAgICAgICAlbmFtZShiYXJfaSkgdmlydHVhbCB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCB5b3UgaGFkIHRvIGRvIHRoaXMgZm9yIGFsbAogICAgICAgICAgIGRlcml2ZWQgY2xhc3NlcyB0b28uCgogICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIodm9pZCk7CiAgICAgICAgICAgICAgICAgJW5hbWUoYmFyX2kpIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSwgdGhpcyBtYWtlcyBpdCBleHRyZW1lbHkgaGFyZCB0byByZXNvbHZlCiAgICAgICAgICAgb3ZlcmxvYWRpbmcgd2l0aG91dCBhIGxvdCBvZiB3b3JrIGFuZCBtYWtlcyBpdCBhbG1vc3QKICAgICAgICAgICBpbXBvc3NpYmxlIHRvIHVzZSBTV0lHIG9uIHJhdyBDKysgLmggZmlsZXMuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCAlcmVuYW1lIG5vdyBhY2NlcHRzIHBhcmFtZXRlciBkZWNsYXJhdG9ycy4KICAgICAgICAgICBUaGUgc3ludGF4IGhhcyBhbHNvIGJlZW4gY2hhbmdlZCBzbGlnaHRseS4gIEZvciBleGFtcGxlLAogICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gcmVuYW1lcyBhbGwgb2NjdXJyZW5jZXMgb2YgJ2JhcihpbnQpJwogICAgICAgICAgIHRvICdiYXJfaScsIGxlYXZpbmcgYW55IG90aGVyIG9jY3VycmVuY2Ugb2YgJ2JhcicgYWxvbmUuCgogICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgYmFyKGludCk7CgogICAgICAgICAgIFVzaW5nIHRoaXMgZmVhdHVyZSwgeW91IGNhbiBub3cgc2VsZWN0aXZlbHkgcmVuYW1lIAogICAgICAgICAgIGNlcnRhaW4gZGVjbGFyYXRpb25zIGluIGFkdmFuY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBiYXIoaW50KTsKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2QpIGJhcihkb3VibGUpOwoKICAgICAgICAgICAgIC8vIEluY2x1ZGUgcmF3IEMrKyBoZWFkZXIgICAgCiAgICAgICAgICAgICAlaW5jbHVkZSAiaGVhZGVyLmgiCgogICAgICAgICAgIFdoZW4gJXJlbmFtZSBpcyB1c2VkIGluIHRoaXMgbWFubmVyLCBhbGwgb2NjdXJyZW5jZSBvZiBiYXIoaW50KQogICAgICAgICAgIGFyZSByZW5hbWVkIHdoZXJldmVyIHRoZXkgbWlnaHQgb2NjdXIuICBNb3JlIGNvbnRyb2wgaXMgb2J0YWluZWQKICAgICAgICAgICB0aHJvdWdoIGV4cGxpY2l0IHF1YWxpZmljYXRpb24uIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSA6OmJhcihpbnQpOwoKICAgICAgICAgICBvbmx5IGFwcGxpZXMgdGhlIHJlbmFtaW5nIGlmIGJhcihpbnQpIGlzIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KICAgICAgICAgICBUaGUgZGVjbGFyYXRpb24sCiAgICAgCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgRm9vOjpiYXIoaW50KTsKCiAgICAgICAgICAgYXBwbGllcyB0aGUgcmVuYW1pbmcgaWYgYmFyKGludCkgaXMgZGVmaW5lZCBpbiBhIGNsYXNzIEZvby4KICAgICAgICAgICBUaGlzIGxhdHRlciBmb3JtIGFsc28gc3VwcG9ydHMgaW5oZXJpdGFuY2UuICBUaGVyZWZvcmUsIGlmIHlvdQogICAgICAgICAgIGhhZCBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGUgU3BhbTo6YmFyKGludCkgbWV0aG9kIHdvdWxkIGFsc28gYmUgcmVuYW1lZCAoc2luY2UgU3BhbSAKICAgICAgICAgICBpcyBhIHN1YmNsYXNzIG9mIEZvbykuICAgVGhpcyBsYXR0ZXIgZmVhdHVyZSBtYWtlcyBpdCBlYXN5CiAgICAgICAgICAgZm9yIFNXSUcgdG8gYXBwbHkgYSBjb25zaXN0ZW50IHJlbmFtaW5nIGFjcm9zcyBhbiBlbnRpcmUKICAgICAgICAgICBjbGFzcyBoaWVyYXJjaHkgc2ltcGx5IGJ5IHNwZWNpZnlpbmcgcmVuYW1pbmcgcnVsZXMgZm9yCiAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgIEEgY2xhc3Mgd2lsZGNhcmQgb2YgKiBjYW4gYmUgdXNlZCBpZiB5b3Ugd2FudCB0byByZW5hbWluZwogICAgICAgICAgIGFsbCBtYXRjaGluZyBtZW1iZXJzIG9mIGFsbCBjbGFzc2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpICo6OmJhcihpbnQpOwoKICAgICAgICAgICB3aWxsIHJlbmFtZSBhbGwgbWVtYmVycyBiYXIoaW50KSB0aGF0IGFyZSBkZWZpbmVkIGluIGNsYXNzZXMuCiAgICAgICAgICAgSXQgd2lsbCBub3QgcmVuYW1lZCBkZWZpbml0aW9ucyBvZiBiYXIoaW50KSBpbiB0aGUgZ2xvYmFsCiAgICAgICAgICAgc2NvcGUuCgogICAgICAgICAgIFRoZSBvbGQgdXNlIG9mICVyZW5hbWUgaXMgc3RpbGwgc3VwcG9ydGVkLCBidXQgaXMgc29tZXdoYXQKICAgICAgICAgICBlbmhhbmNlZC4gIAoKICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgYmFyOyAgICAgIC8vIFJlbmFtZXMgYWxsIG9jY3VycmVuY2VzIG9mICdiYXInLgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSA6OmJhcjsgICAgLy8gUmVuYW1lIGFsbCAnYmFyJyBpbiBnbG9iYWwgc2NvcGUgb25seS4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgKjo6YmFyOyAgIC8vIFJlbmFtZSBhbGwgJ2JhcicgaW4gY2xhc3NlcyBvbmx5LgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSBGb286OmJhcjsgLy8gUmVuYW1lIGFsbCAnYmFyJyBkZWZpbmVkIGluIGNsYXNzIEZvby4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZGF0YS1tZW1iZXIgdG8gbWVtYmVyLWZ1bmN0aW9uIAogICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhCiAgICAgICAgICAgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCx5OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgTm93IHN1cHBvc2UgdGhhdCB5b3Ugd2FudGVkIHRvIGFjY2VzcyB4IGFuZCB5IAogICAgICAgICAgIHRocm91Z2ggYSBtZW1iZXIgZnVuY3Rpb24gaW50ZXJmYWNlIGluc3RlYWQgCiAgICAgICAgICAgb2YgdGhlIHVzdWFsIFNXSUcgYmVoYXZpb3IuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBmLnNldF94KDMuNCkgICAgICAjIGluc3RlYWQgb2YgZi54ID0gMy40CiAgICAgICAgICAgICAgeCA9IGYuZ2V0X3goKSAgICAgIyBpbnN0ZWFkIG9mIHggPSBmLngKCiAgICAgICAgICAgVG8gZG8gdGhpcywgc2ltcGx5IHVzZSB0aGUgbmV3ICVhdHRyaWJ1dGVmdW5jCiAgICAgICAgICAgZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldF8lcyxzZXRfJXMpCiAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICVub2F0dHJpYnV0ZWZ1bmMKCiAgICAgICAgICAgVGhlIGFyZ3VtZW50cyB0byAlYXR0cmlidXRlZnVuYyBhcmUgQy1zdHlsZSBwcmludGYKICAgICAgICAgICBmb3JtYXQgc3RyaW5ncyB0aGF0IGRldGVybWluZSB0aGUgbmFtaW5nIGNvbnZlbnRpb24KICAgICAgICAgICB0byB1c2UuICAlcyBpcyByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUKICAgICAgICAgICBkYXRhIG1lbWJlci4gU1dJRyBwcm92aWRlcyBhIG51bWJlciBvZiBwcmludGYKICAgICAgICAgICBleHRlbnNpb25zIHRoYXQgbWlnaHQgaGVscC4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICB3YW50ZWQgdG8gdGl0bGUgY2FzZSBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMsIHlvdQogICAgICAgICAgIGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldCUodGl0bGUpcyxzZXQlKHRpdGxlKXMpOwoKICAgICAgICAgICBUaGlzIHdpbGwgdHVybiBhbiBhdHRyaWJ1dGUgJ2JhcicgdG8gJ2dldEJhcigpJyBhbmQgJ3NldEJhcigpJy4KCiAgICAgICAgICAgKHNvbWVvbmUgcmVxdWVzdGVkIHRoaXMgbG9uZyBhZ28sIGJ1dCBJIGZpbmFsbHkgZmlndXJlZAogICAgICAgICAgIGhvdyB0byBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgbWFubmVyKS4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycwogICAgICAgICAgIGFuZCBkZXN0cnVjdG9ycyBpZiBub25lIGFyZSBkZWZpbmVkLiAgVGhpcyB1c2VkIHRvIGJlCiAgICAgICAgICAgZW5hYmxlZCB3aXRoIGEgY29tbWFuZCBsaW5lIHN3aXRjaCAtbWFrZV9kZWZhdWx0LCBidXQKICAgICAgICAgICBtb3N0IHBlb3BsZSB3YW50IHRoZXNlIGZ1bmN0aW9ucyBhbnl3YXlzLiAgVG8gdHVybgogICAgICAgICAgIG9mZiB0aGlzIGJlaGF2aW9yIHVzZSB0aGUgLW5vX2RlZmF1bHQgb3B0aW9uIG9yIGluY2x1ZGUKICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByYWdtYSBpbiB0aGUgaW50ZXJmYWNlIGZpbGU6CiAKICAgICAgICAgICAgICAgICAlcHJhZ21hIG5vX2RlZmF1bHQ7CiAgCiAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgY2VydGFpbiBpbnRlcmZhY2VzIHRoYXQgZGVmaW5lZCB0aGVpcgogICAgICAgICAgIG93biBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgdXNpbmcgdGhlIHNhbWUgbmFtaW5nCiAgICAgICAgICAgY29udmVudGlvbiBhcyBTV0lHLiAgSWYgc28sIHlvdSB3aWxsIGdldCBkdXBsaWNhdGUKICAgICAgICAgICBzeW1ib2xzIHdoZW4gY29tcGlsaW5nIHRoZSBTV0lHIHdyYXBwZXIgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gUGVybDUgc2hhZG93IGNsYXNzIGNvZGUgZ2VuZXJhdGlvbi4gIEl0ZXJhdG9ycwogICAgICAgICAgIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIChGSVJTVEtFWSwgTkVYVEtFWSkuICBBbHNvLCBhdHRyaWJ1dGUKICAgICAgICAgICBhY2Nlc3MgaGFzIGJlZW4gY2hhbmdlZCB0byByZWx5IG9uIGluaGVyaXRhbmNlIGluIG9yZGVyCiAgICAgICAgICAgdG8gcHJvdmlkZSBiZXR0ZXIgYmVoYXZpb3IgYWNyb3NzIG1vZHVsZXMuICAKCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIFZhcmlvdXMgb2JzY3VyZSBpbXByb3ZlbWVudHMgdG8gdGhlIHR5cGUgc3lzdGVtIGFuZCBjbGFzc2VzLgogICAgICAgICAgIFN0cmFuZ2UgZGVjbGFyYXRpb25zIGxpa2UgdGhpcyBhcmUgbm93IHdyYXBwZWQgY29ycmVjdGx5CiAgICAgICAgICAgKGkuZS4sIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGRvZXNuJ3QgY2F1c2UgdGhlIEMrKwogICAgICAgICAgICBjb21waWxlciB0byBkaWUgd2l0aCBhIHR5cGUgZXJyb3IpLgoKICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIFJlYWw7CiAgICAgICAgICAgICAgICAgUmVhbCBmb28oUmVhbCAoKm9wKShSZWFsLFJlYWwpLCBSZWFsIHgsIFJlYWwgeSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgIEluaGVyaXRhbmNlIG9mIHR5cGVzIGlzIGFsc28gaGFuZGxlZCBjb3JyZWN0bHkuCiAgICAgICAgICAgCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gY2xhc3Mgd3JhcHBlcnMuICAgV2hlbiBTV0lHIHNlZXMgdHdvIGNsYXNzZXMgbGlrZSB0aGlzLAogCiAgICAgICAgICAgY2xhc3MgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBmb28oKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGNsYXNzIFkgOiBwdWJsaWMgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBiYXIoKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGl0IG5vdyBvbmx5IGdlbmVyYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnM6CiAKICAgICAgICAgICAgIFhfZm9vKFggKngpIHsgeC0+Zm9vKCk7IH0KICAgICAgICAgICAgIFlfYmFyKFkgKnkpIHsgeS0+YmFyKCk7IH0KIAogICAgICAgICAgIFVubGlrZSBTV0lHMS4xNSwgdGhlIGZvbygpIG1ldGhvZCBkb2VzICpub3QqIHByb3BhZ2F0ZSB0byBhIHdyYXBwZXIKICAgICAgICAgICBmdW5jdGlvbiBZX2ZvbygpLiBJbnN0ZWFkLCB0aGUgYmFzZSBjbGFzcyBtZXRob2QgWF9mb28oKSBtdXN0IGJlCiAgICAgICAgICAgdXNlZC4KCiAgICAgICAgICAgVGhpcyBjaGFuZ2Ugc2hvdWxkIG5vdCBhZmZlY3QgbW9kdWxlcyB0aGF0IHVzZSBzaGFkb3cgY2xhc3NlcywgYnV0CiAgICAgICAgICAgaXQgbWlnaHQgYnJlYWsgbW9kdWxlcyB0aGF0IGRpcmVjdGx5IHVzZSB0aGUgbG93LWxldmVsIEMgd3JhcHBlcnMuCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYmVpbmcgbWFkZSBmb3IgYSBudW1iZXIgb2YgcmVhc29uczoKCiAgICAgICAgICAgICAgIC0gIEl0IGdyZWF0bHkgc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgU1dJRy0tZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICB3aXRoIGFudGljaXBhdGVkIGZ1dHVyZSBjaGFuZ2VzIHN1Y2ggYXMgb3ZlcmxvYWRlZCBtZXRob2RzLgoKICAgICAgICAgICAgICAgLSAgSXQgcmVzdWx0cyBpbiBzdWJzdGFudGlhbGx5IGxlc3Mgd3JhcHBlciBjb2RlLS1lc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgIGZvciBiaWcgQysrIGNsYXNzIGhpZXJhcmNoaWVzIChpbmhlcml0ZWQgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICAgIGFyZSBubyBsb25nZXIgY29waWVkIGludG8gZXZlcnkgc2luZ2xlIGRlcml2ZWQgY2xhc3MpLgoKICAgICAgICAgICAgICAgLSAgSXQgYWxsb3dzIGZvciBiZXR0ZXIgY29kZSBnZW5lcmF0aW9uIGFjcm9zcyBtdWx0aXBsZQogICAgICAgICAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzIChjb2RlIGlzbid0IHJlcGxpY2F0ZWQgaW4KICAgICAgICAgICAgICAgICAgZXZlcnkgc2luZ2xlIG1vZHVsZSkuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBQcm92aWRlZCBzb21lIFdpbmRvd3MgZG9jdW1lbnRhdGlvbiBpbiB0aGUgV2luIGRpcmVjdG9yeSBhbmQgc29tZQogICAgICAgICAgIFZpc3VhbCBDKysgcHJvamVjdCBmaWxlcyBmb3IgcnVubmluZyBleGFtcGxlcyBvbiBXaW5kb3dzLgoKOC8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSByZW5hbWVkIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHByb3Blcmx5OwoJICAgdGhhbmtzIHRvIE1hcmMgWm9uem9uIDxNYXJjLlpvbnpvbkB1bml2LXJlbm5lczEuZnI+IGZvciB0aGUKCSAgIHBhdGNoLiAgU2VlIHRoZSBuZXcgdGVzdCBjYXNlIG5hbWVfY3h4LgoKOC8yNy8yMDAxOiBta29lcHBlCgkgICBbVGNsXSBSZW1vdmVkIGxvdHMgb2Ygd2FybmluZ3MgaXNzdWVkIGJ5IHRoZSBTdW4gRm9ydGUKCSAgIGNvbXBpbGVycywgd2hpY2ggd2VyZSBjYXVzZWQgYnkgbWl4aW5nIGZ1bmN0aW9uIHBvaW50ZXJzCgkgICBvZiBkaWZmZXJlbnQgbGlua2FnZXMgKEMrKy9DKS4gCgo4LzIzLzIwMDE6IG1rb2VwcGUKCSAgIEltcHJvdmVkIHRoZSBNelNjaGVtZSBtb2R1bGUgYnkgcG9ydGluZyBHdWlsZSdzIHBvaW50ZXIKCSAgIHR5cGUgY2hlY2tpbmcgc3lzdGVtIGFuZCBtYWtpbmcgdHlwZSBkaXNwYXRjaAoJICAgdHlwZW1hcC1kcml2ZW4uIAoKOC8yMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRW50aXJlbHkgbmV3IHN5bWJvbCB0YWJsZSBwcm9jZXNzaW5nLiAgIFNXSUcgc2hvdWxkIGJlIGFibGUgdG8KICAgICAgICAgICByZXBvcnQgbXVjaCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIG11bHRpcGxlIGRlY2xhcmF0aW9ucy4gCiAgICAgICAgICAgQWxzbywgdGhlIG5ldyBzeW1ib2wgdGFibGUgYWxsb3dzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucwogICAgICAgICAgIChhbHRob3VnaCBvdmVybG9hZGluZyBpc24ndCBxdWl0ZSBzdXBwb3J0ZWQgaW4gdGhlIGxhbmd1YWdlCiAgICAgICAgICAgbW9kdWxlcyB5ZXQpLgoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIFtKYXZhXSAlbmV3IHN1cHBvcnQgYWRkZWQuCiAgICAgICAgICAgKiBbSmF2YV0gUGFja2FnZSBKTkkgbmFtZSByZWZpeGVkIQoKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUHl0aG9uIG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IHBvaW50ZXJzIHRvIEMrKyBtZW1iZXJzLiAgVGhpcwogICAgICAgICAgIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbGltaXRlZCBwYXJzaW5nIGFuZCBmdWxsIHR5cGUtc3lzdGVtIHN1cHBvcnQgZm9yIHBvaW50ZXJzIHRvCiAgICAgICAgICAgbWVtYmVycy4gTm9uZSBvZiBTV0lHJ3MgbGFuZ3VhZ2UgbW9kdWxlcyByZWFsbHkga25vdyBob3cgdG8gZGVhbCB3aXRoCiAgICAgICAgICAgdGhpcyBzbyB0aGlzIGlzIHJlYWxseSBvbmx5IHByb3ZpZGVkIGZvciBjb21wbGV0ZW5lc3MgYW5kIGZ1dHVyZQogICAgICAgICAgIGV4cGFuc2lvbi4gIE5vdGU6IFNXSUcgZG9lcyBub3Qgc3VwcG9ydCBwb2ludGVycyB0byBtZW1iZXJzIHdoaWNoIAogICAgICAgICAgIGFyZSB0aGVtc2VsdmVzIHBvaW50ZXJzIHRvIG1lbWJlcnMsIHJlZmVyZW5jZXMgdG8gcG9pbnRlcnMgdG8gbWVtYmVycywKICAgICAgICAgICBvciBvdGhlciBjb21wbGljYXRlZCBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgaXMgbXVjaCBiZXR0ZXIgYXQgcGFyc2luZyBjZXJ0YWluIEMrKyBkZWNsYXJhdGlvbnMuIE9wZXJhdG9ycyBhbmQKICAgICAgICAgICBmcmllbmRzIGdlbmVyYWxseSBkb24ndCBjYXVzZSBhbnltb3JlIHN5bnRheCBlcnJvcnMuICBIb3dldmVyLCBuZWl0aGVyCiAgICAgICAgICAgYXJlIHJlYWxseSBzdXBwb3J0ZWQuCgo4LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAqaGlnaGx5KiBleHBlcmltZW50YWwgc3VwcG9ydCBmb3Igd3JhcHBpbmcgb2YgQysrCiAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb25zLiAgU2luY2UgQysrIHRlbXBsYXRlcyBhcmUgZXNzZW50aWFsbHkKICAgICAgICAgICBnbG9yaWZpZWQgbWFjcm9zIGFuZCBTV0lHIGhhcyBhIGZ1bGx5IG9wZXJhdGlvbmFsIEMgCiAgICAgICAgICAgcHJlcHJvY2Vzc29yIHdpdGggbWFjcm8gc3VwcG9ydCwgdGhlIHBhcnNlciBub3cgY29udmVydHMKICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMgdG8gbWFjcm9zLiAgRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24KICAgICAgICAgICB0ZW1wbGF0ZSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IFQgbWF4KFQgYSwgVCBiKTsKCiAgICAgICAgICAgaXMgaW50ZXJuYWxseSBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICVkZWZpbmUgJV90ZW1wbGF0ZV9tYXgoX19uYW1lLFQpCiAgICAgICAgICAgICAgICVuYW1lKF9fbmFtZSkgVCBtYXgoVCBhLCBUIGIpOwogICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFRvIGluc3RhbnRpYXRlIGEgdmVyc2lvbiBvZiB0aGUgdGVtcGxhdGUsIGEgc3BlY2lhbCAldGVtcGxhdGUgZGVjbGFyYXRpb24KICAgICAgICAgICBpcyB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIG1heDxpbnQ+OyAgICAgICAgICAKICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47CgogICAgICAgICAgIFRoZSBwYXJhbWV0ZXIgdG8gdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgbXVzdCBiZSBwcm9wZXIgQyBpZGVudGlmaWVyIHRoYXQncwogICAgICAgICAgIHVzZWQgdG8gdW5pcXVlbHkgbmFtZSB0aGUgcmVzdWx0aW5nIGluc3RhbnRpYXRpb24uICAgV2hlbiB1c2VkLCB0aGUKICAgICAgICAgICB0aGUgZXhwYW5kZWQgbWFjcm8gbG9va3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlbmFtZShtYXhpbnQpIGludCBtYXgoaW50IGEsIGludCBiKTsKICAgICAgICAgICAgICAlbmFtZShtYXhkb3VibGUpIGRvdWJsZSBtYXgoZG91YmxlIGEsIGRvdWJsZSBiKTsKCiAgICAgICAgICAgQSBzaW1pbGFyIHRlY2huaXF1ZSBpcyB1c2VkIGZvciB0ZW1wbGF0ZSBjbGFzc2VzLiAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICBUICpkYXRhOwogICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmVjdG9yKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgIFQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgR2V0cyBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJWRlZmluZSAlX3RlbXBsYXRlX3ZlY3RvcihfX25hbWUsIFQpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxUPiBfX25hbWU7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICBjbGFzcyBfX25hbWUgewogICAgICAgICAgICAgICAgIFQgKmRhdGE7CiAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBfX25hbWUoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgVCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHR5cGVkZWYgX19uYW1lIHZlY3RvcjxUPjsKICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIEFuIGEgc3BlY2lmaWMgaW5zdGFudGlhdGlvbiBpcyBjcmVhdGVkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5OgoKICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWMpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICBUaGUgcmVzdWx0aW5nIGNvZGUgcGFyc2VkIGJ5IFNXSUcgaXMgdGhlbjoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlYzsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIGNsYXNzIGludHZlYyB7CiAgICAgICAgICAgICAgICAgIGludCAqZGF0YTsKICAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50dmVjKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgICBpbnQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdHlwZWRlZiBpbnR2ZWMgdmVjdG9yPGludD47CgogICAgICAgICAgIE5vdGU6IHRoZSBsYXN0IHR5cGVkZWYgaXMgbm9uLXN0YW5kYXJkIEMgYW5kIGlzIHVzZWQgYnkgU1dJRyB0byBwcm92aWRlCiAgICAgICAgICAgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgbmFtZSAiaW50dmVjIiBhbmQgdGhlIHRlbXBsYXRlIHR5cGUgCiAgICAgICAgICAgInZlY3RvcjxpbnQ+Ii4KCiAgICAgICAgICAgQ0FVVElPTjogIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIHRoZSBmaXJzdCB0aW1lIFNXSUcgaGFzCiAgICAgICAgICAgc3VwcG9ydGVkIEMrKyB0ZW1wbGF0ZXMuICAgRXJyb3IgcmVwb3J0aW5nIGlzIGVzc2VudGlhbCBub24tZXhpc3RlbnQuCiAgICAgICAgICAgSXQgd2lsbCBwcm9iYWJseSBicmVhayBpbiBjZXJ0YWluIGNhc2VzLgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqKgoKOC8xNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHdyYXBwaW5nIG9mIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cy4gIEFycmF5cwogICAgICAgICAgIGFyZSBub3cgcHJvcGVybHkgbWFwcGVkIHRvIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZgogICAgICAgICAgIG9uZSBsZXNzIGRpbWVuc2lvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBbMTBdOyAgICAgICAgICAgICAgLS0+ICBpbnQgKgogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdOyAgICAgICAgICAtLT4gIGludCAoKilbMjBdOwogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdWzMwXTsgICAgICAtLT4gIGludCAoKilbMjBdWzMwXTsKCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGNlcnRhaW4gU1dJRyBleHRlbnNpb25zIGJlY2F1c2UKICAgICAgICAgICBvbGRlciB2ZXJzaW9ucyBzaW1wbHkgbWFwcGVkIGFsbCBhcnJheXMgaW50byBhIHNpbmdsZQogICAgICAgICAgIHBvaW50ZXIgc3VjaCBhcyAiaW50ICoiLiAgIEFsdGhvdWdoIHBvc3NpYmx5IHVudXN1YWwsIAogICAgICAgICAgIHRoZSBuZXcgdmVyc2lvbiBpcyBjb3JyZWN0IGluIHRlcm1zIG9mIHRoZSBDIHR5cGUgc3lzdGVtLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgCjgvMDYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBbSmF2YV0gQXJyYXkgc2V0dGVycyBnZW5lcmF0ZWQgZm9yIHN0cnVjdC9jbGFzcyBhcnJheSBtZW1iZXJzLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFueSBpbXByb3ZlbWVudHMgdG8gVGNsL1BlcmwvUHl0aG9uIG1vZHVsZXMgdG8gYmV0dGVyCiAgICAgICAgICAgd29yayB3aXRoIG11bHRpcGxlIGludGVyZmFjZSBmaWxlcyBhbmQgdGhlICVpbXBvcnQgZGlyZWN0aXZlLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIGJlaGF2aW9yIG9mICVpbXBvcnQgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICAgU1dJRyBubyBsb25nZXIgcG9sbHV0ZXMgdGhlIG1vZHVsZSBuYW1lc3BhY2UgYnkgdXNpbmcKICAgICAgICAgICAnZnJvbSBtb2R1bGUgaW1wb3J0IConIHRvIHJlZmVyIHRvIHRoZSBvdGhlciBtb2R1bGUuIAogICAgICAgICAgIEluc3RlYWQsIGl0IGRvZXMgYSBwcm9wZXIgJ2ltcG9ydCBtb2R1bGUnLiAgIEFsc28sIFNXSUcKICAgICAgICAgICBtYXkgd29yayBhIGxvdCBiZXR0ZXIgd2hlbiBpbXBvcnRpbmcgbW9kdWxlcyB0aGF0IGluY2x1ZGUKICAgICAgICAgICByZWZlcmVuY2VzIHRvIG90aGVyIGltcG9ydGVkIG1vZHVsZXMuCgo4LzEzLzIwMDE6IG1rb2VwcGUKCSAgIEFkZGVkIG5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbnMsIGdlbmVyYWxpemluZyB0aG9zZSBvZiB0aGUKCSAgIEd1aWxlLXNwZWNpZmljIDUvMjcvMjAwMSBjaGFuZ2VzOiAKCSAgICogJGRlc2NyaXB0b3IgaXMgdGhlIHNhbWUgYXMgU1dJR1RZUEUkbWFuZ2xlLCBidXQgYWxzbwoJICAgICBlbnN1cmVzIHRoYXQgdGhlIHR5cGUgZGVzY3JpcHRvciBvZiB0aGlzIG5hbWUgZ2V0cwoJICAgICBkZWZpbmVkLgoJICAgKiAkKnR5cGUsICQqbHR5cGUsICQqbWFuZ2xlLCAkKmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IHN0YXIsIGJ1dCB0aGV5IFJFTU9WRSBvbmUgbGV2ZWwgb2YKCSAgICAgcG9pbnRlcnMgZnJvbSB0aGUgdHlwZS4gKFRoaXMgaXMgb25seSB2YWxpZCBmb3IgcG9pbnRlciAKCSAgICAgdHlwZXMuKQoJICAgKiAkJnR5cGUsICQmbHR5cGUsICQmbWFuZ2xlLCAkJmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IGFtcGVyc2FuZCwgYnV0IHRoZXkgQUREIG9uZSBsZXZlbCBvZgoJICAgICBwb2ludGVycyB0byB0aGUgdHlwZS4KCSAgIFRoZSBHdWlsZS1zcGVjaWZpYyBzdWJzdGl0dXRpb24gJGJhc2VkZXNjcmlwdG9yIHdhcyByZW1vdmVkCgkgICBiZWNhdXNlIGl0IHdhcyB1c2VsZXNzLgoKOC8xMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlICVleHRlcm4gZGlyZWN0aXZlIGlzIG5vdyBkZXByZWNhdGVkIGFuZCB3aXRoZHJhd24uICBUaGUKICAgICAgICAgICBwdXJwb3NlIG9mIHRoaXMgZGlyZWN0aXZlIHdhcyB0byBpbXBvcnQgc2VsZWN0ZWQgZGVmaW5pdGlvbnMKICAgICAgICAgICBmcm9tIG90aGVyIGludGVyZmFjZSBmaWxlcyBhbmQgaGVhZGVycy4gIEhvd2V2ZXIsIHRoZSBzYW1lCiAgICAgICAgICAgZnVuY3Rpb25hbGl0eSBpcyBiZXR0ZXIgaGFuZGxlZCB0aHJvdWdoICVpbXBvcnQuICAgVGhpcwogICAgICAgICAgIGxlYXZlcyBTV0lHIHdpdGggdHdvIGZpbGUgaW5jbHVzaW9uIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICVpbmNsdWRlIGZpbGVuYW1lICAgICAtIEluc2VydHMgaW50byBjdXJyZW50IGludGVyZmFjZQogICAgICAgICAgICAgICVpbXBvcnQgZmlsZW5hbWUgICAgICAtIEltcG9ydCB0eXBlcyBhbmQgY2xhc3NlcyBmcm9tIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIgbW9kdWxlCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbmV3IHN1cHBvcnQgZm9yIHdyYXBwaW5nIEMvQysrIGNhbGxiYWNrIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgQSBjb21tb24gcHJvYmxlbSB3aXRoIHNvbWUgQyBsaWJyYXJpZXMgaXMgdGhhdCBtYW55CiAgICAgICAgICAgZnVuY3Rpb25zIHRha2UgYSBmdW5jdGlvbiBwb2ludGVyIGFzIGFuIGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgaW50ICgqb3ApKGludCxpbnQpLCAuLi4pOwoKICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgb25seSB3YXkgdG8gY2FsbCBzdWNoIGEgZnVuY3Rpb24gaXMgdG8KICAgICAgICAgICBwYXNzIGl0IGEgZnVuY3Rpb24gcG9pbnRlciBvZiBzb21lIGNvbXBhdGlibGUgdHlwZS4gIEluCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgeW91IGhhZCB0byBzb2x2ZSB0aGlzIHByb2JsZW0KICAgICAgICAgICB3aXRoIHNvbWUgcmVhbGx5IGdyb3NzIGhhY2tzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KICAgICAgICAgICB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBhcyBhIGNhbGxiYWNrLAoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsIGludCk7CgogICAgICAgICAgIHlvdSBoYWQgdG8gaW5zdGFsbCBhIHBvaW50ZXIgdG8gaXQgYXMgYSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCAoKkZPTykoaW50LGludCkgPSBmb287CgogICAgICAgICAgIG9yIAoKICAgICAgICAgICAgICAgY29uc3QgaW50ICgqRk9PKShpbnQsaW50KSA9IGZvbzsKCiAgICAgICAgICAgb3IgaWYgeW91IGhhZCBhIHJlYWxseSBvbGQgU1dJRyB2ZXJzaW9uOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpPUF9GVU5DKShpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgT1BfRlVOQywgLi4uKTsKICAgICAgICAgICAgICAgY29uc3QgT1BfRlVOQyBGT08gPSBmb287CgogICAgICAgICAgIAogICAgICAgICAgIE5vdywgeW91IGNhbiBkbyBvbmUgb2YgdHdvIHRoaW5nczoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgZm9vKGludCxpbnQpOwoKICAgICAgICAgICBUaGlzIGNyZWF0ZXMgYSBjb25zdGFudCAnZm9vJyBvZiB0eXBlIGludCAoKikoaW50LGludCkuCiAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlcyIpOwogICAgICAgICAgICAgICBpbnQgZm9vKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgYmFyKGludCxpbnQpOwogICAgICAgICAgICAgICAlbm9jYWxsYmFjazsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZnVuY3Rpb25zIGFyZSBpbnN0YWxsZWQgYXMgY29uc3RhbnRzIHdoZXJlCiAgICAgICAgICAgdGhlIG5hbWUgaXMgZGVmaW5lZCBieSB0aGUgZm9ybWF0IHN0cmluZyBnaXZlbiB0byAlY2FsbGJhY2soKS4KICAgICAgICAgICBJZiB0aGUgbmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGRpZmZlciBmcm9tIHRoZQogICAgICAgICAgIGFjdHVhbCBmdW5jdGlvbiBuYW1lLCBib3RoIGEgZnVuY3Rpb24gd3JhcHBlciBhbmQgYSBjYWxsYmFjayAKICAgICAgICAgICBjb25zdGFudCBhcmUgY3JlYXRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlKHVwcGVyKXMiKTsKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGJhcihpbnQsaW50KTsKICAgICAgICAgICAgICAgJW5vY2FsbGJhY2s7CiAgICAgICAgICAgCiAgICAgICAgICAgQ3JlYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnMgJ2ZvbycsICdiYXInIGFuZCBhZGRpdGlvbmFsbHkKICAgICAgICAgICBjcmVhdGVzIHR3byBjYWxsYmFjayBjb25zdGFudHMgJ0ZPTycsICdCQVInLgoKICAgICAgICAgICBOb3RlOiBTV0lHIHN0aWxsIGRvZXMgbm90IHByb3ZpZGUgYXV0b21hdGljIHN1cHBvcnQgZm9yIAogICAgICAgICAgIHdyaXRpbmcgY2FsbGJhY2sgZnVuY3Rpb25zIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8wNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIHN0cnVjdCBuZXN0aW5nIGZpeGVzIGFzIHBlciBTRiBidWcgIzQ0NzQ4OC4KCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlbmFtZSBkaXJlY3RpdmUgbm93IGFwcGxpZXMgdG8gY29uc3RhbnRzIGNyZWF0ZWQgd2l0aAogICAgICAgICAgICNkZWZpbmUgYW5kICVjb25zdGFudC4gIEhvd2V2ZXIsIG1vc3QgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgIHdlcmUgbmV2ZXIgd3JpdHRlbiB0byBzdXBwb3J0IHRoaXMgYW5kIHdpbGwgaGF2ZSB0byBiZQogICAgICAgICAgIG1vZGlmaWVkIHRvIG1ha2UgaXQgd29yay4gIFRjbCwgUHl0aG9uLCBhbmQgUGVybCBtb2R1bGVzCiAgICAgICAgICAgYXJlIHdvcmtpbmcgbm93LgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hc3NpdmUgY2hhbmdlcyBhbmQgc2ltcGxpZmljYXRpb24gb2YgQyBkZWNsYXJhdGlvbiBwYXJzaW5nLgogICAgICAgICAgIEFsdGhvdWdoIFNXSUcgaXMgc3RpbGwgbm90IGEgZnVsbCBDIHBhcnNlciwgaXRzIGFiaWxpdHkKICAgICAgICAgICB0byBoYW5kbGUgY29tcGxleCBkYXRhdHlwZXMgaW5jbHVkaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBwb2ludGVycyB0byBhcnJheXMgaGFzIGJlZW4gdmFzdGx5IGltcHJvdmVkLiAgCgo4LzAzLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogRGlzdHJpYnV0aW9uIGZpeGVzOiBhdXRvY29uZiBubyBsb25nZXIgbmVlZGVkIHRvIGluc3RhbGwgU1dJRy4KCjgvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgdHdvIHVuZG9jdW1lbnRlZCBwYXJzaW5nIGZlYXR1cmVzLiAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICBzdXBwb3J0cyBvdXQtb2YtY2xhc3Mgc3RhdGljIGZ1bmN0aW9uIG9yIHZhcmlhYmxlCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RhdGljIGludCBGb286OmJhcjsKCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIG1heSByZXR1cm4gaWYgdGhlcmUgaXMgc3VmZmljaWVudCBkZW1hbmQuIAogICAgICAgICAgIEhvd2V2ZXIsIHNpbmNlIFNXSUcgaXMgbW9zdCBvZnRlbiB1c2VkIHdpdGggaGVhZGVyIGZpbGVzLAogICAgICAgICAgIGl0IGlzIG1vcmUgbGlrZWx5IGZvciB0aGVzZSBkZWZpbml0aW9ucyB0byBiZSBpbmNsdWRlZAogICAgICAgICAgIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogQ2xlYW51cCBvZiB0aGUgR0lGUGxvdCBleGFtcGxlcy4gVXBncmFkZWQgSmF2YSBHSUZQbG90IGV4YW1wbGUuCgo4LzAxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gRWZmaWNpZW5jeSBjaGFuZ2VzOiBfY1B0ciB1c2VkIHdoZXJlIHBvc3NpYmxlIHJhdGhlciB0aGFuCgkgICAgIGdldENQdHIoKS4gQnVnIGZpeGVzIGZvciBpbmhlcml0YW5jZSAtIGRlcml2ZWQgY2xhc3Mgc29tZXRpbWVzCgkgICAgIGRpZG4ndCBkZWxldGUgdGhlIGMgbWVtb3J5IHdoZW4gX2RlbGV0ZSgpIHdhcyBjYWxsZWQuCgkgICAqIFtKYXZhXSBBYnN0cmFjdCBjKysgY2xhc3NlcyBhcmUgd3JhcHBlZCB3aXRoIGEgamF2YSBhYnN0cmFjdCBzaGFkb3cKCSAgICAgY2xhc3MuIEFsc28gYSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gaXMgbWFwcGVkIHdpdGggYW4gYWJzdHJhY3QgbWV0aG9kLgoJICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZmlsZSBoYXMgYWx3YXlzIGJlZW4gPG1vZHVsZT5fd3JhcC5jLiBJdCBpcyBub3cKCSAgICAgPG1vZHVsZT5fd3JhcC5jeHggaWYgdGhlIC1jKysgY29tbWFuZGxpbmUgb3B0aW9uIGlzIHBhc3NlZCB0byBzd2lnLgoJICAgICBUaGlzIGhhcyBiZWVuIGRvbmUgYXMgb3RoZXJ3aXNlIGMrKyBjb2RlIHdvdWxkIGFwcGVhciBpbiBhIGMgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogCgo3LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWNvbnN0YW50IGRpcmVjdGl2ZSB0byBiZSBtb3JlIEMtbGlrZSBpbiBzeW50YXguCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBub3c6CgogICAgICAgICAgICAgICAgJWNvbnN0YW50IE5BTUUgPSBWQUxVRTsKICAgICAgICAgICAgICAgICVjb25zdGFudCBUWVBFIE5BTUUgPSBWQUxVRTsKIAogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVjb25zdGFudCBGb28gKkJhciA9ICZTcGFtOwoKICAgICAgICAgICBBIG1vcmUgc3VidGxlIGNhc2UgaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gYmxhaDsKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBNb2R1bGVzIHRoYXQgd2VyZSB1c2luZwogICAgICAgICAgIHRoZSAlY29uc3RhbnQgZGlyZWN0aXZlIGRpcmVjdGx5IHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZC4KICAgICAgCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgb2JzY3VyZSBhbmQgdW5kb2N1bWVudGVkIGZvcm0gb2YgdGhlICVpbmxpbmUgZGlyZWN0aXZlOgoKICAgICAgICAgICAgICAgJWlubGluZSBpbnQgYmxhaChpbnQgYSwgaW50IGIpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIAogICAgICAgICAgIChub3RlOiB0aGlzIGZlYXR1cmUgd2FzIG5ldmVyIGRvY3VtZW50ZWQgYW5kIGlzIHdpdGhkcmF3bikKCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gZXhwbGljaXRseSBkZWNsYXJlZAogICAgICAgICAgIHJldHVybiB0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBmb28oaW50KTsKCiAgICAgICAgICAgSW4gQywgc3VjaCBmdW5jdGlvbnMgd2VyZSBpbXBsaWNpdGx5IGFzc3VtZWQgdG8gcmV0dXJuIGFuICdpbnQnLgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyBpbGxlZ2FsLiAgRWl0aGVyIHdheSwgaXQncyBjb25zaWRlcmVkIGJhZAogICAgICAgICAgIHN0eWxlLiAgUmVtb3Zpbmcgc3VwcG9ydCBmb3IgdGhpcyBpbiBTV0lHIHdpbGwgc2ltcGxpZnkKICAgICAgICAgICBjZXJ0YWluIGlzc3VlcyBpbiBwYXJzaW5nLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8zMC8yMDAxOiBta29lcHBlCgkgICAqIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rLiAgVGhlIFNvdXJjZS9ET0ggZGlyZWN0b3J5CgkgICAgIGFuZCBtb3N0IG9mIHRoZSBTb3VyY2UvU3dpZyBkaXJlY3RvcnkgaXMgdXAtdG8tZGF0ZSBub3cuCgkgICAqIFtHdWlsZV0gJXNjaGVtZSBpcyBub3cgYSBtYWNybyBmb3IgJWluc2VydCgic2NoZW1lIikuICAKCSAgICAgTmV3IHN5bnRheDogICVzY2hlbWUgIkZJTEVOQU1FIjsgCgkgICAgIE5ldyBzeW50YXg6ICAlc2NoZW1lICV7IFNDSEVNRS1DT0RFICV9CgkgICAgIE5ldyBtYWNyb3MgJW11bHRpcGxlX3ZhbHVlcywgJXZhbHVlc19hc19saXN0LAoJICAgICAldmFsdWVzX2FzX3ZlY3Rvci4gCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgaGF2ZSBiZWVuIHR1cm5lZCBpbnRvIFNXSUcgcHJhZ21hcy4KICAgICAgICAgICAlcHJhZ21hKHN3aWcpIHJlYWRvbmx5IGFuZCAlcHJhZ21hKHN3aWcpIHJlYWR3cml0ZS4gIE1hY3JvcwogICAgICAgICAgIGFyZSB1c2VkIHRvIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNaW5vciBjaGFuZ2VzIHRvICVwcmFnbWEgZGlyZWN0aXZlLiAgJXByYWdtYSBtdXN0IGFsd2F5cwogICAgICAgICAgIGJlIGRpcmVjdGVkIHRvIGEgc3BlY2lmaWMgbGFuZ3VhZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXByYWdtYShzd2lnKSBtYWtlX2RlZmF1bHQ7CiAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJibGFoLmkiOwoKICAgICAgICAgICBBbHNvIGV4dGVuZGVkIHRoZSBwcmFnbWEgZGlyZWN0aXZlIHRvIGFsbG93IGNvZGUgYmxvY2tzCiAKICAgICAgICAgICAgICAlcHJhZ21hKGZvbykgY29kZSA9ICV7CiAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdGhlIHdheSAnY29uc3QnIHZhcmlhYmxlcyBhcmUgd3JhcHBlZC4gIEluIAogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGEgJ2NvbnN0JyB2YXJpYWJsZSB3YXMKICAgICAgICAgICB3cmFwcGVkIGFzIGEgY29uc3RhbnQuICAgTm93LCAnY29uc3QnIHZhcmlhYmxlcyBhcmUKICAgICAgICAgICB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMuICBUaGVyZSBhcmUgc2V2ZXJhbAogICAgICAgICAgIHJlYXNvbnMgZm9yIG1ha2luZyB0aGlzIGNoYW5nZSwgbW9zdGx5IHBlcnRhaW5pbmcgdG8KICAgICAgICAgICBzdWJ0bGUgZGV0YWlscyBvZiBob3cgJ2NvbnN0JyBhY3R1YWxseSB3b3Jrcy4gCgogICAgICAgICAgIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBvbGQgaW50ZXJmYWNlcyB0aGF0IHVzZWQgJ2NvbnN0JwogICAgICAgICAgIHRvIGNyZWF0ZSBjb25zdGFudHMuICAgQXMgYSByZXBsYWNlbWVudCwgY29uc2lkZXIgdXNpbmcgdGhpczoKCiAgICAgICAgICAgY29uc3QgaW50IGEgPSA0OyAgID09PT4gICAlY29uc3RhbnQgaW50IGEgPSA0OwogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVvcmdhbml6YXRpb24gYW5kIHNpbXBsaWZpY2F0aW9uIG9mIHR5cGUgcGFyc2luZy4KICAgICAgICAgICBUeXBlcyB3aXRoICdjb25zdCcgc2hvdWxkIHdvcmsgY29ycmVjdGx5IG5vdy4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vc3Qgc3dpZyBkaXJlY3RpdmVzIHJlbGF0ZWQgdG8gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCiAgICAgICAgICAgYXJlIG5vdyBkZXByZWNhdGVkLgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciBPYmplY3RpdmUtQyBpbiBvcmRlciB0byBzaW1wbGlmeQogICAgICAgICAgIHBhcnNlciByZWNvbnN0cnVjdGlvbi4gIFdpbGwgcmV0dXJuIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQKICAgICAgICAgICBkZW1hbmQuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDb2RlIGluY2x1c2lvbiBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgcGFyc2VyLiAgQSBjb21tb24KICAgICAgICAgICBkaXJlY3RpdmUgJWluc2VydCBpcyBub3cgdXNlZCBmb3IgZXZlcnl0aGluZy4gIFRoaXMKICAgICAgICAgICBpbnNlcnRzIGEgZmlsZSBpbnRvIHRoZSBvdXRwdXQ6CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcikgImZvby5zd2ciCgogICAgICAgICAgIFRoaXMgaW5zZXJ0cyBzb21lIGlubGluZSBjb2RlIGludG8gdGhlIG91dHB1dAoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXIpICV7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLiAKICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhlcmUgYXJlIGZpdmUgcHJlZGVmaW5lZCB0YXJnZXRzIGZvciB0aGUgaW5zZXJ0IGRpcmVjdGl2ZToKCiAgICAgICAgICAgICAgICJoZWFkZXIiICAgIC0gSGVhZGVyIHNlY3Rpb24gb2Ygd3JhcHBlciBmaWxlCiAgICAgICAgICAgICAgICJydW50aW1lIiAgIC0gUnVudGltZSBzZWN0aW9uIG9mIHdyYXBwZXIgZmlsZQogICAgICAgICAgICAgICAid3JhcHBlciIgICAtIFdyYXBwZXIgc2VjdGlvbgogICAgICAgICAgICAgICAiaW5pdCIgICAgICAtIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICJudWxsIiAgICAgIC0gTm90aGluZy4gRGlzY2FyZC4KCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGFyZSBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBhcmUKICAgICAgICAgICBub3cgZGVmaW5lZCBpbiB0ZXJtcyBvZiBtYWNyb3M6CgogICAgICAgICAgICAgICAleyAuLi4gJX0gICAgICAgICAgIC0+ICVpbnNlcnQoaGVhZGVyKSAgJXsgLi4uICV9CiAgICAgICAgICAgICAgICVpbml0ICV7IC4uLiAlfSAgICAgLT4gJWluc2VydChpbml0KSAgICAleyAuLi4gJX0KICAgICAgICAgICAgICAgJXdyYXBwZXIgJXsgLi4uICV9ICAtPiAlaW5zZXJ0KHdyYXBwZXIpICV7IC4uLiAlfQogICAgICAgICAgICAgICAlcnVudGltZSAleyAuLi4gJX0gIC0+ICVpbnNlcnQocnVudGltZSkgJXsgLi4uICV9CgogICAgICAgICAgIExhbmd1YWdlIG1vZHVsZXMgY2FuIGRlZmluZSBuZXcgbmFtZWQgdGFyZ2V0cyBieSB1c2luZyB0aGUKICAgICAgICAgICBDIEFQSSBmdW5jdGlvbiBTd2lnX3JlZ2lzdGVyX2ZpbGVieW5hbWUoKSAoc2VlIG1haW4uY3h4KS4KICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBleHBvc2UgYSBzaGFkb3cgY2xhc3MgZmlsZSwKICAgICAgICAgICB5b3UgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgU3dpZ19yZWdpc3Rlcl9maWxlYnluYW1lKCJzaGFkb3ciLCBmX3NoYWRvdyk7CgogICAgICAgICAgIFRoZW4gaW4gdGhlIGludGVyZmFjZSBmaWxlOgoKICAgICAgICAgICAgICAlaW5zZXJ0KHNoYWRvdykgJXsgLi4uICV9CgogICAgICAgICAgIE5vdGU6IHRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IGFueSBvbGQgaW50ZXJmYWNlcywgYnV0CiAgICAgICAgICAgZG9lcyBvcGVuIHVwIG5ldyBwb3NzaWJpbGl0aWVzIGZvciBlbmhhbmNlbWVudHMuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhbHdheXMgaW5jbHVkZXMgYSBzdGFuZGFyZCBsaWJyYXJ5IGZpbGUgJ3N3aWcuc3dnJy4KICAgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhIGxhcmdlIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucwogICAgICAgICAgIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiB2YXJpb3VzIFNXSUcgZGlyZWN0aXZlcy4KICAgICAgICAgICBQcmV2aW91c2x5LCBhbGwgU1dJRyBkaXJlY3RpdmVzIHdlcmUgaGFuZGxlZCBhcyBzcGVjaWFsCiAgICAgICAgICAgY2FzZXMgaW4gdGhlIHBhcnNlci4gIFRoaXMgbWFkZSB0aGUgcGFyc2VyIGEgbGFyZ2UgCiAgICAgICAgICAgYmxvYXRlZCBtZXNzLiAgTm93LCB0aGUgcGFyc2VyIGlzIHN0cmlwcGVkIGRvd24gdG8gYSBmZXcKICAgICAgICAgICBzaW1wbGUgZGlyZWN0aXZlcyBhbmQgbWFjcm9zIGFyZSB1c2VkIHRvIGhhbmRsZSBldmVyeXRoaW5nIGVsc2UuCgo3LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBGaXhlcyBmb3IgU291cmNlZm9yZ2UgYnVnICM0NDQ3NDggLSBuZXcgdGVzdGNhc2UgY3BwX3N0YXRpYzoKCSAgICAgW1RDTF0gQ2xhc3Mgd2l0aCBqdXN0IHN0YXRpYyBtZW1iZXIgdmFyaWFibGUvZnVuY3Rpb24gZml4CgkgICAgIFtKYXZhXSBGaXhlZCBzdGF0aWMgdmFyaWFibGVzIHN1cHBvcnQKCSAgICAgW1J1YnldIFN0YXRpYyB2YXJpYWJsZXMgd29ya2Fyb3VuZCByZW1vdmVkCgo3LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogc3R5cGUuYyAoU3dpZ1R5cGVfZGVmYXVsdCk6IFN0cmlwIHF1YWxpZmllcnMgZmlyc3QuIFRoZQoJICAgICBkZWZhdWx0IHR5cGUgb2YgImludCAqIGNvbnN0IiBpcyBub3cgIlNXSUdQT0lOVEVSICoiLgoJICAgKiBtYWluLmN4eDogRGVmaW5lICJfX2NwbHVzcGx1cyIgaW4gU1dJRydzIHByZXByb2Nlc3NvciBpZgoJICAgICBpbiBDKysgbW9kZS4KCSAgICogW0d1aWxlXTogQWRkZWQgc29tZSBzdXBwb3J0IGZvciBhcnJheXMgYW5kIEMrKwoJICAgICByZWZlcmVuY2VzLCBmaXhpbmcgdGhlICJjb25zdGFudF9wb2ludGVycyIgdGVzdCBjYXNlLgoJICAgKiBNb3ZlZCBtb3N0IHRlc3RzIGZyb20gdGhlIG9sZCBHdWlsZS1zcGVjaWZpYyB0ZXN0LXN1aXRlCgkgICAgIHRvIHRoZSBuZXcgdGVzdC1zdWl0ZS4gIEFsc28gbW92ZWQgcGVybDUvcG9pbnRlci1jeHgKCSAgICAgZXhhbXBsZSB0aGVyZS4KCjcvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFRlc3Qtc3VpdGUgYWRkZWQuCgkgICAqIEluaXRpYWwgdGVzdGNhc2VzOiBjb25zdGFudF9wb2ludGVycyBjcHBfZW51bSBkZWZpbmVzCgkgICAgIHNpemVvZl9wb2ludGVycyB1bmlvbnMgdmlydHVhbF9kZXN0cnVjdG9yCgkgICAqIE1ha2UgY2xlYW4gaW1wcm92ZW1lbnRzLgoKNy8yNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIFVuZGVyc2NvcmVzIGluIHRoZSBwYWNrYWdlIG5hbWUgYW5kL29yIG1vZHVsZSBuYW1lCgkgICBubyBsb25nZXIgZ2l2ZSBsaW5raW5nIHByb2JsZW1zLgoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogTW9yZSBwYXJzZXIgYnVnIGZpeGVzIGZvciBjb25zdGFudCBwb2ludGVycwoKNy8xOS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV0gQWVzdGhldGljIGltcHJvdmVtZW50IGluIHZhcmlhYmxlIHdyYXBwZXJzLgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBGaXhlZCBjb3JlLWR1bXAgcHJvYmxlbSBpbiBwb2ludGVyIGxpYnJhcnkgd2hlbiAKICAgICAgICAgICAgIGZyZWVpbmcgY2hhcmFjdGVyIGFycmF5cy4KICAgICAgICAgICAgIFNGIEJ1ZyBbICM0MTU4MzcgXSBwb2ludGVyIGxpYiBjb3JlIGR1bXAKCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgZGVzdHJ1Y3RvcnMgYW5kIHNoYWRvdwogICAgICAgICAgICAgY2xhc3Nlcy4gIFNGIGJ1ZyAjMjIxMTI4LgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBUbyBwcm92aWRlIGJldHRlciBsaW5lLW51bWJlciB0cmFja2luZyBpbiBpbnRlcmZhY2VzCiAgICAgICAgICAgICB3aXRoIGxvdHMgb2YgbWFjcm9zLCBzcGVjaWFsIGxvY2F0b3IgY29tbWVudHMgYXJlCiAgICAgICAgICAgICBub3cgZ2VuZXJhdGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvKkBmb28uaSw0MixCTEFIQCovZXhwYW5kZWQgbWFjcm8vKkBAKi8KCiAgICAgICAgICAgICBUaGUgZmlyc3QgLypALi4uQCovIHNlcXVlbmNlIHNldHMgdGhlIGNvbnRleHQKICAgICAgICAgICAgIHRvIHBvaW50IHRvIHRoZSBtYWNybyBjb2RlLiAgVGhlIC8qQEAqLyBjb21tZW50CiAgICAgICAgICAgICB0ZXJtaW5hdGVzIHRoZSBjb250ZXh0LiAgVGhlIFNXSUcgcGFyc2VyIHNob3VsZAogICAgICAgICAgICAgaWdub3JlIGFsbCBvZiB0aGUgbG9jYXRvciBjb21tZW50cyBhcyBzaG91bGQKICAgICAgICAgICAgIHRoZSBDIGNvbXBpbGVyIChzaG91bGQgc3VjaCBjb21tZW50cyBlbmQgdXAKICAgICAgICAgICAgIGluIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUpLgoKNy8xOC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IGhhbmRsZXMgc2V2ZXJlbHkgY29uc3RpZmllZCB0eXBlcyBpbgoJICAgdHlwZW1hcHMuICBUaGlzIGludHJvZHVjZWQgYSBuZXcgc2hpZnQvcmVkdWNlIGNvbmZsaWN0LCBidXQKCSAgIG9ubHkgd2l0aCBhIGhldXJpc3RpYyBmdW5jdGlvbi1wb2ludGVyIGNhdGNoLWFsbCBydWxlLiAgCgkgICAqIFtHdWlsZV06IEFkZGVkIHR5cGVtYXBzIGZvciBzZXZlcmVseSBjb25zdGlmaWVkIHR5cGVzLiAKCSAgICogRml4ZWQgdGhlICJ0ZW1wbGF0ZS13aGl0ZXNwYWNlIiBwcm9ibGVtIGJ5IGNhbm9uaWNhbGl6aW5nCgkgICAgIHdoaXRlc3BhY2UsIGVzcGVjaWFsbHkgYXJvdW5kIGFuZ2xlIGJyYWNrZXRzIGFuZCBjb21tYXMuIAoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IEEgU2NoZW1lIGZpbGUgaXMgZW1pdHRlZCBpZiB0aGUgLXNjbXN0dWIgRklMRS5TQ00KCSAgIGNvbW1hbmQtbGluZSBvcHRpb24gaXMgdXNlZC4gIFRoZSAlc2NoZW1lIGRpcmVjdGl2ZQoJICAgKGltcGxlbWVudGVkIGFzIGEgbWFjcm8gZm9yIGEgcHJhZ21hKSBhbGxvd3MgdG8gaW5zZXJ0CgkgICBhcmJpdHJhcnkgY29kZSBoZXJlLiAgSW4gInNpbXBsZSIgYW5kICJwYXNzaXZlIiBsaW5rYWdlLAoJICAgdGhlIGZpbGUgZ2V0cyBmaWxsZWQgd2l0aCBkZWZpbmUtbW9kdWxlIGFuZCBleHBvcnQKCSAgIGRlY2xhcmF0aW9ucy4KCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFBhcnNlciBidWcgZml4IHRvIHN1cHBvcnQgY29uc3RhbnQgcG9pbnRlcnMsIGVnIGludCogY29uc3QgcHRyLgoJICAgRml4ZWQgZXZlcnl3aGVyZSAtIHZhcmlhYmxlcywgcGFyYW1ldGVycywgcmV0dXJuIHR5cGVzIGV0Yy4gTm90ZSB0aGF0CgkgICB3aGVuIHdyYXBwaW5nIGEgY29uc3RhbnQgcG9pbnRlciB2YXJpYWJsZSBvbmx5IHRoZSBnZXR0ZXIgaXMgZ2VuZXJhdGVkLgoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIEZpeGVkIFNGIGJ1ZyAjNDQxNDcwICgjZGVmaW5lIFggIi8vIiB3b3VsZCBub3QgYmUgcGFyc2VkLAoJICAgICBzZWUgdGVzdC1zdWl0ZSBlbnRyeSAicHJlcHJvYy0xIiksIHJlcG9ydGVkIGJ5IFQuIFcuIEJ1cnRvbgoJICAgICA8dHdidXJ0b25AdXNlcnMuc2YubmV0Pi4KCSAgICogQ2hhbmdlZCB0aGUgdHlwZSBvZiBjaGFyYWN0ZXIgY29uc3RhbnRzIHRvICJjaGFyIiwgcmF0aGVyCgkgICAgIHRoYW4gImNoYXIgKiIuICBDaGFuZ2VkIHRoZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMKCSAgICAgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgZXhjZXB0IGZvciB0aGUgR3VpbGUgbW9kdWxlLAoJICAgICB3aGVyZSBpdCBpcyBkZXNpcmVkIHRvIG1ha2UgdGhlbSBTY2hlbWUgY2hhcmFjdGVycy4gIFRoaXMKCSAgICAgZml4ZXMgU0YgYnVnICMyMzE0MDksIHRlc3Qtc3VpdGUgZW50cnkgImNoYXItY29uc3RhbnQiLgoJICAgKiBBcHBsaWVkIHBhdGNoIGZvciBET0gvRG9oL21lbW9yeS5jIGJ5IExlcyBTY2hhZmZlcgoJICAgICA8c2NoYWZmZXJAb3B0b25saW5lLm5ldD4gKGF2b2lkIHJlcXVpcmVkIHNpZGUgZWZmZWN0cyBpbgoJICAgICBhc3NlcnQpLiAKCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyIGZvciB2aXJ0dWFsIGRlc3RydWN0b3Igd2l0aCB2b2lkIGFzIHBhcmFtZXRlcgoJICAgKiBCdWcgZml4IGluIHBhcnNlciAjZGVmaW5lcyBlbWJlZGRlZCB3aXRoaW4gY2xhc3Nlcy9zdHJ1Y3RzL3VuaW9ucwoJICAgQ29uc2VxdWVudGx5ICVjb25zdGFudCBjYW4gbm93IGFsc28gYmUgcGxhY2VkIHdpdGhpbiBhIHN0cnVjdC9jbGFzcy91bmlvbi4KCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgdG8gYWxsb3cgc2l6ZW9mKCpJX2FtX2FfcG9pbnRlcikgd2l0aGluIGEgI2RlZmluZQoKNy8xNi8yMDAxOiBta29lcHBlCgkgICAqIEFkZGVkIGNoYW5nZXMgZm9yIHRoZSBNYWNpbnRvc2ggY29udHJpYnV0ZWQgYnkgTHVpZ2kKCSAgIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4gCgkgICAqIFNvbWUgImNvbnN0IiBmaXhlcyBpbiB0aGUgY29kZS4KCSAgICogW0d1aWxlXTogTWFkZSB0aGUgY29uc3RhbnQtd3JhcHBlciBmdW5jdGlvbnMgbXVjaCBzaG9ydGVyLgoKNy8xMy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IFNvbWUgImNvbnN0IiBmaXhlcyBmb3IgR3VpbGUgdmVyc2lvbiAxLjMuNC4KCSAgICogSGFuZGxlIGFub255bW91cyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgc3RhdGljCgkgICAgIGFycmF5IG1lbWJlcnMgb2YgY2xhc3Nlcy4gIEJvdGggYnVncyByZXBvcnRlZCBieSBBbm5hbGlzYSBUZXJyYWNpbmEKCSAgICAgPGFubmFsaXNhLnRlcnJhY2luYUBkYXRhbWF0Lml0Pjsgc2VlIHRoZSBmaWxlcwoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL3N0YXRpYy1hcnJheS1tZW1iZXIuaSBhbmQKCSAgICAgYW5vbnltb3VzLWFyZy5pLgoKVmVyc2lvbiAxLjMuNiAgKEp1bHkgOSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjcvMDkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IEZPUkVHUk9VTkQgYW5kIEJBQ0tHUk9VTkQgZGVmaW5pdGlvbiBtaXNzaW5nIAoJICAgYWZ0ZXIgVFJBTlNQQVJFTlQgI2RlZmluZSBmaXggaW4gR0lGUGxvdAoKNy8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIHZlcnNpb24gbnVtYmVycyBzbyB0aGF0IHRoZSByZWxlYXNlIGlzIGtub3duCiAgICAgICAgICAgYXMgMS4zLjYuICBBbGwgZnV0dXJlIHJlbGVhc2VzIHNob3VsZCBoYXZlIGEgc2ltaWxhcgogICAgICAgICAgIHZlcnNpb24gZm9ybWF0LgoKNy8wMi8yMDAxOiBta29lcHBlCgkgICAqIFtQeXRob25dOiBQcmV2ZW50IHRoZSBwcm9ibGVtIG9mIHNlbGYudGhpc293biBub3QgYmVpbmcKCSAgIGRlZmluZWQgaWYgdGhlIEMrKyBjbGFzcyBjb25zdHJ1Y3RvciByYWlzZWQgYW4gZXhjZXB0aW9uLgoJICAgVGhhbmtzIHRvIEx1aWdpIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4KCjYvMjkvMjAwMTogbWtvZXBwZQoJICAgKiBNb3JlIHBvcnRhYmlsaXR5IGZpeGVzOyBmaXhlZCAiZ2NjIC1XYWxsIiB3YXJuaW5ncy4KCjYvMjkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IFRSQU5TUEFSRU5UICNkZWZpbmUgbXVsdGlwbGUgdGltZXMgb24gU29sYXJpcyAKCSAgIChjbGFzaGVzIHdpdGggc3RyZWFtLmgpLgoJICAgKiBNdWx0aXBsZSBkZWZpbml0aW9uIGJ1ZyBmaXggZm9yIHNoYWRvdyBjbGFzc2VzLiBUaGUgcGVybCBhbmQgcHl0aG9uIAoJICAgbW9kdWxlcyBoYWQgd29ya2Fyb3VuZHMgd2hpY2ggaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZml4ZXMgaW4gCgkgICB0aGUgY29yZS4gTWFueSBvZiB0aGUgTGFuZ3VhZ2U6OmNwcF94eHh4IGZ1bmN0aW9ucyBub3cgc2V0IGEgCgkgICBmbGFnIHdoaWNoIHRoZSBkZXJpdmVkIGNsYXNzZXMgY2FuIGFjY2VzcyB0aHJvdWdoIAoJICAgaXNfbXVsdGlwbGVfZGVmaW5pdGlvbigpIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCBjb2RlIHNob3VsZCBiZSAKCSAgIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGJlbG93IHdvdWxkIGhhdmUgcHJvZHVjZWQgdmFyeWluZyBkZWdyZWVzIAoJICAgb2YgaW5jb3JyZWN0IHNoYWRvdyBjbGFzcyBjb2RlIGZvciB0aGUgdmFyaW91cyBtb2R1bGVzOgoJICAgY2xhc3MgVGVzdENsYXNzCgkgICB7CgkgICBwdWJsaWM6CgkgICAgIFRlc3RDbGFzcygpIHt9CgkgICAgIFRlc3RDbGFzcyhpbnQgYSkge30KCSAgICAgflRlc3RDbGFzcygpIHt9CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KHNob3J0IGspIHt9CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KGludCBuKSB7fQoJICAgICBzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYygpIHt9CgkgICAgIHN0YXRpYyB2b2lkIHN0YXRpY19mdW5jKGludCBhKSB7fQoJICAgfTsKCSAgIHZvaWQgZGVsZXRlX1Rlc3RDbGFzcyhpbnQgYSk7Cgo2LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogW1BlcmxdIEFub3RoZXIgY29uc3QtcmVsYXRlZCBwb3J0YWJpbGl0eSBmaXguCgo2LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gQWRkZWQgaW4gY3BwX3ByYWdtYSgpIHN1cHBvcnQgd2l0aCBhIGhvc3Qgb2YgbmV3IHByYWdtYXMgLSBzZWUgCgkgICBqc3dpZy5odG1sLiBUaGVzZSBhcmUgZGVzaWduZWQgZm9yIGJldHRlciBtaXhpbmcgb2YgSmF2YSBhbmQgYysrLiBJdCAKCSAgIGVuYWJsZXMgdGhlIHVzZXIgdG8gc3BlY2lmeSBwdXJlIEphdmEgY2xhc3NlcyBhcyBiYXNlcyBhbmQvb3IgaW50ZXJmYWNlcyAKCSAgIGZvciB0aGUgd3JhcHBlZCBjL2MrKy4KCSAgICogW0phdmFdIE9sZCBwcmFnbWFzIHJlbmFtZWQuIFdhcm5pbmcgZ2l2ZW4gZm9yIHRoZSBtb21lbnQgaWYgdXNlZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjYvMjUvMjAwMTogbWtvZXBwZQoJICAgKiBJbmNvcnBvcmF0ZWQgbW9yZSBidWlsZCBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IFd5c3MgQ2xlbWVucwoJICAgPFdZU0BoZWxibGluZy5jaD4gZm9yIHN3aWcvcnVieSBvbiBjeWd3aW4uCgo2LzIwLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBNYWtlZmlsZSBtb2RzIHNvIHRoYXQgJ21ha2UgY2hlY2snIHVzZXMgdGhlIHN3aWcgb3B0aW9ucyBpbiB0aGUgbWFrZWZpbGVzCgkgICAqIFtKYXZhXSBSZW1vdmVkIEdlbmVyYXRpbmcgd3JhcHBlcnMgbWVzc2FnZQoJICAgKiBbSmF2YV0gTlVMTCBwb2ludGVyIGJ1ZyBmaXgKCSAgICogW0phdmFdIEJ1ZyBmaXggZm9yIEthZmZlIEpWTQoKNi8yMC8yMDAxOiBta29lcHBlCgkgICAqIFNXSUdfVHlwZVF1ZXJ5IGZyb20gY29tbW9uLnN3ZyBub3cgcmV0dXJucyBhCgkgICBzd2lnX3R5cGVfaW5mbyogcmF0aGVyIHRoYW4gYSB2b2lkKi4gIFRoaXMgZml4ZXMgYSBwcm9ibGVtCgkgICB3aGVuIHVzaW5nIHBvaW50ZXIuaSBhbmQgQysrLCBhcyBpbGx1c3RyYXRlZCBieSB0aGUgbmV3CgkgICB0ZXN0LXN1aXRlIGV4YW1wbGUgcGVybDUvcG9pbnRlci1jeHguCgkgICAqIFBvcnRhYmlsaXR5IGZpeGVzIChjb25zdCBjaGFyICopLiAKCSAgICogSW5jb3Jwb3JhdGVkIGJ1aWxkIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgV3lzcyBDbGVtZW5zCgkgICA8V1lTQGhlbGJsaW5nLmNoPiwgd2hpY2ggbWFrZSBzd2lnIHJ1bm5hYmxlIG9uIGN5Z3dpbi4KCjYvMTkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBCdWcgZml4IGZvciBTRiBidWcgIzIxMTE0NC4gVGhpcyBmaXggaXMgYSB3b3JrYXJvdW5kIAoJICAgICB1bnRpbCBmaXhlZCBpbiB0aGUgY29yZS4KCjYvMTkvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBQb3J0YWJpbGl0eSBmaXhlcyBmb3IgdXNlIHdpdGggdGhlIFN1biBGb3J0ZQoJICAgY29tcGlsZXJzLiAKCSAgICogW1RjbF06IFBvcnRhYmlsaXR5IGZpeCAoY29uc3QgY2hhciAqKS4KCSAgICogW1RjbF06IENvbmZpZ3VyZSBub3cgZmlyc3QgdHJpZXMgdG8gZmluZCBhIHRjbENvbmZpZy5zaAoJICAgZmlsZSBpbiBvcmRlciB0byBmaW5kIHRoZSBUY2wgaW5jbHVkZSBkaXJlY3RvcnksIGxpYnJhcnkKCSAgIGxvY2F0aW9uIGFuZCBsaWJyYXJ5IG5hbWUuCgkgICAqIFtQeXRob25dOiBBZGRlZCBhIGZldyBwb3NzaWJsZSBsaWJyYXJ5IGxvY2F0aW9ucy4KCjYvMTgvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBEb24ndCBjYWxsIHNjbV9jX2V4cG9ydCBpZiBub3RoaW5nIGlzIHRvIGJlCgkgICAgIGV4cG9ydGVkLiAgRG9uJ3Qgd2FybiBvbiAlbW9kdWxlIGlmIG1vZHVsZSBoYXMgYmVlbiBzZXQKCSAgICAgYWxyZWFkeSAodGhpcyBmcmVxdWVudGx5IG9jY3VycyB3aGVuICVpbXBvcnQgaXMgdXNlZCkuCgo2LzE2LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogTmV3ICJwYXNzaXZlIiBsaW5rYWdlLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IKCSAgICAgbXVsdGktbW9kdWxlIGV4dGVuc2lvbnMgd2l0aG91dCBHdWlsZSBtb2R1bGUgbWFnaWMuCgo2LzE1LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogRml4ZWQgcHJpbnRpbmcgb2Ygc21vYnMgKHNwYWNlIGFuZCBhbmdsZSB3ZXJlCgkgICAgIG1pc3NpbmcpLiAKCSAgICogUHJvcGVybHkgZ2VuZXJhdGUgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYmFzZSBjbGFzc2VzCgkgICAgIGltcG9ydGVkIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiAgVGhhbmtzIHRvIE1hcmNlbG8KCSAgICAgTWF0dXMgPG1tYXR1c0BhY21zLmFyaXpvbmEuZWR1PiBmb3IgdGhlIHJlcG9ydCBhbmQgdGhlCgkgICAgIHBhdGNoOyB0aGlzIGNsb3NlcyBTRiBidWcgIzIzMTYxOTsgc2VlIGFsc28KCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9pbXBvcnQqLiAKCSAgICogW0d1aWxlXTogRml4IGNhc3RpbmcgYmV0d2VlbiBjbGFzcyBhbmQgYmFzZSBjbGFzczsgdGhlCgkgICAgIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gaGFkIGl0IHRoZSB3cm9uZyB3YXkgYXJvdW5kOyBzZWUKCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9jYXN0cy5pCgkgICAqIE1ha2UgdHlwZW1hcHMgZm9yIFNXSUdQT0lOVEVSICogd2l0aCBhcmcgbmFtZSB0YWtlCgkgICAgIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSB3aXRob3V0IGFyZyBuYW1lLCB0byBtYXRjaCBub3JtYWwKCSAgICAgdHlwZW1hcCBwcmVjZWRlbmNlIHJ1bGVzLgoJICAgKiBGaXhlZCB0aGUgcmFuZG9tLWxpbmUtbnVtYmVycyBwcm9ibGVtIHJlcG9ydGVkIGFzIFNGIGJ1ZwoJICAgICAjMjE3MzEwOyB0aGFua3MgdG8gTWljaGFlbCBTY2hhcmYgPHNjaGFyZkB1c2Vycy5zZi5uZXQ+LgoJICAgKiBbR3VpbGVdOiBIYW5kbGUgdGhlICVuYW1lIGFuZCAlcmVuYW1lIGRpcmVjdGl2ZXMuCgkgICAqIE5ldyBzeW50YXg6ICVuYW1lIGFuZCAlcmVuYW1lIG5vdyBvcHRpb25hbGx5IHRha2UgZG91YmxlCgkgICAgIHF1b3RlcyBhcm91bmQgdGhlIHNjcmlwdGluZyBuYW1lLiAgVGhpcyBpcyB0byBhbGxvdyBzY3JpcHRpbmcKCSAgICAgbmFtZXMgdGhhdCBhcmVuJ3QgdmFsaWQgQyBpZGVudGlmaWVycy4KCjYvMTQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hZGUgYSBtaW5vciBjaGFuZ2UgdG8gdGhlIHdheSBmaWxlcyBhcmUgbG9hZGVkIGluCiAgICAgICAgICAgb3JkZXIgdG8gZ2V0IGZpbGUvbGluZSBudW1iZXIgcmVwb3J0aW5nIGNvcnJlY3QgaW4KICAgICAgICAgICB0aGUgcHJlcHJvY2Vzc29yLgoKNi8xNC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIHRoZSAobm9uLXN0YW5kYXJkKSAibG9uZyBsb25nIgoJICAgICB0eXBlcy4gSXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyB0bwoJICAgICBwcm92aWRlIHR5cGVtYXBzIGlmIG5lZWRlZC4gUmVwb3J0ZWQgYnkgU2FtIFN0ZWluZ29sZCwgU0YKCSAgICAgYnVnICM0MjkxNzYuCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIGFyZ3VtZW50cyBsaWtlICJjb25zdCBpbnQgKgoJICAgICBjb25zdCBpIi4gVGhpcyBmaXhlcyBTRiBidWcgIzIxNTY0OS4KCSAgICogRml4ZWQgdGhlIEd1aWxlIHRlc3Qtc3VpdGUuCgo2LzEzLzIwMDE6IG1rb2VwcGUKCSAgIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rIGF0IHRhZwoJICAgIm1rb2VwcGUtbWVyZ2UtMSIuIFRoaXMgY292ZXJzIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKCnwgMDEvMTYvMDE6IHR0bgp8CSAgIFdyb3RlIHRhYmxlIG9mIGNvbnRlbnRzIGZvciBEb2MvZW5naW5lZXJpbmcuaHRtbC4gIEFkZGVkIHNlY3Rpb24KfAkgICBvbiBDVlMgdGFnZ2luZyBjb252ZW50aW9ucy4gIEFkZGVkIGNvcHlyaWdodCB0byBvdGhlciBkb2NzLgp8IDkvMjUvMDAgOiBiZWF6bGV5CnwgCSAgIE1vZGlmaWVkIHRoZSBwcmVwcm9jZXNzb3Igc28gdGhhdCBtYWNybyBuYW1lcyBjYW4gc3RhcnQgd2l0aCBhICclJy4KfCAJICAgVGhpcyBtYXkgYWxsb3cgbmV3IFNXSUcgImRpcmVjdGl2ZXMiIHRvIGJlIGRlZmluZWQgYXMgbWFjcm9zIGluc3RlYWQKfCAJICAgb2YgaGF2aW5nIHRvIGJlIGhhcmQtY29kZWQgaW50byB0aGUgcGFyc2VyLiAgCnwKfCAqKiogQWxzbyBhIHlldC10by1iZS1kb2N1bWVudGVkIHF1b3RpbmcgbWVjaGFuaXNtIHdpdGggYmFja3F1b3Rlcwp8ICoqKiBoYXMgYmVlbiBpbXBsZW1lbnRlZD8KCjYvMTMvMjAwMTogbWtvZXBwZQoJICogV2hlbiBjb25maWd1cmUgZG9lcyBub3QgZmluZCBhIGxhbmd1YWdlLCBkb24ndCB1c2UgZGVmYXVsdAoJICAgcGF0aHMgbGlrZSAvdXNyL2xvY2FsL2luY2x1ZGU7IHRoaXMgb25seSBjYXVzZXMgYnVpbGQKCSAgIHByb2JsZW1zLgoJICogTmV3IGRpcmVjdG9yeTogRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZSwgd2hlcmUgYSBmZXcKCSAgIGJ1Z3MgaW4gMS4zYTUgYXJlIGRlbW9uc3RyYXRlZC4gCgkgKiBIYW5kbGUgQysrIG1ldGhvZHMgdGhhdCBoYXZlIGJvdGggYSAiY29uc3QiIGFuZCBhICJ0aHJvdyIKCSAgIGRpcmVjdGl2ZSAoc2VlIEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUvY3BsdXNwbHVzLXRocm93LmkpOyAKCSAgIHRoYW5rcyB0byBTY290dCBCLiBEcnVtbW9uZHMgZm9yIHRoZSByZXBvcnQgYW5kIHRoZSBmaXguIAoJICogSGFuZGxlIEMrKyBwb2ludGVyLXJlZmVyZW5jZSBhcmd1bWVudHMgKGxpa2UgImludCAqJiBhcmciKSAKCSAgIChzZWUgRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZS9wb2ludGVyLXJlZmVyZW5jZS5pLAoJICAgcmVwb3J0ZWQgYXMgU0YgYnVnICM0MzIyMjQpLgoJICogW1J1YnldIEZpeGVkIHR5cG8gaW4gcnVieWRlYy5zd2c7IHRoYW5rcyB0byBMeWxlIEpvaG5zb24hCgkgKiBEb24ndCBzdG9wIHRlc3Rpbmcgd2hlbiBvbmUgdGVzdCBmYWlscy4KCSAqIFtHdWlsZSwgTXpTY2hlbWVdIERvbid0IHByaW50ICJHZW5lcmF0aW5nIHdyYXBwZXJzLi4uIi4KCjYvMTIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBWRUNUT1JMRU5JTlBVVCBhbmQgTElTVExFTklOUFVUIG5vdyBoYXZlIHNlcGFyYXRlCgkgICBsaXN0IGxlbmd0aCB2YXJpYWJsZXMuIFRZUEVNQVBfUE9JTlRFUl9JTlBVVF9PVVRQVVQKCSAgIGF0dGFjaGVzIGFyZ3VtZW50IGRvY3VtZW50YXRpb24gaW52b2x2aW5nIFNDTV9UWVBFIHRvIHRoZQoJICAgc3RhbmRhcmQgcG9pbnRlciB0eXBlbWFwcy4gSU5PVVQgaXMgbm93IGFuIGFsaWFzIGZvciBCT1RILgoKNi8xMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFNvbWUgSmF2YSBkb2N1bWVudGF0aW9uIGFkZGVkLgoJICAgW0phdmFdIEZpeGVkIGJ1Z3MgaW4gaW1wb3J0IHByYWdtYSBhbmQgc2hhZG93IHByYWdtYS4gCgo2LzEyLzIwMDE6IG1rb2VwcGUKCSAgIEZpeCBkZWNsYXJhdGlvbnMgb2YgU1dJR19kZWZpbmVfY2xhc3MKCSAgIChMaWIvcnVieS9ydWJ5ZGVjLnN3ZykgYW5kIFNXSUdfVHlwZVF1ZXJ5CgkgICAoTGliL2NvbW1vbi5zd2cpLiBUaGFua3MgdG8gTHlsZSBKb2huc29uCgkgICA8bGpvaG5zb25AcmVzZ2VuLmNvbT4gZm9yIHRoZSBwYXRjaGVzLgoKNi8xMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFVzZSBsb25nIGluc3RlYWQgb2Ygc2NtX2JpdHNfdDsgdGhpcyBtYWtlcyB0aGUKCSAgIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgY29tcGF0aWJsZSB3aXRoIEd1aWxlIDEuMy40CgkgICBhZ2Fpbi4gVGhhbmtzIHRvIE1hc2FraSBGdWt1c2hpbWEgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgoKNi8xMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFRoZSBnZW5lcmljIElOU1RBTEwgZmlsZSBmcm9tIGF1dG9jb25mIGFkZGVkLiBGZXcgY2hhbmdlcyB0byBSRUFETUUgZmlsZS4KCjYvMTEvMjAwMTogbWtvZXBwZQoJICAgRml4ZWQgdHlwbyBpbiBNYWtlZmlsZS5pbjsgdGhhbmtzIHRvIEdyZWcgVHJveGVsCgkgICA8Z2R0QGlyLmJibi5jb20+LiAKCjYvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBtYWtlIGNoZWNrIHdvcmtzIGFnYWluLiBFeGFtcGxlcy9HSUZQbG90IGNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkKCSAgIHRvcCBsZXZlbCBhdXRvY29uZiBub3cuCgo2LzA4LzIwMDE6IG1rb2VwcGUKCSAgIEFub3RoZXIgYnVpbGQgY2hhbmdlOiBUaGUgbmV3IHNjcmlwdCBhdXRvZ2VuLnNoIHJ1bnMKCSAgIGF1dG9jb25mIGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rvcmllcy4gIFRoZSB0b3AtbGV2ZWwKCSAgIGNvbmZpZ3VyZSBhbHNvIGNvbmZpZ3VyZXMgaW4gRXhhbXBsZXMvR0lGUGxvdC4KCjYvMDcvMjAwMTogbWtvZXBwZQoJICAgTWFkZSB0aGUgTWFrZWZpbGUgd29yayB3aXRoIG5vbi1HTlUgbWFrZSBhZ2Fpbi4KCjYvMDcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gQ2xhc3Mvc3RydWN0IG1lbWJlcnMgdGhhdCBhcmUgYXJyYXlzIG9mIHBvaW50ZXJzIHRvIGNsYXNzZXMvc3RydWN0cyAtCgkgICBTaGFkb3cgY2xhc3MncyBnZXQvc2V0IGFjY2Vzc29ycyBub3cgdXNlIEphdmEgY2xhc3NlcyBpbnN0ZWFkIG9mIGxvbmdzIChwb2ludGVycykuCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzZXMgd2lsbCBub3cgY2xlYW4gdXAgbWVtb3J5IGlmIGZ1bmN0aW9uIHJldHVybiB0eXBlIAoJICAgaXMgYSBjbGFzcy9zdHJ1Y3QuCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgc2FtZSBleGFtcGxlIGZyb20gb3RoZXIgbW9kdWxlcy4KCjYvMDYvMjAwMTogbWtvZXBwZQoJICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4IGFsbG93cyBmb3IKCSAgIGF0dGFjaGluZyBhIHN1ZmZpeCB0byB0aGUgc3dpZyBiaW5hcnkgYW5kIHRoZSBzd2lnIHJ1bnRpbWUKCSAgIGxpYnJhcmllcy4gIE1pbm9yIGNoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gICJzd2lnCgkgICAtc3dpZ2xpYiIgd29ya3MgYWdhaW4uICBJZiBpbnZva2VkIHdpdGggdGhlIG5ldyBvcHRpb24KCSAgICItbGRmbGFncyIsIFNXSUcgcHJpbnRzIGEgbGluZSBvZiBsaW5rZXIgZmxhZ3MgbmVlZGVkIHRvCgkgICBsaW5rIHdpdGggdGhlIHJ1bnRpbWUgbGlicmFyeSBvZiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UKCSAgIG1vZHVsZS4gCgo2LzA2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gZ3N3aWdfbGlzdF9wIGlzIGFuIGludCwgbm90IGEgU0NNLiAgVGhpcyB0eXBvCgkgICBjYXVzZWQgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gSW4gSU5QVVQgYW5kIEJPVEggdHlwZW1hcHMKCSAgIGdlbmVyYXRlZCBieSB0aGUgU0lNUExFX01BUCBtYWNybywgdXNlIHRoZSBTQ01fVE9fQwoJICAgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIEd1aWxlIHRvIEMgKHJhdGhlciB0aGFuIENfVE9fU0NNKS4KCSAgIFVzZSBzY21faW50cHJpbnQgdG8gcHJpbnQgcG9pbnRlcnMgKHJhdGhlciB0aGFuCgkgICBzcHJpbnRmKS4gQWxsb3cgdXNpbmcgIi1saW5rYWdlIiBpbnN0ZWFkIG9mICItTGlua2FnZSIuIAoKNi8wNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBNb2RzIGZvciB1c2luZyBpbmhlcml0ZWQgYysrIGNsYXNzZXMgZnJvbSBKYXZhCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIGNsYXNzIGJhc2VkIG9uIHRoZSBzYW1lIGV4YW1wbGUgZnJvbSBvdGhlciBtb2R1bGVzCgo2LzA1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIGRlc3RydWN0b3IgKF9kZWxldGUoKSkgd2FzIG5vdCBhd2FyZSBvZiAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBub3Qga25vdyBhYm91dCAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBleHRlbmQgZXZlbiB3aGVuIHRoZSBiYXNlY2xhc3Mgd2FzIG5vdCBrbm93biB0byBzd2lnCgkgICBbSmF2YV0gc29tZXRpbWVzIGVudW0tZGVjbGFyYXRpb25zIG9jY3VycmVkIGJlZm9yZSB0aGUgSmF2YSBjbGFzcyBkZWNsYXJhdGlvbgoJICAgW0phdmFdIHVucmVsYXRlZCBlbnVtIGluaXRpYWxpc2F0aW9ucyBubyBsb25nZXIgYXBwZWFyIGluIEphdmEgY2xhc3MKCSAgIFtKYXZhXSBpZiBtb2R1bGUgZW5kcyBpbiAnXycgY29ycmVjdCBKTkkgbmFtZXMgYXJlIG5vdyBwcm9kdWNlZAoKNi8wNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3MgbW9kcyAtIE1vZGlmaWVkIGNvbnN0cnVjdG9yIHJlcGxhY2VzCgkgICBuZXdJbnN0YW5jZSgpLiBfZGVsZXRlKCkgbm93IHRocmVhZCBzYWZlLiBnZXRDUHRyKCkgcmVwbGFjZXMKCSAgIF9zZWxmLiBfc2VsZkNsYXNzKCkgcmVtb3ZlZCBhcyBub3cgcmVkdW5kYW50LiAKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgkgICBbSmF2YV0gTm90IGFsbCBvdXRwdXQgamF2YSBmaWxlcyBoYWQgU1dJRyBiYW5uZXIuIE5ldyBiYW5uZXIuCgoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBmaW5hbGl6ZXJzIGFyZSBvdXRwdXQgYnkgZGVmYXVsdDogQ29tbWFuZAoJICAgbGluZSBvcHRpb24gLWZpbmFsaXplIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIHdpdGggLW5vZmluYWxpemUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQ2FzdCBTQ01fQ0FSKCkgdG8gc2NtX2JpdHNfdCBiZWZvcmUgc2hpZnRpbmcgaXQuCgkgICBUaGlzIGlzIHJlcXVpcmVkIGZvciBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gIAoKNi8gMS8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBjb25maWd1cmUgb3B0aW9uICItLXdpdGgtc3dpZ2xpYmRpciIuCgo1LzMxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gU3VwcG9ydCBtdWx0aXBsZSBwYXJhbGxlbCBsaXN0cyBvciB2ZWN0b3JzIGluCgkgICB0aGUgdHlwZW1hcHMgcHJvdmlkZWQgYnkgbGlzdC12ZWN0b3IuaS4gIE5ldyB0eXBlbWFwcyBmaWxlLAoJICAgcG9pbnRlci1pbi1vdXQuaS4gCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIEhUTUwgdXBkYXRlIGZvciBleGFtcGxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgQWRkZWQgc3ViZGlyZWN0b3J5IGZvcgoJICAgRGViaWFuIHBhY2thZ2UgY29udHJvbCBmaWxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBCdWlsZCBhIHJ1bnRpbWUgbGlicmFyeSwgbGlic3dpZ2d1aWxlLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbiAkKmRlc2NyaXB0b3IuICBVc2UgdGhlIHt9CgkgICBzeW50YXgsIHJhdGhlciB0aGFuIHRoZSAiIiBzeW50YXggZm9yIHRoZSBzdGFuZGFyZAoJICAgdHlwZW1hcHMsIGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHN0cmFuZ2UgbWFjcm8tZXhwYW5zaW9uCgkgICBiZWhhdmlvciBvZiB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBUaGlzIGludHJvZHVjZXMgc29tZQoJICAgZXh0cmEgYnJhY2VzLgoKNS8yNy8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSBwb2ludGVyIHR5cGVzIHdpdGggdHlwZW1hcHMsIHJhdGhlciB0aGFuCgkgICBoYXJkLWNvZGVkLiBOZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zICRkZXNjcmlwdG9yLAoJICAgJGJhc2VkZXNjcmlwdG9yOyBzZWUgZG9jdW1lbnRhdGlvbi4gU29tZSBjbGVhbi11cCBpbiB0aGUKCSAgIHZhcmlhYmxlL2NvbnN0YW50cyB3cmFwcGVyIGdlbmVyYXRvciBjb2RlLiAgTmV3IGNvbnZlbmllbmNlCgkgICBtYWNybyBTV0lHX0d1aWxlX011c3RHZXRQdHIsIHdoaWNoIGFsbG93cyBnZXR0aW5nIHBvaW50ZXJzCgkgICBmcm9tIHNtb2JzIGluIGEgZnVuY3Rpb25hbCBzdHlsZS4gIE5ldyB0eXBlbWFwIGZpbGUKCSAgICJsaXN0LXZlY3Rvci5pIiwgcHJvdmlkaW5nIG1hY3JvcyB0aGF0IGRlZmluZSB0eXBlbWFwcyBmb3IKCSAgIGNvbnZlcnRpbmcgYmV0d2VlbiBDIGFycmF5cyBhbmQgU2NoZW1lIGxpc3RzIGFuZCB2ZWN0b3JzLgoKNS8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTVEwgc3RyaW5nIG1vdmVkIGludG8gaXRzIG93biB0eXBlbWFwIGFzIGl0IGlzIGMrKyBjb2RlIGFuZCAKCSAgIGl0IGJyZWFrIGFueSBjIGNvZGUgdXNpbmcgdGhlIHR5cGVtYXBzLmkgZmlsZS4KCSAgIC0gRml4ZXMgZm9yIHdyYXBwZXJzIGFyb3VuZCBnbG9iYWwgdmFyaWFibGVzIC0gYXBwbGllcyB0byBwcmltaXRpdmUgCgkgICB0eXBlcyBhbmQgdXNlciB0eXBlcyAoY2xhc3Mvc3RydWN0KSBhbmQgcG9pbnRlcnMgdG8gdGhlc2UuCgkgICAtIFN0cnVjdHVyZSBtZW1iZXIgdmFyaWFibGVzIGFuZCBjbGFzcyBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBnZXR0ZXJzIAoJICAgYW5kIHNldHRlcnMgcGFzcyBhIHBvaW50ZXIgdG8gdGhlIG1lbWJlciBhcyB3YXMgaW4gMS4zYTMgYW5kIDEuMSAKCSAgICgxLjNhNSB3YXMgcGFzc2luZyBieSB2YWx1ZSkKCSAgIC0gUGFyYW1ldGVycyB0aGF0IHdlcmUgYXJyYXlzIGFuZCByZXR1cm4gdHlwZXMgd2VyZSBpbmNvcnJlY3RseSAKCSAgIGJlaW5nIHBhc3NlZCB0byBjcmVhdGVfZnVuY3Rpb24oKSBhcyBwb2ludGVycy4KCSAgIC0gRml4IGZvciBhcnJheXMgb2YgZW51bXMuIAoJICAgW0phdmFdIFVwZGF0ZWQgamF2YSBleGFtcGxlcyBhbmQgYWRkZWQgdHdvIG1vcmUuCgkgICBbSmF2YV0gSmF2YSBtb2R1bGUgdXBkYXRlZCBmcm9tIFNXSUcxLjNhMyBpbmNsdWRpbmcgY29kZSBjbGVhbnVwIGV0Yy4KCSAgIFtKYXZhXSBlbnVtIHN1cHBvcnQgYWRkZWQuCgkgICBbSmF2YV0gQXJyYXkgc3VwcG9ydCBpbXBsZW1lbnRlZAoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIGltcHJvdmVkIC0gSmF2YSBvYmplY3RzIHVzZWQgcmF0aGVyIHRoYW4gCgkgICBsb25ncyBob2xkaW5nIHRoZSBjIHBvaW50ZXIgdG8gdGhlIHdyYXBwZWQgc3RydWN0dXJlL2MrK2NsYXNzCgo1LzIyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgZXh0ZXJuICJDIiBkZWNsYXJhdGlvbnMgaW4gQysrIG1vZGUuIFRoYW5rcwoJICAgdG8gR3JlZyBUcm94ZWwgPGdkdEBpci5iYm4uY29tPi4KCjUvMjEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOZXcgbGlua2FnZSAibW9kdWxlIiBmb3IgY3JlYXRpbmcgR3VpbGUgbW9kdWxlcyBmb3IKCSAgIEd1aWxlIHZlcnNpb25zID49IDEuNS4wLiAKCjQvMTgvMjAwMTogbWtvZXBwZQoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgcGFzc2luZyB0aHJvdWdoIFNjaGVtZV9PYmplY3QKCSAgIHBvaW50ZXJzLiAKCjQvOS8yMDAxIDogbWtvZXBwZSAKCSAgIFtNelNjaGVtZV0gQWRkZWQgdHlwZW1hcHMgZm9yIGBib29sJy4gIEluY2x1c2lvbiBvZiBoZWFkZXJzCgkgICBhbmQgc3VwcG9ydCByb3V0aW5lcyBpcyBub3cgZGF0YS1kcml2ZW4gdmlhIG16c2NoZW1lLmkuCgkgICBIZWFkZXJzIGNvbWUgZnJvbSB0aGUgbmV3IGZpbGUgbXpzY2hlbWRlYy5zd2cuICBEb24ndCBhYm9ydAoJICAgaW1tZWRpYXRlbHkgd2hlbiBhIHR5cGUtaGFuZGxpbmcgZXJyb3IgaXMgcmVwb3J0ZWQuICBXaGVuCgkgICBzZWFyY2hpbmcgZm9yIHR5cGVtYXBzIGZvciBlbnVtcywgZmFsbCBiYWNrIHRvIHVzaW5nIGludCwKCSAgIGxpa2UgdGhlIEd1aWxlIGJhY2tlbmQgZG9lcy4gIFN1cHBvcnQgY2hhciBjb25zdGFudHMuICBFbWl0CgkgICBjb3JyZWN0IHdyYXBwZXIgY29kZSBmb3IgdmFyaWFibGVzLgoKMy8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIHR5cGVtYXBzIGZvciBjaGFyICoqT1VUUFVULCBjaGFyICoqQk9USC4KCjMvMi8yMDAxIDogbWtvZXBwZSAKCSAgIFtHdWlsZV0gRXZlcnkgd3JhcHBlciBmdW5jdGlvbiBub3cgZ2V0cyBhIGJvb2xlYW4gdmFyaWFibGUKCSAgIGdzd2lnX2xpc3RfcCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBtdWx0aXBsZSB2YWx1ZXMgYXJlCgkgICBwcmVzZW50LiBUaGUgbWFjcm9zIEdVSUxFX0FQUEVORF9SRVNVTFQsIEdVSUxFX01BWUJFX1ZBTFVFUwoJICAgYW5kIEdVSUxFX01BWUJFX1ZFQ1RPUiB1c2UgdGhpcyB2YXJpYWJsZSwgcmF0aGVyIHRoYW4KCSAgIGNoZWNraW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdC4gVGhpcwoJICAgYWxsb3dzIGZvciB0eXBlbWFwcyByZXR1cm5pbmcgYSBsaXN0IGFzIGEgc2luZ2xlIHZhbHVlIChhCgkgICBsaXN0IHdhcyBlcnJvbmVvdXNseSBjb252ZXJ0ZWQgaW50byBhIHZlY3RvciBvciBhCgkgICBtdWx0aXBsZS12YWx1ZSBvYmplY3QgaW4gdGhpcyBjYXNlKS4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBzdXBwb3J0IGZvciByZXR1cm5pbmcgbXVsdGlwbGUgdmFsdWVzIGFzCgkgICB2ZWN0b3JzLCBvciBwYXNzaW5nIHRoZW0gdG8gYSBtdWxpcGxlLXZhbHVlCgkgICBjb250aW51YXRpb24uIEJ5IGRlZmF1bHQsIG11bHRpcGxlIHZhbHVlcyBzdGlsbCBnZXQKCSAgIHJldHVybmVkIGFzIGEgbGlzdC4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBhICJiZWZvcmVyZXR1cm4iIHByYWdtYS4gVGhlIHZhbHVlIG9mIHRoaXMKCSAgIHByYWdtYSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSBldmVyeSByZXR1cm4gc3RhdGVtZW50LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIEd1aWxlIDEuNC4xIHByb2NlZHVyZQoJICAgZG9jdW1lbnRhdGlvbiBmb3JtYXRzLCBzZWUgaW50ZXJuYWxzLmh0bWwuCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTWFkZSB0aGUgd3JhcHBlciBjb2RlIGNvbXBpbGUgd2l0aCBDKysgaWYgdGhlCgkgICAiLWMrKyIgY29tbWFuZC1saW5lIHN3aXRjaCBpcyBnaXZlbi4gIFRoYW5rcyB0bwoJICAgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOb3cgdHdvIHR5cGUgdGFibGVzLCBzd2lnX3R5cGVzIGFuZAoJICAgc3dpZ190eXBlc19pbml0aWFsLCBhcmUgdXNlZCwgYXMgYWxsIG90aGVyIFNXSUcgbGFuZ3VhZ2UKCSAgIG1vZHVsZXMgZG8uICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgZm9yIHRoZSB0cmlja3kKCSAgIGNvbnN0cnVjdGlvbiB1c2VkIGJlZm9yZSB0aGF0IHRoZSBicm9rZW4gUmVkaGF0IDcuMCBnY2MKCSAgIGRvZXNuJ3QgcGFyc2UuIFJlcG9ydGVkIGJ5IDxtb25rZXlpcUBkaW5nb2JsdWUubmV0LmF1Pi4gCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKk9VVFBVVCwgY2hhciAqQk9USDsgYSBiYWQKCSAgIGZyZWUoKSB3b3VsZCBiZSBlbWl0dGVkLiAgQWRkZWQgdHlwZW1hcCBmb3IgU0NNLgoKClZlcnNpb24gMS4zIEFscGhhIDUgCj09PT09PT09PT09PT09PT09PT0KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBbUHl0aG9uXSBQeXRob24gbW9kdWxlIGdlbmVyYXRlcyBtb3JlIGVmZmljaWVudCBjb2RlIGZvcgogICAgICAgICAgY3JlYXRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBhIHdyYXBwZXIgZnVuY3Rpb24uIE1vZGlmaWNhdGlvbgogICAgICAgICAgc3VnZ2VzdGVkIGJ5IEpvbiBUcmF2aXMuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgTGlicmFyeSBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUgLWwgb3B0aW9uIGFyZSBub3cgaW5jbHVkZWQgYXQgdGhlCiAgICAgICAgICBlbmQgb2YgdGhlIGludGVyZmFjZSBmaWxlIChyZXZlcnRpbmcgdG8gdGhlIG9sZCBiZWhhdmlvcikuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIGVudW0gaGFuZGxpbmcuICBlbnVtcyBhcmUgbm93IG1hbmlwdWxhdGVkIGFzCiAgICAgICAgICAnaW50JywgYnV0IGNhc3QgaW50byB0aGUgZW51bSB0eXBlIHdoZW4gdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIAogICAgICAgICAgY29ycmVzcG9uZGluZyBDIGZ1bmN0aW9uLgoKOS8xOS8wMCA6IG1rb2VwcGUKCSAgW0d1aWxlXSBSZW1vdmVkICItd2l0aC1zbW9icyIgY29tbWFuZC1saW5lIG9wdGlvbiwgYXMgdGhpcyBpcyB0aGUKCSAgZGVmYXVsdCBub3cuICBBZGRlZCAiLWVtaXQtc2V0dGVycyIgY29tbWFuZC1saW5lIG9wdGlvbiwKCSAgd2hpY2ggdHVybnMgb24gZ2VuZXJhdGluZyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVyczsgc2VlCgkgIGludGVybmFscy5odG1sLgoKOS8xOC8wMCA6IG1rb2VwcGUKCSAgSW5jb3Jwb3JhdGVkIHBhdGNoICMxMDE0MzAsIGZpeGluZyBidWdzIGluIHRoZSBHdWlsZSBtb2R1bGU6IAoJICAxLiBTb21lIGFyZ3VtZW50cyB3ZXJlIGVycm9uZW91c2x5IHRha2VuIGFzICpvcHRpb25hbCogYXJndW1lbnRzIHdoZW4KCSAgICAgaWdub3JlZCBhcmd1bWVudHMgd2VyZSBwcmVzZW50LiAKCSAgMi4gR3VpbGUgMS4zLjQgd2FzIG5vdCBzdXBwb3J0ZWQgc2luY2UgZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gR3VpbGUKCSAgICAgIDEuNCB3ZXJlIHVzZWQuCSAgCgkgIDMuIEFkZGVkIGhhbmRsaW5nIG9mIGBjb25zdCBjaGFyIConLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmYWlsZWQgYXNzZXJ0aW9uIGFuZCBsYXJnZSBmaWxlcy4KCjkvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGhlICclJyBjaGFyYWN0ZXIgYXBwZWFyaW5nIGluIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGFuZCBmdW5jdGlvbiBib2RpZXMuICBQcmVwcm9jZXNzb3IgYnVnLgoKVmVyc2lvbiAxLjMgQWxwaGEgNCAoU2VwdGVtYmVyIDQsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8zLzAwICA6IHR0bgogICAgICAgICAgQWRkZWQgaW5zdHJ1Y3Rpb25zIGZvciBtYWludGFpbmVycyBpbiBFeGFtcGxlcy9SRUFETUUgb24gaG93CiAgICAgICAgICB0byBtYWtlIGV4YW1wbGVzIGFsc28gYmUgdXNlZnVsIGluIHRoZSB0ZXN0aW5nIGZyYW1ld29yay4KICAgICAgICAgIEFsc28sICJtYWtlIGNoZWNrIiBub3cgdXNlcyAuL0xpYiBieSB2aWEgZW52IHZhciBgU1dJR19MSUInLgogICAgICAgICAgVGhpcyBpcyBvdmVycmlkYWJsZSBsaWtlIHNvOgogICAgICAgICAgICAgbWFrZSBjaGstc3dpZ2xpYj0vbXkvZXhwZXJpbWVudGFsL3N3aWcvTGliIGNoZWNrCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgQWRkZWQgJHR5cGVtYXAgdmFyaWFibGUgdG8gdHlwZW1hcHMuICBUaGlzIGdldHMgcmVwbGFjZWQgd2l0aAogICAgICAgICAgYSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgdHlwZW1hcCB0aGF0IGlzIGFwcGxpZWQuICBGZWF0dXJlCiAgICAgICAgICByZXF1ZXN0IGZyb20gcnNhbHouCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgRXhwZXJpbWVudGFsIG9wdGltaXphdGlvbiB0byBjb2RlIGdlbmVyYXRpb24gZm9yIHZpcnR1YWwKICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBJZiB5b3UgaGF2ZSB0d28gY2xhc3NlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIGNsYXNzIEEoKSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICBjbGFzcyBCKCkgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFN3aWcgbm93IHdpbGwgZ2VuZXJhdGUgYSBzaW5nbGUgd3JhcHBlciBmdW5jdGlvbiBmb3IgdGhpcwoKICAgICAgICAgICAgICAgIEFfZm9vKEEgKmEpIHsKICAgICAgICAgICAgICAgICAgICBhLT5mb28oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBhbmQgdXNlIGl0IGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBib3RoIEFfZm9vKCkgYW5kIEJfZm9vKCkuCiAgICAgICAgICBUaGlzIG9wdGltaXphdGlvbiBvbmx5IHRha2VzIHBsYWNlIGlmIGJvdGggbWV0aG9kcyBhcmUgZGVjbGFyZWQKICAgICAgICAgIGFzIHZpcnR1YWwgYW5kIGJvdGggdGFrZSBpZGVudGljYWwgcGFyYW1ldGVycy4KICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZXN0b3JlZCB0aGUgIm1lbWJlcmluIiB0eXBlbWFwIGZvciBzZXR0aW5nIHN0cnVjdHVyZSBtZW1iZXJzLgogICAgICAgICAgVW5saWtlIHRoZSBvbGQgdmVyc2lvbiwgdGhlIG5ldyB2ZXJzaW9uIGlzIGV4cGFuZGVkIGlubGluZSBpbiB0aGUKICAgICAgICAgIHdyYXBwZXIgZnVuY3Rpb24gYWxsb3dpbmcgYWNjZXNzIHRvIHNjcmlwdGluZyBsYW5ndWFnZQogICAgICAgICAgaW50ZXJuYWxzIChhIHNvbWV0aW1lcyByZXF1ZXN0ZWQgZmVhdHVyZSkuIFRoZSAibWVtYmVyb3V0IiB0eXBlbWFwCiAgICAgICAgICBpcyBnb25lLiBVc2UgdGhlICJvdXQiIHR5cGVtYXBzIGluc3RlYWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBdHRyaWJ1dGUgc2V0IG1ldGhvZHMgbm8gbG9uZ2VyIHJldHVybiB0aGUgdmFsdWUgb2YgYSBtZW1iZXIuCiAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgbm93IGdldHMgc2V0IGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgIHZvaWQgRm9vX3hfc2V0KEZvbyAqZiwgaW50IHgpIHsKICAgICAgICAgICAgICAgICAgICBmLT54ID0geDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgSW4gU1dJRzEuMSBpdCB1c2VkIHRvIGJlIHRoaXM6CgogICAgICAgICAgICAgIGludCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIChmLT54ID0geCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCBkdWUgdG8gdGhlIGNvbXBsZXhpdHkgY3JlYXRlZCBieSB0cnlpbmcKICAgICAgICAgIHRvIGRvIHRoaXMgd2l0aCBtb3JlIGV4b3RpYyBkYXRhdHlwZXMgc3VjaCBhcyBhcnJheXMuICBJdCBhbHNvCiAgICAgICAgICBjb21wbGljYXRlcyBpbmxpbmluZyBhbmQgaGFuZGxpbmcgb2YgdGhlICJtZW1iZXJpbiIgdHlwZW1hcC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIHB0cmNhc3QoKSBhbmQgcHRybWFwKCkgZnVuY3Rpb25zIGZyb20gdGhlCiAgICAgICAgICBwb2ludGVyLmkgbGlicmFyeSBmaWxlLiAgT2xkIGltcGxlbWVudGF0aW9uIGlzIGluY29tcGF0aWJsZQogICAgICAgICAgd2l0aCBuZXcgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgcnVudGltZSBmdW5jdGlvbiBTV0lHX1R5cGVRdWVyeShjb25zdCBjaGFyICpuYW1lKSBhZGRlZC4KICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgdHlwZSBpbmZvIHN0cnVjdHVyZQogICAgICAgICAgdGhhdCBpcyB1c2VkIGZvciB0eXBlLWNoZWNraW5nLiAgSXQgd29ya3Mgd2l0aCBlaXRoZXIgdGhlCiAgICAgICAgICBuaWNlIEMgbmFtZSBvciBtYW5nbGVkIHZlcnNpb24gb2YgYSBkYXRhdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiaW50ICoiKTsKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiX3BfaW50Iik7CgogICAgICAgICAgVGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlIHRoYXQgaGFzIGJlZW4gYWRkZWQgdG8gc3VwcG9ydCBzb21lCiAgICAgICAgICBleG90aWMgZXh0ZW5zaW9uIG1vZHVsZXMgdGhhdCBuZWVkIHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUKICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZSBvYmplY3RzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBkaXJlY3RpdmUgJXR5cGVzKCkgYWRkZWQuICBUaGlzIGlzIHVzZWQgdG8KICAgICAgICAgIGV4cGxpY2l0bHkgbGlzdCBkYXRhdHlwZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4KICAgICAgICAgIHRoZSBydW50aW1lIHR5cGUtY2hlY2tpbmcgY29kZS4gTm9ybWFsbHkgaXQgaXMgbmV2ZXIKICAgICAgICAgIG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBidXQgc29tZXRpbWVzIGFkdmFuY2VkIGV4dGVuc2lvbnMKICAgICAgICAgIChzdWNoIGFzIHRoZSBwb2ludGVyLmkgbGlicmFyeSkgbWF5IG5lZWQgdG8gbWFudWFsbHkKICAgICAgICAgIGFkZCB0eXBlcyB0byB0aGUgdHlwZS1jaGVja2VyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIHN0cmluZyBhcnJheSB2YXJpYWJsZXMuIEZvciBleGFtcGxlLAogICAgICAgICAgYSBnbG9iYWwgdmFyaWFibGUgb2YgdGhlIGZvcm0gImNoYXIgbmFtZVs2NF0iIGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgIG1hbmFnZWQgYXMgYSA2NCBjaGFyYWN0ZXIgc3RyaW5nLiAgUHJldmlvdXNseSB0aGlzIGRpZG4ndAogICAgICAgICAgd29yayBhdCBhbGwgb3IgcmVxdWlyZWQgdGhlIHVzZSBvZiBhIHNwZWNpYWwgdHlwZW1hcC4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAoVGNsLCBQZXJsLCBQeXRob24pICoqKgoKOC8zMS8wMCA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgYGNoZWNrLWMrKy1leGFtcGxlcycsIHdoaWNoIHVzZXMgbmV3CgkgIGZpbGVzIHVuZGVyIEV4YW1wbGVzL0MrKyBjb250cmlidXRlZCBieSBUYWwgU2hhbGlmLiAgTm93ICJtYWtlCgkgIGNoZWNrIiBhbHNvIGRvZXMgIm1ha2UgY2hlY2stYysrLWV4YW1wbGVzIi4gIEFsc28sIGV4cGFuZGVkCgkgIGFjdGlvbnMgaW4gYGNoZWNrLWdpZnBsb3QtZXhhbXBsZScgYW5kIGBjaGVjay1hbGl2ZW5lc3MnLgoKOC8zMC8wMCA6IG1rb2VwcGUKCSAgTWFqb3IgY2xlYW4tdXAgaW4gdGhlIEd1aWxlIG1vZHVsZS4gQWRkZWQgdHlwZW1hcC1kcml2ZW4KCSAgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uIENoYW5nZWQgdG8gaGFuZGxlIG1vcmUgdGhhbiAxMAoJICBhcmdzLiBVcGRhdGVkIGFuZCBleHRlbmRlZCBleGFtcGxlcy4KCSAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlaW5zZXJ0IGRpcmVjdGl2ZSB0aGF0IGluc2VydHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZQogICAgICAgICAgaW50byBhIHBvcnRpb24gb2YgdGhlIG91dHB1dCB3cmFwcGVyIGZpbGUuICBUaGlzIGlzIG9ubHkgaW50ZW5kZWQKICAgICAgICAgIGZvciB1c2UgYnkgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV29ya3MgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVycykgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQocnVudGltZSkgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQod3JhcHBlcnMpICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQoaW5pdCkgICAgICJmaWxlLnN3ZyI7CgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlcnVudGltZSBkaXJlY3RpdmUgd2hpY2ggaW5jbHVkZXMgY29kZSBpbnRvIHRoZSBydW50aW1lCiAgICAgICAgICBwb3J0aW9uIG9mIHRoZSB3cmFwcGVyIGNvZGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcnVudGltZSAlewogICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGludGVybmFsIHJ1bnRpbWUgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgIFRoZXJlIGlzIG5vIHByYWN0aWNhbCByZWFzb24gZm9yIG9yZGluYXJ5IHVzZXJzIHRvIHVzZSB0aGlzCiAgICAgICAgICBmZWF0dXJlIChhbG1vc3QgZXZlcnl0aGluZyBjYW4gYmUgZG9uZSB1c2luZyAleyAuLi4gJX0KICAgICAgICAgIGluc3RlYWQpLiAgIEhvd2V2ZXIsIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcyBtYXkgd2FudCB0bwogICAgICAgICAgdXNlIHRoaXMgaW4gbGFuZ3VhZ2UgY29uZmlndXJhdGlvbiBmaWxlcy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjgvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBjYW4gbm93IGJlIHNwZWNpZmllZCB1c2luZyBzdHJpbmcgbGl0ZXJhbHMgbGlrZQogICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAiJHRhcmdldCA9IFN2SVYoJHNvdXJjZSk7IjsKCiAgICAgICAgICBXaGVuIGNvZGUgaXMgc3BlY2lmaWVkIGxpa2UgdGhpcywgaXQgaXMgKk5PVCogZW5jbG9zZWQKICAgICAgICAgIGluc2lkZSBhIGxvY2FsIHNjb3BlIChhcyB3aXRoIG9sZGVyIHR5cGVtYXAgZGVjbGFyYXRpb25zKS4KICAgICAgICAgIE5vdGU6IGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzIGFyZSBpbnRlcnByZXRlZCBpbiB0aGUKICAgICAgICAgIGNvZGUgc3RyaW5nIHNvIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgYSBxdW90ZSBvciBzb21lCiAgICAgICAgICBvdGhlciBzcGVjaWFsIGNoYXJhY3RlciwgbWFrZSBzdXJlIHlvdSB1c2UgYSAoXCkuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI3LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGZvbGxvdyB0eXBlZGVmIGRlY2xhcmF0aW9ucy4KICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCBOdW1iZXI7CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhbiBpbnRlZ2VyIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdm9pZCBmb28oTnVtYmVyIGEpOwoKICAgICAgICAgIFRoZSB0eXBlbWFwIGZvciAnaW50JyB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGFyZ3VtZW50ICdOdW1iZXIgYScuCiAgICAgICAgICBPZiBjb3Vyc2UsIGlmIHlvdSBzcGVjaWZ5IGEgdHlwZW1hcCBmb3IgJ051bWJlcicgaXQgd2lsbCB0YWtlCiAgICAgICAgICBwcmVjZWRlbmNlIChub3Igd2lsbCBpdCBldmVyIGJlIGFwcGxpZWQgdG8gYW4gJ2ludCcpLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzI3LzAwIDogYmVhemxleQogICAgICAgICAgRGVmYXVsdCB0eXBlbWFwIHNwZWNpZmljYXRpb24gaGFzIGNoYW5nZWQuICAgSW4gb2xkZXIKICAgICAgICAgIHZlcnNpb25zIG9mIHN3aWcsIHlvdSBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCBTV0lHX0RFRkFVTFRfVFlQRSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgaGFuZGxpbmcgb2YgYSBkYXRhdHlwZS4gICBOb3cgdGhhdAogICAgICAgICAgU1dJRyBmb2xsb3dzIHR5cGVkZWYgZGVjbGFyYXRpb25zLCB0aGlzIGlzIHVubmVjZXNzYXJ5LgogICAgICAgICAgU2ltcGx5IHNwZWNpZnlpbmcgYSB0eXBlbWFwIGZvciAnaW50JyB3aWxsIHdvcmsgZm9yIGFsbAogICAgICAgICAgdmFyaWF0aW9ucyBvZiBpbnRlZ2VycyB0aGF0IGFyZSB0eXBlZGVmJ2QgdG8gJ2ludCcuCgogICAgICAgICAgQ2F2ZWF0LCBzcGVjaWZ5aW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBwb2ludGVycywKICAgICAgICAgIHJlZmVyZW5jZXMsIGFycmF5cywgYW5kIHVzZXIgZGVmaW5lZCB0eXBlcyBpcyBhIGxpdHRsZQogICAgICAgICAgZGlmZmVyZW50LiAgVGhpcyBtdXN0IGJlIGRvbmUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1BPSU5URVIgKiB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYSBwb2ludGVyIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1JFRkVSRU5DRSAmIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHJlZmVyZW5jZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdBUlJBWSBbXSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYW4gYXJyYXkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYSB1c2VyLWRlZmluZWQgdHlwZSAoYnkgdmFsdWUpIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMTUvMDAgOiBkdXN0aW4KICAgICAgICAgIFRoZSBmaWxlIHN3aWctMS4zYTEtMS5zcGVjIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBUb29scyBkaXJlY3RvcnkuCiAgICAgICAgICBJdCBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHJlZGhhdCBwYWNrYWdlIGZvciBTV0lHLCBhbHRob3VnaCBpdAogICAgICAgICAgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgZm9yIHRoZSBuZXh0IHB1YmxpYyByZWxlYXNlLgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGhhdmUgYmVlbiBjb21wbGV0ZWx5IHJld3JpdHRlbi4gIEV2ZW50dWFsbHkgdGhleSBtYXkgYmUKICAgICAgICAgIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nIGJldHRlciwgYnV0IGZvciBub3cgdGhleSBzdGF5LiAgSG93ZXZlciwKICAgICAgICAgIHRoZXJlIGFyZSBhIG51bWJlciBvZiBhIHNpZ25pZmljYW50IGNoYW5nZXMgdGhhdCBtYXkgdHJpcCBzb21lCiAgICAgICAgICBwZW9wbGUgdXA6CgogICAgICAgICAgMS4gIFR5cGVtYXAgc2NvcGluZyBpcyBjdXJyZW50bHkgYnJva2VuLiAgQmVjYXVzZSBvZiB0aGlzLCB0aGUKICAgICAgICAgICAgICBmb2xsb3dpbmcgY29kZSB3b24ndCB3b3JrLgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGJsYWggKngpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAqOyAgIC8qIENsZWFyIHR5cGVtYXAgKi8KCiAgICAgICAgICAgICAgKHRoaXMgYnJlYWtzIGJlY2F1c2UgdGhlIGNvZGUgZm9yIHRoZSBjbGFzcyBGb28gaXMgYWN0dWFsbHkKICAgICAgICAgICAgICBnZW5lcmF0ZWQgYWZ0ZXIgdGhlIGVudGlyZSBpbnRlcmZhY2UgZmlsZSBoYXMgYmVlbiBwcm9jZXNzZWQpLgogICAgICAgICAgICAgIFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBidWcuCgogICAgICAgICAgMi4gIEluIFNXSUcxLjEsIHRoZSAlYXBwbHkgZGlyZWN0aXZlIHdvcmtlZCBieSBwZXJmb3JtaW5nIGEKICAgICAgICAgICAgICB2ZXJ5IGNvbXBsZXggdHlwZS1hbGlhc2luZyBwcm9jZWR1cmUuICBGcm9tIHRoaXMgcG9pbnQgb24sCiAgICAgICAgICAgICAgJWFwcGx5IGlzIHNpbXBseSBhIGdlbmVyYWxpemVkIHR5cGVtYXAgY29weSBvcGVyYXRpb24uCiAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlICpPVVRQVVQgeyBkb3VibGUgKngsIGRvdWJsZSAqeSB9OwoKICAgICAgICAgICAgICBDb3BpZXMgKkFMTCogY3VycmVudGx5IGRlZmluZWQgdHlwZW1hcHMgZm9yICdkb3VibGUgKk9VVFBVVCcgYW5kCiAgICAgICAgICAgICAgY29waWVzIHRoZW0gdG8gJ2RvdWJsZSAqeCcgYW5kICdkb3VibGUgKnknLgoKICAgICAgICAgICAgICBNb3N0IHBlb3BsZSBwcm9iYWJseSB3b24ndCBldmVuIG5vdGljZSB0aGlzIGNoYW5nZSBpbgogICAgICAgICAgICAgICVhcHBseS4gIEhvd2V2ZXIsIHdoZXJlIGl0IHdpbGwgYnJlYWsgdGhpbmdzIGlzIGluIGNvZGUgbGlrZQogICAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlICpPVVRQVVQgeyBkb3VibGUgKnggfTsKICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqT1VUUFVUIHsKICAgICAgICAgICAgICAgICAgICAgICAuLi4gd2hhdGV2ZXIgLi4uCiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqeCk7CgogICAgICAgICAgICAgIEluIFNXSUcxLjEsIHlvdSB3aWxsIGZpbmQgdGhhdCAnZm9vJyB1c2VzIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUKICAgICAgICAgICAgICBldmVuIHRob3VnaCBpdCB3YXMgZGVmaW5lZCBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZSAodGhpcyBpcwogICAgICAgICAgICAgIHRoZSB3ZWlyZCBhbGlhc2luZyBzY2hlbWUgYXQgd29yaykuICBJbiBTV0lHMS4zIGFuZCBsYXRlciwKICAgICAgICAgICAgICB0aGUgJ2RvdWJsZSAqT1VUUFVUJyBydWxlIGlzIGlnbm9yZWQgYmVjYXVzZSBpdCBpcyBkZWZpbmVkCiAgICAgICAgICAgICAgYWZ0ZXIgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgMy4gIFRoZSAlY2xlYXIgZGlyZWN0aXZlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGVyYXNlIGFsbCBjdXJyZW50bHkKICAgICAgICAgICAgICBkZWZpbmVkIHR5cGVtYXBzIGZvciBhIHBhcnRpY3VsYXIgdHlwZS4gIFRoaXMgZGlmZmVycyBmcm9tCiAgICAgICAgICAgICAgU1dJRzEuMSB3aGVyZSAlY2xlYXIgb25seSByZW1vdmVkIHJ1bGVzIHRoYXQgd2VyZSBhZGRlZCB1c2luZwogICAgICAgICAgICAgIHRoZSAlYXBwbHkgZGlyZWN0aXZlLgoKICAgICAgICAgIDQuICBUeXBlbWFwIG1hdGNoaW5nIGlzIG5vdyBwZXJmb3JtZWQgdXNpbmcgKmV4YWN0KiB0eXBlcy4KICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdGhpbmdzIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjaGFyICogeyB9CiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgY2hhciAqIHsgfQoKICAgICAgICAgICAgICBhcmUgZGlmZmVyZW50IHR5cGVtYXBzLiAgICBBIHNpbWlsYXIgcnVsZSBhcHBsaWVzIGZvciBwb2ludGVycywKICAgICAgICAgICAgICBhcnJheXMsIGFuZCByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqIHsgfQoKICAgICAgICAgICAgICB1c2VkIHRvIGFwcGx5IHRvICdkb3VibGUgJicsICdkb3VibGUgW10nLCAgTm93LCBpdCBvbmx5IGFwcGxpZXMKICAgICAgICAgICAgICB0byAnZG91YmxlIConLiAgSWYgeW91IHdhbnQgYSAnZG91YmxlICYnLCB5b3UnbGwgbmVlZCB0byBoYW5kbGUKICAgICAgICAgICAgICB0aGF0IHNlcGFyYXRlbHkuCgogICAgICAgICAgNS4gIEFycmF5IG1hdGNoaW5nIGhhcyBiZWVuIHNpbXBsZmllZC4gIEluIFNXSUcxLjEsIGFycmF5IG1hdGNoaW5nCiAgICAgICAgICAgICAgd2FzIHBlcmZvcm1lZCBieSB0cnlpbmcgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgZGltZW5zaW9ucy4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgJ2RvdWJsZSBhWzEwXVsyMF0nIHdhcyBtYXRjaGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVtBTlldCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgICAgICBJbiBTV0lHMS4zLCBvbmx5IHRoZSBmb2xsb3dpbmcgbWF0Y2hlcyBhcmUgYXR0ZW1wdGVkOgoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdWzIwXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFtBTlldW0FOWV0KCiAgICAgICAgICBPbiB0aGUgcG9zaXRpdmUgc2lkZSwgdHlwZW1hcCBtYXRjaGluZyBpcyBub3cgKnNpZ25pZmljYW50bHkqIGZhc3RlcgogICAgICAgICAgdGhhbiBiZWZvcmUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBTZWNyZXQgZGV2ZWxvcGVyIGZlYXR1cmUuICBTaW5jZSBkYXRhdHlwZXMgYXJlIG5vdyByZXByZXNlbnRlZCBhcyAKICAgICAgICAgIHN0cmluZ3MgaW50ZXJuYWxseSwgeW91IGNhbiBieXBhc3MgbGltaXRhdGlvbnMgb2YgdGhlIHBhcnNlciBhbmQKICAgICAgICAgIGNyZWF0ZSBhIHdpbGQgZGF0YXR5cGUgYnkgc2ltcGx5IGVuY2xvc2luZyB0aGUgcmF3IHN0cmluZyBlbmNvZGluZwogICAgICAgICAgaW4gYmFja3RpY2tzIChgYCkgYW5kIHN0aWNraW5nIGl0IGluIHRoZSBpbnRlcmZhY2UgZmlsZSBhbnl3aGVyZSBhCiAgICAgICAgICB0eXBlIGlzIGV4cGVjdGVkLiAgRm9yIGV4YW1wbGUsIGBhKDIwKS5hKDEwKS5wLmYoaW50LGludClgLiAgVGhpcyAKICAgICAgICAgIGZlYXR1cmUgaXMgb25seSBpbnRlbmRlZCBmb3IgdGVzdGluZyAoaS5lLiwgeW91IHdhbnQgdG8gc2VlIHdoYXQKICAgICAgICAgIGhhcHBlbnMgdG8geW91ciBsYW5ndWFnZSBtb2R1bGUgaWYgaXQgZ2V0cyBhIHJlZmVyZW5jZSB0byBhIHBvaW50ZXIKICAgICAgICAgIHRvIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBvciBzb21ldGhpbmcpLiAKICAgICAgICAgICoqKiBTSUNLIEhBQ0sgKioqCgo4LzE0LzAwIDogYmVhemxleQogICAgICAgICAgQ29tcGxldGVseSBuZXcgdHlwZS1zeXN0ZW0gYWRkZWQgdG8gdGhlIGltcGxlbWVudGF0aW9uLgogICAgICAgICAgTW9yZSBkZXRhaWxzIGxhdGVyLgoKOC8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIENsZWFuZWQgdXAgc29tZSBvZiB0aGUgSS9PIGhhbmRsaW5nLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzCiAgICAgICAgICBhbnkgdGVtcG9yYXJ5IGZpbGVzIHN1Y2ggYXMgX3dyYXAud3JhcCwgX3dyYXAuaWksIF93cmFwLmluaXQuCiAgICAgICAgICBJbnN0ZWFkLCB0aGVzZSAiZmlsZXMiIGFyZSBrZXB0IGFyb3VuZCBpbiBtZW1vcnkgYXMgc3RyaW5ncwogICAgICAgICAgKGFsdGhvdWdoIHRoaXMgaXMgdHJhbnNwYXJlbnQgdG8gbGFuZ3VhZ2UgbW9kdWxlcykuCgo4LzQvMDAgIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCAiY2hlY2siIGFuZCB2YXJpYW50cy4KCSAgVGhpcyBjYW4gYmUgdXNlZCBsaWtlICJtYWtlIGNoZWNrIiBvciwgdG8gZXhwbGljaXRseSBza2lwIGEKCSAgbGFuZ3VhZ2UgTEFORzogIm1ha2Ugc2tpcC1MQU5HPXRydWUgY2hlY2siLiAgTEFORyBpcyBza2lwcGVkCgkgIGF1dG9tYXRpY2FsbHkgaWYgLi9jb25maWd1cmUgZGV0ZXJtaW5lcyB0aGF0IExBTkcgc3VwcG9ydCBpcwoJICBpbnN1ZmZpY2llbnQuCgoJICBDdXJyZW50bHksIHRoZSBjaGVjayBpcyBsaW1pdGVkIHRvIGRvaW5nIHRoZSBlcXVpdmFsZW50IG9mCgkgICJtYWtlIGFsbCIgaW4gc29tZSBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3JpZXMuICBUaGlzIHNob3VsZAoJICBiZSBleHBhbmRlZCBib3RoIGhvcml6b250YWxseSAoZGlmZmVyZW50IHR5cGVzIG9mIHRlc3RzKSBhbmQKCSAgdmVydGljYWxseSAoYWZ0ZXIgIm1ha2UgYWxsIiBpbiBhbiBFeGFtcGxlcyBzdWJkaXIgc3VjY2VlZHMsCgkgIGRvIHNvbWUgYWRkaXRpb25hbCB0ZXN0cyB3aXRoIHRoZSByZXN1bHRpbmcgaW50ZXJwcmV0ZXIsIGV0YykuCgo4LzQvMDAgIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCAiZGlzdGNsZWFuIiwgd2hpY2ggZGVsZXRlcyBhbGwgdGhlCgkgIGZpbGVzIC4vY29uZmlndXJlIGNyZWF0ZXMsIGluY2x1ZGluZyBjb25maWcuc3RhdHVzIGFuZCBmcmllbmRzLgoKOC8zLzAwICA6IGhhcmNvaAoJICBqYXZhIGNoYW5nZXM/Pz8gW3RvZG86IGRvY3VtZW50IGNoYW5nZXNdCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGtleSBvZmYgb2YgdGhlIHJlYWwgZGF0YXR5cGVzCiAgICAgICAgICB1c2VkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4gIFRoaXMgbWVhbnMgdGhhdCB0eXBlbWFwcyBmb3IKICAgICAgICAgICJjb25zdCBjaGFyICoiIGFuZCAiY2hhciAqIiB3aWxsIGJlIGRpZmZlcmVuY2UgYXMgd2lsbCB0eXBlbWFwcwogICAgICAgICAgZm9yICJWZWN0b3IiIGFuZCAiVmVjdG9yICouIgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGlzIGxpa2VseSB0byBicmVhayBpbnRlcmZhY2VzIHRoYXQgcmVseSBvbiB0aGUgb2RkIHR5cGUKICAgICAgICAgIGhhbmRsaW5nIGJlaGF2aW9yIG9mIHR5cGVtYXBzIGluIFNXSUcxLjEtLWVzcGVjaWFsbHkgd2l0aAogICAgICAgICAgcmVzcGVjdCB0byBpbnRlcmZhY2VzIGludm9sdmluZyBwYXNzLWJ5LXZhbHVlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIE5ldyAlY29uc3RhbnQgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgIGNyZWF0ZSB0cnVlIGNvbnN0YW50cyBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4KICAgICAgICAgIEl0J3MgbW9zdCBzaW1wbGUgZm9ybSBpcyBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICVjb25zdGFudCBGT08gNDI7CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdHlwZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSBzeW50YXggb2YgdGhlCiAgICAgICAgICB2YWx1ZSAoaW4gcmVhbGl0eSwgYWxsICNkZWZpbmUgbWFjcm9zIGFyZSB0cmFuc2xhdGVkIGludG8KICAgICAgICAgIGRpcmVjdGl2ZXMgb2YgdGhpcyBmb3JtKS4KCiAgICAgICAgICBBbiBleHBhbmRlZCB2ZXJzaW9uIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAlY29uc3RhbnQoRm9vICopIEZPTyA9ICZGb29PYmo7CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCBhbiBleHBsaWNpdCB0eXBlIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzCiAgICAgICAgICBsYXR0ZXIgZm9ybSBtYXkgYmUgdXNlZnVsIGZvciBjcmVhdGluZyBjb25zdGFudHMgdGhhdAogICAgICAgICAgdXNlZCB0byBiZSBzcGVjaWZpZWQgYXMKCiAgICAgICAgICAgICBjb25zdCBGb28gKkZPTyA9ICZGb29PYmo7CgogICAgICAgICAgKHdoaWNoIGFyZSBub3cgdHJlYXRlZCBhcyB2YXJpYWJsZXMpLgogICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKiBUaGUgc3ludGF4IG1heSBjaGFuZ2UgaW4KICAgICAgICAgIHRoZSBmaW5hbCByZWxlYXNlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBwYXJzZXIgc28gdGhhdCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgb2YgdGhlIGZvcm0KICAgICAgICAgICJjb25zdCB0eXBlICphIiBhcmUgaGFuZGxlZCBhcyB2YXJpYWJsZXMsIG5vdCBjb25zdGFudHMuCiAgICAgICAgICBOb3RlOiBTV0lHMS4xIGhhbmRsZWQgdGhpcyBjYXNlIGVycm9uZW91c2x5IGJlY2F1c2UKICAgICAgICAgIGNvbnN0IGNoYXIgKmEgaXMgYSBwb2ludGVyIHZhcmlhYmxlIHRoYXQgY2FuIGJlIHJlYXNzaWduZWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIE5vdGU6IGp1c3QgYmVjYXVzZSB0aGlzIGlzIHRoZSAicmlnaHQiIHdheSB0byBkbyB0aGluZ3MsCiAgICAgICAgICBkb2Vzbid0IG1lYW4gaXQncyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBpbnRlcnByZXRhdGlvbi4KICAgICAgICAgIEkgc3VzcGVjdCB0aGF0IG1hbnkgQyBwcm9ncmFtbWVycyBtaWdodCB1c2UgJ2NvbnN0IGNoYXIgKicKICAgICAgICAgIHdpdGggdGhlIGludGVudCBvZiBjcmVhdGluZyBhIGNvbnN0YW50LCB3aXRob3V0IHJlYWxpemluZwogICAgICAgICAgdGhhdCB0aGV5J3ZlIGNyZWF0ZWQgYSByZWFzc2lnbmFibGUgZ2xvYmFsIHZhcmlhYmxlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRoZSBDL0MrKyB3cmFwcGluZyBsYXllciBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlZGVzaWduZWQgYW5kCiAgICAgICAgICByZWltcGxlbWVudGVkLiAgVGhpcyBjaGFuZ2Ugc2hvdWxkIGlyb24gb3V0IGEgZmV3IHJvdWdoCiAgICAgICAgICBzcG90cyB3aXRoIHRoZSBoYW5kbGluZyBvZiBkYXRhdHlwZXMuICBJbiBhZGRpdGlvbiwgdGhlCiAgICAgICAgICB3cmFwcGVyIGNvZGUgaXMgc29tZXdoYXQgY2xlYW5lci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGludGVyZmFjZXMgdGhhdCBpbnZvbHZlCiAgICAgICAgICBzdWJ0bGUgY29ybmVyLWNhc2VzIHdpdGggdHlwZW1hcHMgYW5kIHRoZSAlYWRkbWV0aG9kcwogICAgICAgICAgZGlyZWN0aXZlIHNpbmNlIHNvbWUgb2YgdGhlc2UgZmVhdHVyZXMgaGFkIHNvbWV3aGF0CiAgICAgICAgICB0eXBlIGhhbmRsaW5nIGJlaGF2aW9yIGluIFNXSUcxLjEuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlICJtZW1iZXJpbiIgYW5kICJtZW1iZXJvdXQiIHR5cGVtYXBzIGFyZSBnb25lIGZvciB0aGUKICAgICAgICAgIG1vbWVudCwgYnV0IHRoZXkgbWlnaHQgcmV0dXJuIGFzIHNvb24gYXMgSSBmaWd1cmUgb3V0CiAgICAgICAgICBob3cgdG8gaW50ZWdyYXRlIHRoZW0gd2l0aCBzb21lIG9mIHRoZSBzdHJlYW1saW5lZCBDIHdyYXBwZXIKICAgICAgICAgIGZ1bmN0aW9ucy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBvbGQgdHlwZSBoYW5kbGluZyBmdW5jdGlvbnMgc3VjaCBhcyBwcmludF90eXBlKCksCiAgICAgICAgICBwcmludF9mdWxsKCksIHByaW50X21hbmdsZSgpLCBldGMuLi4gYXJlIGdvbmUgYW5kIGhhdmUgYmVlbgogICAgICAgICAgcmVwbGFjZWQgd2l0aCBhIHNtYWxsZXIgc2V0IG9mIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZmlsZQogICAgICAgICAgRG9jL2ludGVybmFscy5odG1sIGZvciBkZXRhaWxzLiAgVGhpcyB3aWxsIGJyZWFrIGFsbCB0aGlyZAogICAgICAgICAgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICV2YWwgYW5kICVvdXQgZGlyZWN0aXZlcy4gIFRoZXNlIGRpcmVjdGl2ZXMKICAgICAgICAgIHNob3VsZG4ndCByZWFsbHkgYmUgbmVjZXNzYXJ5IHNpbmNlIHR5cGVtYXBzIGNhbiBiZSB1c2VkCiAgICAgICAgICB0byBhY2hpZXZlIHNpbWlsYXIgcmVzdWx0cy4gICBUaGlzIGFsc28gY2xlYW5zIHVwIHRoZQogICAgICAgICAgaGFuZGxpbmcgb2YgdHlwZXMgYW5kIHBhcmFtZXRlcnMgcXVpdGUgYSBiaXQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjAvMDAgOiB0dG4KCSAgRml4ZWQgdW5zcGVjaWZpZWQtbW9kdWxlIGJ1ZyBpbiBHdWlsZSBzdXBwb3J0IGFuZCByZW1vdmVkCgkgIG1vcmUgbm9uLSJ3aXRoLXNtb2JzIiBmdW5jdGlvbmFsaXR5IHVzaW5nIHBhdGNoZXMgc3VibWl0dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCgkgIFJlLWVuYWJsZSByZWNvZ25pdGlvbiBvZiAiLXdpdGgtc21vYnMiICh3aXRoIG5vIGVmZmVjdCBzaW5jZQoJICB3ZSB1c2Ugc21vYnMgYnkgZGVmYXVsdCBub3cpIGZvciB0aGUgdGltZSBiZWluZy4gIEFmdGVyIHRoZQoJICAxLjNhNCByZWxlYXNlLCB0aGlzIG9wdGlvbiB3aWxsIHNpZ25hbCBhbiBlcnJvci4KCjcvMTcvMDAgOiB0dG4KCSAgRml4ZWQgTlVMTC1pbnB1dCBidWcgaW4gcGFyYW1ldGVyIGxpc3QgaGFuZGxpbmcuCgkgIFJlcG9ydGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjcvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBtZW1vcnkgbGVhayBpbiBQeXRob24gdHlwZS1jaGVja2luZyBjb2RlLiBSZXBvcnRlZCBieQogICAgICAgICAgS2VpdGggRGF2aWRzb24uICBCdWcgIzEwOTM3OS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDaGFuZ2VkIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBidWdzIHJlbGF0ZWQgdG8gdGhlIGhhbmRsaW5nIG9mIHRoZSAlbmFtZSgpIGRpcmVjdGl2ZQogICAgICAgICAgYW5kIGNsYXNzZXMgaW4gdGhlIFRjbCBtb2R1bGUuIFByb2JsZW0gcmVwb3J0ZWQgYnkgSmFtZXMgQmFpbGV5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHBhcnNpbmcgYW5kIGVudW0gaGFuZGxpbmcgcHJvYmxlbXMgd2l0aCBjaGFyYWN0ZXIgY29uc3RhbnRzLgogICAgICAgICAgUmVwb3J0ZWQgYnkgR3JlZyBLb2NoYW5za2kuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCBXcmFwcGVyRnVuY3Rpb24gY2xhc3MgZnJvbSB0aGUgY29yZSBhbmQgdXBkYXRlZCB0aGUgbGFuZ3VhZ2UKICAgICAgICAgIG1vZHVsZS4gIFRoaXMgd2lsbCBicmVhayB0aGlyZCBwYXJ0eSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzkvMDAgIDogYmVhemxleQogICAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgU1dJRyBubyBsb25nZXIgbWFrZXMgdXNlIG9mIEMrKyBvcGVyYXRvciBvdmVybG9hZGluZy4KICAgICAgICAgIFRoaXMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJyZWFrICphbGwqIHRoaXJkIHBhcnR5IGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtYWluIFNXSUcgQ1ZTIHRyZWUuIFNvcnJ5LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzgvMDAgIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgZXhwZXJpbWVudGFsIGFuZCB1bmRvY3VtZW50ZWQgImJ1aWxkIiB0eXBlbWFwIHRoYXQKICAgICAgICAgIHdhcyBpbnRlbmRlZCB0byB3b3JrIHdpdGggbXVsdGlwbGUgYXJndW1lbnRzLiBTaW1wbHkgdG9vIHdlaXJkCiAgICAgICAgICB0byBrZWVwIGFyb3VuZC4gIEJlc2lkZXMsIGEgYmV0dGVyIHJlcGxhY2VtZW50IGlzIGluIHRoZSB3b3Jrcy4KCjcvNi8wMCAgOiB0dG4KICAgICAgICAgIFJlbW92ZWQgbm9uLSJ3aXRoLXNtb2JzIiBmdW5jdGlvbmFsaXR5IChHdWlsZSBzdXBwb3J0KSwgaS5lLiwKICAgICAgICAgICItd2l0aC1zbW9icyIgaXMgbm93IHRoZSBkZWZhdWx0IGFuZCBubyBsb25nZXIgbmVlZHMgdG8gYmUKCSAgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUuCgo3LzUvMDAgIDogdHRuCiAgICAgICAgICBJbmNvcnBvcmF0ZWQgUnVieSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hc2FraSBGdWt1c2hpbWEuCgo2LzI4LzAwIDogdHRuCiAgICAgICAgICBBcHBsaWVkIG1vcmUtdGhhbi0xMC1hcmdzIGJ1Z2ZpeCBwYXRjaCBjb250cmlidXRlZAoJICBieSBNYXR0aGlhcyBLb2VwcGUuCgo2LzI3LzAwIDogYmVhemxleQogICAgICAgICAgUmV3cm90ZSBzb21lIG9mIHRoZSBzdHJpbmcgaGFuZGxpbmcgYW5kIGVsaW1pbmF0ZWQgdGhlIEMrKwogICAgICAgICAgaW1wbGVtZW50YXRpb24gKHdoaWNoIGlzIG5vdyBqdXN0IGEgd3JhcHBlcikuCgo2LzI3LzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBEb2MvaW5kZXguaHRtbCBhbmQgRG9jL2ludGVybmFscy5odG1sLiAgVGhlIHRhcmdldAogICAgICAgICAgYXVkaWVuY2UgZm9yIHRoZSBsYXR0ZXIgaXMgbmV3IFNXSUcgZGV2ZWxvcGVycy4KCgpWZXJzaW9uIDEuMyBBbHBoYSAzIChKdW5lIDE4LCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNi8xOC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIG5hbWluZy5jeHgsIGhhc2guY3h4LCBhbmQgc3ltYm9sLmN4eCBmaWxlcyBmcm9tCiAgICAgICAgICB0aGUgU1dJRzEuMSBkaXJlY3RvcnkuICAgQ29udGludWVkIHRvIG1pZ3JhdGUgdGhpbmdzIGF3YXkKICAgICAgICAgIGZyb20gdGhlIEMrKyBiYXNlIChhbHRob3VnaCB0aGVyZSdzIHN0aWxsIGEgbG90IG9mIHdvcmsgdG8gZG8pLgoKNi8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgZmV3IG1vcmUgZXhhbXBsZXMgdG8gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeS4gIFN0aWxsCiAgICAgICAgICBuZWVkIHRvIGRvIGEgbG90IG9mIHdvcmsgb24gdGhpcy4KCjYvMTYvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAtaW5jbHVkZWFsbCB0byBmb2xsb3cgYWxsICNpbmNsdWRlIHN0YXRlbWVudHMgaW4gdGhlCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCgo2LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHJpZWQgdG8gZml4IGFzIG1hbnkgQysrIHdhcm5pbmdzIGFzIHBvc3NpYmxlIHdoZW4gY29tcGlsaW5nCiAgICAgICAgICB3aXRoIHRoZSBTdW4gV29ya3Nob3AgQysrIGNvbXBpbGVyLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucwogICAgICAgICAgdGhhdCB0aGVyZSBhcmUgYSBsb3Qgb2Ygc3RhdGVtZW50cyB0aGF0IGNvbnRhaW4gc3RyaW5nIGxpdGVyYWxzCiAgICAgICAgICBvZiB0aGUgZm9ybSAoY2hhciopIkJsYWgiLgoKNi8xNS8wMDogIGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBjbGVhbnVwIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaW4gdGhlCiAgICAgICAgICBsb3ctbGV2ZWwgRE9IIGxpYnJhcnkuICAgVGhpcyBzZWVtcyB0byByZXN1bHQgaW4gYSBzcGVlZHVwCiAgICAgICAgICBvZiA1MC0xMDAlIGZvciBwcmVwcm9jZXNzaW5nIGFuZCBvdGhlciByZWxhdGVkIHRhc2tzLgoKNS8xMC8wMCA6IHR0bgoJICBBcHBsaWVkIHZhcmlhYmxlLXdyYXBwaW5nIGJ1Z2ZpeCBwYXRjaCBjb250cmlidXRlZAoJICBieSBNYXR0aGlhcyBLb2VwcGUuCgo0LzE3LzAwIDogdHRuCgkgIFVwZGF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgV2Ugbm93IHVzZSBhIGBTY2hlbWVfVHlwZSctYmFzZWQgc3RydWN0dXJlIHRvIHdyYXAgcG9pbnRlcnMuCgo0LzExLzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBmdXJ0aGVyIEd1aWxlLXN1cHBvcnQgcGF0Y2ggYnkgTWF0dGhpYXMgS29lcHBlLgoJICBUeXBlbWFwcyBwcmV2aW91c2x5IGRlbGV0ZWQgaGF2ZSBiZWVuIHJlLWFkZGVkLiAgVGhlcmUgaXMgbm93CgkgIGV4Y2VwdGlvbiBoYW5kbGluZyAoc2VlIERvYy9lbmdpbmVlcmluZy5odG1sKS4gIGBTV0lHX2luaXQnIGlzIG5vdwoJICBkZWNsYXJlZCBleHRlcm4gb25seSBmb3Igc2ltcGxlIGxpbmthZ2UuICBTb21lIGJ1Z3Mgd2VyZSBmaXhlZC4KCjQvMDYvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIE16U2NoZW1lIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgT2xlZyBUb2xtYXRjZXYuCgkgIFRoaXMgaW5jbHVkZXMgbmV3IGRpcmVjdG9yaWVzIExpYi9tenNjaGVtZSBhbmQgRXhhbXBsZXMvbXpzY2hlbWUuCgo0LzAzLzAwIDogdHRuCgkgIEFkZGVkIEV4YW1wbGVzL2d1aWxlIGFuZCBjaGlsZHJlbi4gIFRoaXMgaXMgYW4gYWRhcHRhdGlvbiBvZgoJICB0aGUgc2FtZS1uYW1lZCBkaXJlY3RvcnkgZnJvbSB0aGUgU1dJRy0xLjFwNSBkaXN0cmlidXRpb24uCgkgIEFkZGVkIEd1aWxlLXNwZWNpZmljIHNlY3Rpb24gdG8gRG9jL2VuZ2luZWVyaW5nLmh0bWwuCgo0LzAyLzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBuZXcgZ3VpbGVtYWluLmkgYnkgTWFydGluIEZyb2VobGljaC4KCSAgSW5jb3Jwb3JhdGVkIEd1aWxlLXN1cHBvcnQgcmV3cml0ZSBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFRoZSBjb21tYW5kIGxpbmUgb3B0aW9uICItd2l0aC1zbW9icyIgZW5hYmxlcyBpbXBsZW1lbnRhdGlvbiBvZgoJICBwb2ludGVyIHR5cGUgaGFuZGxpbmcgdXNpbmcgc21vYnMsIHRoZSBjYW5vbmljYWwgbWVjaGFuaXNtIGZvcgoJICBkZWZpbmluZyBuZXcgdHlwZXMgaW4gR3VpbGUuICBQcmV2aW91cyBpbXBsZW1lbnRhdGlvbiAodXNpbmcKCSAgc3RyaW5ncykgaXMgYXQgdGhlIG1vbWVudCBzdGlsbCBzdXBwb3J0ZWQgYnV0IGRlcHJlY2F0ZWQuICBBdAoJICBzb21lIHBvaW50LCAiLXdpdGgtc21vYnMiIHdpbGwgYmUgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlcgoJICByZXF1aXJlZC4KCjMvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBwdXJpZnkgcGF0Y2hlcyBzdWJtaXR0ZWQgYnkgUmFtIEJoYW1pZGlwYXR5LgoKMy8wMi8wMCA6IHR0bgogICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IEd1aWxlICJsaW5rYWdlIiBzY2hlbWVzLgoJICBDdXJyZW50bHksICItTGlua2FnZSBob2JiaXQiIHdvcmtzLgoKClZlcnNpb24gMS4zIEFscGhhIDIgKE1hcmNoIDEsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzI5LzAwIDogYmVhemxleQogICAgICAgICAgTWFkZSBTV0lHIGlnbm9yZSB0aGUgJ211dGFibGUnIGtleXdvcmQuCgoyLzI5LzAwIDogYmVhemxleQogICAgICAgICAgSW5jb3Jwb3JhdGVkIHNvbWUgcGF0Y2hlcyB0byB0aGUgUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8KICAgICAgICAgIHRoZSAtaGlkZSBvcHRpb24gYW5kIHRoZSBkZXN0cnVjdGlvbiBvZiBvYmplY3RzLgogICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEthcmwgRm9ybmVyLgoKMi8yNy8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUgc3VwcG9ydCBjb250cmlidXRlZCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFRoaXMgaW5jbHVkZXMgYSBjcHAgbWFjcm8gaW4gTGliL2d1aWxlL2d1aWxlLnN3ZyBhbmQgdGhlCgkgIGVudGlyZSBmaWxlIExpYi9ndWlsZS90eXBlbWFwcy5pLgoKMi8yNS8wMCA6IHR0bgoJICBNb2RpZmllZCBjb25maWd1cmUuaW4gYW5kIE1ha2VmaWxlLmluIGZpbGVzIHRvIHN1cHBvcnQKCSAgbm9uLWxvY2FsIGJ1aWxkICh1c2VmdWwgaW4gbXVsdGktYXJjaCBlbnZpcm9ubWVudHMpLgoKMi8yNC8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUgc3VwcG9ydCBjb250cmlidXRlZCBieSBDbGFyayBNY0dyZXcuCgkgIFRoaXMgd29ya3Mgd2l0aCBHdWlsZSAxLjMsIGJ1dCBzaW5jZSBpdCBkZXBlbmRzIGhlYXZpbHkKCSAgb24gdGhlIGdoXyBpbnRlcmZhY2UsIGl0IHNob3VsZCB3b3JrIGZvciBhbGwgbGF0ZXIgdmVyc2lvbnMuCgkgIEl0IGhhcyBub3QgYmVlbiB0ZXN0ZWQgd2l0aCB2ZXJzaW9ucyBiZWZvcmUgMS4zLgoJICBXQVJOSU5HOiBDb2RlIGlzIHVuc3RhYmxlIGR1ZSB0byBleHBlcmltZW50YXRpb24gYnkgdHRuLgoKMi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgdG8gdGhlIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzIGNvZGUgZ2VuZXJhdGlvbi4gIE1hbnkgb2YgdGhlc2UgcmVzdWx0IGluIHN1YnN0YW50aWFsCiAgICAgICAgICBydW50aW1lIHBlcmZvcm1hbmNlIGdhaW5zLiAgSG93ZXZlciwgdGhlc2UgaGF2ZSBjb21lIGF0CiAgICAgICAgICBhIGNvc3Qgb2YgcmVxdWlyaW5nIHRoZSB1c2Ugb2YgUHl0aG9uIDEuNS4yLiAgRm9yIG9sZGVyCiAgICAgICAgICB2ZXJzaW9ucywgdXNlICdzd2lnIC1ub29wdCAtcHl0aG9uJyB0byB0dXJuIG9mZiB0aGVzZQogICAgICAgICAgb3B0aW1pemF0aW9uIGZlYXR1cmVzLgoKVmVyc2lvbiAxLjMgQWxwaGEgMSAoRmVicnVhcnkgMTEsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMi8xMS8wMCA6IEFkZGVkICd2b2lkJyB0byBwcm90b3R5cGUgb2YgUHl0aG9uIG1vZHVsZSBpbml0aWFsaXplci4KICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmsgSG93c29uICgxLzIwLzAwKS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBjb2RlIHRvIGRpc2NhcmQgb3duZXJzaGlwIG9mIGFuCiAgICAgICAgICBvYmplY3Qgd2hlbmV2ZXIgaXQgaXMgYXNzaWduZWQgdG8gYSBtZW1iZXIgb2YgYW5vdGhlciBvYmplY3QuCiAgICAgICAgICBUaGlzIHByb2JsZW0gaGFzIGJlZW4gYXJvdW5kIGZvciBhd2hpbGUsIGJ1dCB3YXMgbW9zdCByZWNlbnRseQogICAgICAgICAgcmVwb3J0ZWQgYnkgQnVya2hhcmQgS2xvc3MgKDEyLzMwLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBicmFjZXMgYXJvdW5kIG1hY3JvcyBpbiB0aGUgZXhjZXB0aW9uLmkgbGlicmFyeS4gIFJlcG9ydGVkCiAgICAgICAgICBieSBCdWNrIEhvZGdlcyAoMTIvMTkvOTkpCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgYnVnIGluIHRoZSBjb25zdHJhaW50cy5pIGxpYnJhcnkuIFJlcG9ydGVkIGJ5IEJ1Y2sKICAgICAgICAgIEhvZGdlcyAoMTIvMTQvOTkpCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgVGhlICVuYXRpdmUgZGlyZWN0aXZlIG5vdyBnZW5lcmF0ZXMgVGNsOCBvYmplY3Qtc3R5bGUgY29tbWFuZCBjYWxscy4KICAgICAgICAgIEEgZnVsbCBzb2x1dGlvbiBmb3IgVGNsNyBhbmQgVGNsOCBpcyBzdGlsbCBuZWVkZWQuIFBhdGNoIHN1Z2dlc3RlZAogICAgICAgICAgYnkgTWlrZSBXZWlibGVuICgxMS8yOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgdHlwZW1hcCBjb2RlIHRvIGluY2x1ZGUgdGhlICRuZGltIHZhcmlhYmxlIGZvciBhcnJheXMuCiAgICAgICAgICBQYXRjaCBwcm92aWRlZCBieSBNaWNoZWwgU2FubmVyICgxMS8xMi85OSkuCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIFB5dGhvbiBtb2R1bGUgdG8gcmFpc2UgYSBSdW50aW1lIGVycm9yIGlmIGFuIGF0dGVtcHQKICAgICAgICAgIGlzIG1hZGUgdG8gc2V0IGEgcmVhZC1vbmx5IG1lbWJlciBvZiBhIHNoYWRvdyBjbGFzcy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICBNaWNoZWwgU2FubmVyICgxMS81Lzk5KS4KCjIvMTAvMDAgOiBUaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaGFzIGJlZW4gcmVtb3ZlZC4gSG93ZXZlciwgaXQgaXMgbGlrZWx5CiAgICAgICAgICB0byByZXR1cm4gYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgoKMi8xLzAwICA6IEFkZGVkIGEgbnVtYmVyIG9mIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3NpbmcgYW5kIHR5cGUtY2hlY2tpbmcgY29kZS4gIENvbnRyaWJ1dGVkIGJ5IFZhZGltIENodWd1bm92LgoKICAgICAgICAgIDEuIFJlbW92ZSBfa3dhcmdzIGFyZ3VtZW50IGZyb20gdGhlIHNoYWRvdyB3cmFwcGVycyB3aGVuIC1rZXl3b3JkCiAgICAgICAgICAgICBvcHRpb24gaXMgbm90IHNwZWNpZmllZC4gVGhpcyBzYXZlcyB1cyBhIGNvbnN0cnVjdGlvbiBvZiBrZXl3b3JkCiAgICAgICAgICAgICBkaWN0aW9uYXJ5IG9uIGVhY2ggbWV0aG9kIGNhbGwuCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZiwgKl9hcmdzLCAqKl9rd2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MsIF9rd2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIDIuIEluY29ycG9yYXRlIHNlbGYgaW50byB0aGUgX2FyZ3MgdHVwbGUuICBUaGlzIHNhdmVzIGF0IGxlYXN0IG9uZSB0dXBsZQogICAgICAgICAgICAgYWxsb2NhdGlvbiBwZXIgbWV0aG9kIGNhbGwuCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZiwgKl9hcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgKHNlbGYsKSArIF9hcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoKl9hcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIDMuIFJlbW92ZSAqUHRyIGNsYXNzZXMuCiAgICAgICAgICAgICBBc3N1bWUgdGhhdCB3ZSBhcmUgU1dJR2dpbmcgYSBjKysgY2xhc3MgQ3BwQ2xhc3MuCiAgICAgICAgICAgICBDdXJyZW50bHkgU1dJRyB3aWxsIGdlbmVyYXRlIGJvdGggQ3BwQ2xhc3NQdHIgY2xhc3MKICAgICAgICAgICAgIHRoYXQgaG9zdHMgYWxsIG1ldGhvZHMgYW5kIGFsc28gQ3BwQ2xhc3MgdGhhdCBpcyBkZXJpdmVkCiAgICAgICAgICAgICBmcm9tIHRoZSBmb3JtZXIgYW5kIGNvbnRhaW5zIGp1c3QgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAgICAgV2hlbiBDcHBDbGFzcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgaW50ZXJwcmV0ZXIgd2lsbCB0cnkKICAgICAgICAgICAgIHRvIGZpbmQgaXQgaW4gdGhlIENwcENsYXNzJ3MgZGljdGlvbmFyeSBmaXJzdCwgYW5kIG9ubHkgdGhlbgogICAgICAgICAgICAgY2hlY2sgdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgICAgQ3BwQ2xhc3NQdHIgZnVuY3Rpb25hbGl0eSBtYXkgYmUgZW11bGF0ZWQgd2l0aDoKCiAgICAgICAgICAgICBpbXBvcnQgbmV3CiAgICAgICAgICAgICBfbmV3X2luc3RhbmNlID0gbmV3Lmluc3RhbmNlCiAgICAgICAgICAgICBkZWYgQ3BwQ2xhc3NQdHIodGhpcyk6CiAgICAgICAgICAgICAgICAgIHJldHVybiBfbmV3X2luc3RhbmNlKENwcENsYXNzLCB7InRoaXMiOnRoaXMsInRoaXNvd24iOjB9KQoKICAgICAgICAgICAgIFRoaXMgc2F2ZXMgdXMgb25lIGRpY3Rpb25hcnkgbG9va3VwIHBlciBjYWxsLgoKICAgICAgICAgICAgIDxEQj5UaGUgbmV3IG1vZHVsZSB3YXMgZmlyc3QgYWRkZWQgaW4gUHl0aG9uLTEuNS4yIHNvIGl0CiAgICAgICAgICAgICB3b24ndCB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMuICBJJ3ZlIGltcGxlbWVudGVkIGFuCiAgICAgICAgICAgICBhbHRlcm5hdGl2ZSB0aGF0IGFjaGlldmVzIHRoZSBzYW1lIHRoaW5nPC9EQj4KCiAgICAgICAgICA0LiBVc2UgQ09iamVjdHMgaW5zdGVhZCBvZiBzdHJpbmdzIGZvciBwb2ludGVycy4KCiAgICAgICAgICBEYXZlOiBUaGlzIGVuaGFuY2VtZW50cyByZXN1bHQgaW4gc3BlZWR1cHMgb2YgdXAgdG8gNTAlIGluIHNvbWUKICAgICAgICAgIG9mIHRoZSBwcmVsaW1pbmFyeSB0ZXN0cyBJIHJhbi4KCjIvMS8wMCAgOiBVcGdyYWRlZCB0aGUgUHl0aG9uIG1vZHVsZSB0byB1c2UgYSBuZXcgdHlwZS1jaGVja2luZyBzY2hlbWUgdGhhdAogICAgICAgICAgaXMgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCBwcm92aWRlcyBiZXR0ZXIgcGVyZm9ybWFuY2UsIGFuZAogICAgICAgICAgaXMgbGVzcyBlcnJvciBwcm9uZS4gVW5mb3J0dW5hdGVseSwgaXQgd2lsbCBicmVhayBhbGwgY29kZSB0aGF0CiAgICAgICAgICBkZXBlbmRzIG9uIHRoZSBTV0lHX0dldFB0cigpIGZ1bmN0aW9uIGNhbGwgaW4gdHlwZW1hcHMuCiAgICAgICAgICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGNoYW5nZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBpZiAoU1dJR19HZXRQdHIoc3RyaW5nLCZwdHIsIl9Gb29fcCIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0NvbnZlcnRQdHIocHlvYmosICZwdHIsIFNXSUdfVFlQRV9Gb29fcCkgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3RlOiBJbiB0aGUgbmV3IGltcGxlbWVudGF0aW9uIFNXSUdfVFlQRV9Gb29fcCBpcyBubyBsb25nZXIKICAgICAgICAgIGEgdHlwZS1zaWduYXR1cmUgc3RyaW5nLCBidXQgcmF0aGVyIGFuIGluZGV4IGludG8gYSB0eXBlCiAgICAgICAgICBlbmNvZGluZyB0YWJsZSB0aGF0IGNvbnRhaW5zIHR5cGUgaW5mb3JtYXRpb24uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMzAvMDAgOiBsb2ljCgkgIENvbmRpdGlvbmFsbHkgY29tcGlsZSBleHBlcmltZW50YWwgY29kZSB3aXRoIC0tZW5hYmxlLWV4cGVyaW1lbnQKCSAgY29uZmlndXJlIGZsYWcuCgkgIEZpeCAuY3ZzaWdub3JlIHRvIGlnbm9yZSBjb25maWd1cmUgJiB5YWNjIGdlbmVyYXRlZCBmaWxlcwoKMS8yOC8wMCA6IGxvaWMKCSAgQXBwbHkgYXV0b21ha2UgZXZlcnl3aGVyZQoJICBLZWVwIGNvbmZpZ3VyZSBzY3JpcHRzIHNvIHRoYXQgcGVvcGxlIGFyZSBub3QgKmZvcmNlZCogdG8gYXV0b2NvbmYKICAgICAgICAgIEtlZXAgc291cmNlcyBnZW5lcmF0ZWQgYnkgeWFjYyBzbyB0aGF0IGNvbXBpbGF0aW9uIHdpdGhvdXQgeWFjYwoJICBpcyBwb3NzaWJsZS4KCSAgU291cmNlL0xQYXJzZS9jc2Nhbm5lci5jOiBjaGFuZ2UgbHlhY2MuaCBpbnRvIHBhcnNlci5oIHRvIHBsZWFzZQoJICBkZWZhdWx0IHlhY2MgZ2VuZXJhdGlvbiBydWxlcy4KCSAgVXNlIEFDX0NPTkZJR19TVUJESVJTIGluIGNvbmZpZ3VyZS5pbiBpbnN0ZWFkIG9mIGhhbmQgbWFkZSBzY3JpcHQuCgkgIFVwZGF0ZSBhbGwgcmVsZXZhbnQgLmN2c2lnbm9yZSB0byBpbmNsdWRlIC5kZXBzCgkgIEZpeGVkIG1pc3NpbmcgOyBsaW5lIDEzNiBTb3VyY2UvU3dpZy9zd2lnLmgKCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIG51bWJlciBvZiBtaW5vciBlbmQtb2YtZmlsZSBwYXJzaW5nIHByb2JsZW1zIGluIHRoZQogICAgICAgICAgcHJlcHJvY2Vzc29yLgoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1mcmVlemUgb3B0aW9uIHRoYXQgZm9yY2VzIFNXSUcgdG8gZnJlZXplIHVwb24gZXhpdC4KICAgICAgICAgIFRoaXMgaXMgb25seSB1c2VkIGFzIGEgZGVidWdnaW5nIHRvb2wgc28gdGhhdCBJIGNhbiBtb3JlCiAgICAgICAgICBlYXNpbHkgZXhhbWluZSBTV0lHJ3MgbWVtb3J5IGZvb3RwcmludC4KCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBwYXRjaCB0byBndWlsZSBtb2R1bGUgZm9yIHN1cHBvcnRpbmcgb3B0aW9uYWwgYXJndW1lbnRzCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBEaWV0ZXIgQmFyb24uCgoxLzEzLzAwIDogbG9pYwoJICBBZGRlZCAuY3ZzaWdub3JlLCBFeGFtcGxlcy8uY3ZzaWdub3JlLCBTb3VyY2UvRE9IL0RvaC8uY3ZzaWdub3JlCgkgIFNvdXJjZS9TV0lHMS4xL21haW4uY3h4OiBGaXhlZCAtSSBoYW5kbGluZyBidWcKCSAgU291cmNlL01vZHVsZXMxLjEvamF2YS5jeHg6IGZpeGVkIGNoYXIqIC0+IGNvbnN0IGNoYXIqIHdhcm5pbmdzIHRoYXQgYXJlCgkgIGVycm9ycyB3aGVuIGNvbXBpbGluZyB3aXRoIGdjYy0yLjk1LjIKCSAgU291cmNlL1NXSUcxLjEvbWFpbi5jeHg6IGNhc3QgY29uc3QgY2hhciogdG8gY2hhciogZm9yIFN0cmluZ19yZXBsYWNlCgkgIHRva2VuIGFuZCByZXAgc2hvdWxkIHJlYWxseSBiZSBjb25zdC4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBIYXJjbydzIEphdmEgbW9kdWxlcy4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXZva2VkIHRoZSAlaWZkZWYsICVpZm5kZWYsICVlbmRpZiwgJWlmLCAlZWxpZiwgYW5kICVlbHNlCiAgICAgICAgICBkaXJlY3RpdmVzLiAgVGhlc2UgYXJlIG5vIGxvbmdlciBuZWVkZWQgYXMgU1dJRyBub3cgaGFzIGEgcmVhbAogICAgICAgICAgcHJlcHJvY2Vzc29yLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgTW92ZWQgdGhlIGRvY3VtZW50YXRpb24gbW9kdWxlcyBmcm9tIHRoZSBTV0lHIGRpcmVjdG9yeQogICAgICAgICAgdG8gdGhlIE1vZHVsZXMgZGlyZWN0b3J5ICh3aGVyZSB0aGV5IHJlYWxseSBzaG91bGQgaGF2ZSBiZWVuCiAgICAgICAgICB0byBiZWdpbiB3aXRoKS4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtc3RhdCBvcHRpb24gZm9yIHByaW50aW5nIHN0YXRpc3RpY3MuIFRoZQogICAgICAgICAgc3RhdGlzdGljcyByZXBvcnRpbmcgd2FzIGluYWRlcXVhdGUgYW5kIG1vc3RseSBicm9rZW4KICAgICAgICAgIGFueXdheS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC10IG9wdGlvbiBmb3IgcmVhZGluZyBhIHR5cGVtYXAgZmlsZS4gIE1vcmUKICAgICAgICAgIHRyb3VibGUgdGhhbiBpdCdzIHdvcnRoLiAgSnVzdCBpbmNsdWRlIHR5cGVtYXBzIGF0IHRoZSB0b3AKICAgICAgICAgIG9mIHRoZSBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlICVjaGVja291dCBkaXJlY3RpdmUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtY2kgb3B0aW9uIGZvciBmaWxlIGNoZWNraW4uICAgVG9vIHByb2JsZW1hdGljCiAgICAgICAgICB0byBpbXBsZW1lbnQuICBQcm9iYWJseSBiZXR0ZXIgdG8ganVzdCBwdXQgeW91ciBTV0lHIGxpYnJhcnkKICAgICAgICAgIHVuZGVyIENWUyBpbnN0ZWFkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqLgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIERlbGV0ZWQgdGhlIExBVEVYIG1vZHVsZS4gIFNvcnJ5Li4uIERpZG4ndCBrbm93IGFueW9uZQogICAgICAgICAgd2hvIHdhcyB1c2luZyBpdC4gIEJlc2lkZXMsIEknbSBsb29raW5nIHRvIHNpbXBsaWZ5CiAgICAgICAgICB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgQVNDSUkgZG9jdW1lbnRhdGlvbiBtb2R1bGUgdG8gdXNlIGEgLnR4dAogICAgICAgICAgc3VmZml4IGZvciBpdHMgb3V0cHV0IGZpbGUgaW5zdGVhZCBvZiAuZG9jLgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHRoZSBsb25nLWxvc3QgU1dJRyBwcmVwcm9jZXNzb3IgYmFjayB0byB0aGUgc3lzdGVtLgogICAgICAgICAgSXQgc2hvdWxkIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gIFJhdyBwcmVwcm9jZXNzZWQgb3V0cHV0CiAgICAgICAgICBjYW4gYmUgdmlld2VkIHVzaW5nIHN3aWcgLUUgZmlsZS5pLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMS8xMS8wMCA6IGJlYXpsZXkgYW5kIGRqbWl0Y2hlCiAgICAgICAgICBDb21wbGV0ZWx5IHJlb3JnYW5pemVkIHRoZSBTV0lHIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuICBUaGUKICAgICAgICAgIGJhc2ljIG9yZ2FuaXphdGlvbiBpcyBub3c6CgogICAgICAgICAgICAgICAgU291cmNlLyAgICAgICAgIFNXSUcgc291cmNlIGNvZGUKICAgICAgICAgICAgICAgIExpYi8gICAgICAgICAgICBTV0lHIGxpYnJhcnkgZmlsZXMgKHN3aWdfbGliKQogICAgICAgICAgICAgICAgRG9jLyAgICAgICAgICAgIERvY3VtZW50YXRpb24KICAgICAgICAgICAgICAgIEV4YW1wbGVzLyAgICAgICBFeGFtcGxlcwoKICAgICAgICAgIE1vcmUgZGlyZWN0b3JpZXMgd2lsbCBiZSBhZGRlZCBhcyBuZWVkZWQuCgoxMi8wOC85OTogTG9pYyBEYWNoYXJ5IChsb2ljQHNlbmdhLm9yZykKCSAgRW5oYW5jZWQgcGFja2FnZSBoYW5kbGluZyBmb3IgcGVybDUgYW5kIGMrKy4KCgkgIFdpdGggbmV3IG9wdGlvbiAtaGlkZSBGb286OkJhciwgZXZlcnkgcGVybDUgb2JqZWN0IChGcm9iKSBpcwoJICBxdWFsaWZpZWQgYnkgRm9vOjpCYXI6OkZyb2IuIFRoZSBwYWNrYWdlIG5hbWUgaXMgc29sZWx5IHVzZWQKCSAgdG8gZW5jYXBzdWxhdGUgQy9DKysgd3JhcHBlcnMgb3V0cHV0IGluIDxtb2R1bGU+X3dyYXAuYyBhbmQgdGhlCgkgIGNvcnJlc3BvbmRpbmcgcGVybCBwYWNrYWdlIGluIDxtb2R1bGU+LnBtLiBOb3RlIHRoYXQgYSBwYWNrYWdlCgkgIG5hbWUgbWF5IGNvbnRhaW4gOjogKEZyb2I6Ok5pdHopIGFuZCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZQoJICBwYWNrYWdlIG5hbWUgcHJvdmlkZWQgYnkgLWhpZGUgKEZvbzo6QmFyOjpGcm9iOjpOaXR6KS4KCgkgIEluICpfd3JhcC5jLCBTV0lHX2luaXQgbWFjcm8gaXMgdXNlZC4gV2FzIHByZXZpb3VzbHkgZGVmaW5lZAoJICBidXQgbm90IHVzZWQgYW5kIHNpbXBsaWZpZXMgY29kZS4KCgkgIEFkZGVkIHR5cGVtYXAocGVybDUscGVybDVpbikgYW5kIHR5cGVtYXAocGVybDUscGVybDVvdXQpIHRoYXQKCSAgZG8gdGhlIGVxdWl2YWxlbnQgb2YgdHlwZW1hcChwZXJsNSxpbikgYW5kIHR5cGVtYXAocGVybDUsb3V0KQoJICBidXQgY29udGFpbiBwZXJsIGNvZGUgYW5kIGFwcGxpZXMgdG8gd3JhcHBlcnMgZ2VuZXJhdGVkIGJ5CgkgIC1zaGFkb3cuCgoJICBMYWNraW5nIHByb3BlciByZWdyZXNzaW9uIHRlc3RzIEkgdXNlZAoJICBFeGFtcGxlcy9wZXJsNS97YysrLGNvbnN0cmFpbnQsZGVmYXJnLGV4Y2VwdCwKCSAgZ3JhcGgvZ3JhcGhbMTIzNF0sbXVsdGluaGVyaXQsbmVzdGVkLHNoYWRvdyxzaW1wbGUsdHJlZSwKCSAgdHlwZW1hcHMve2FyZ3YsYXJndjIsYXJyYXltZW1iZXIsZGF0YWJhc2UsZmlsZSxpZ25vcmUsaW50ZWdlciwKCSAgb3V0cHV0LHBhc3NyZWYscmVmZXJlbmNlLHJldHVybn19Ly4gSSByYW4gc3dpZyB3aXRoIGFuZCB3aXRob3V0CgkgIHRoZSBwYXRjaGVzLCBkaWZmIHRoZSBnZW5lcmF0ZWRzb3VyY2VzLCBydW4gdGhlIC5wbCBmaWxlcwoJICBhbmQgY2hlY2tlZCB0aGF0IHRoZSByZXN1bHRzIGFyZSBpZGVudGljYWwuIEluIGFsbCB0aG9zZSBleGFtcGxlcwoJICBJIGhhZCBubyBlcnJvci4KCjExLzIxLzk5OiBNb2RpZmllZCB0aGUgVGNsIG1vZHVsZSB0byBwcm92aWRlIGZ1bGwgdmFyaWFibGUgbGlua2luZyBjYXBhYmlsaXRpZXMKICAgICAgICAgIHRvIGFsbCBkYXRhdHlwZXMuICAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGEgcGFpciBvZiBhY2Nlc3NvciBmdW5jdGlvbnMKICAgICAgICAgIHdlcmUgY3JlYXRlZCBmb3IgZGF0YXR5cGVzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBUY2xfTGlua1ZhcigpIGZ1bmN0aW9uLgogICAgICAgICAgTm93LCB3ZSBzaW1wbHkgdXNlIHZhcmlhYmxlIHRyYWNlcyB0byBzdXBwb3J0IGV2ZXJ5dGhpbmcuIFRoaXMgbWF5CiAgICAgICAgICBicmVhayBzY3JpcHRzIHRoYXQgcmVseSB1cG9uIHRoZSBvbGRlciBiZWhhdmlvci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjEvOTk6IEFkZGVkIHNsaWdodCB0d2VhayB0byB3cmFwcGVyIGdlbmVyYXRvciB0byBjb2xsZWN0IGxvY2FsIHZhcmlhYmxlcwogICAgICAgICAgb2Ygc2ltaWxhciB0eXBlLiAgUHJvZHVjZXMgc29tZXdoYXQgbW9yZSBjb21wYWN0IHdyYXBwZXIgY29kZS4KCjExLzIwLzk5OiBNb2RpZmllZCB0aGUgVGNsIG1vZHVsZSB0byB1c2UgU1dJR19HZXRBcmdzKCkgdG8gcGFyc2UKICAgICAgICAgIGFyZ3VtZW50cy4gICAgVGhpcyBpcyBhIHRlY2huaXF1ZSBib3Jyb3dlZCBmcm9tIFB5dGhvbiBpbiB3aGljaAogICAgICAgICAgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdXNpbmcgYSBmb3JtYXQgc3RyaW5nIGNvbnZlbnRpb24gc2ltaWxpYXIKICAgICAgICAgIHRvIGZwcmludGYoKS4gICBUaGlzIHJlc3VsdHMgaW4gYSAqc3Vic3RhbnRpYWwqIHJlZHVjdGlvbiBpbiB0aGUKICAgICAgICAgIHNpemUgb2YgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUgd2l0aCBvbmx5IGEgbW9kZXN0IHJ1bnRpbWUgb3ZlcmhlYWQKICAgICAgICAgIGluIGdvaW5nIHRocm91Z2ggdGhlIGV4dHJhIGNvbnZlcnNpb24gZnVuY3Rpb24uCgoxMS8xMy85OTogQ29tcGxldGVseSByZXdyb3RlIHRoZSBjbGFzcy9zdHJ1Y3R1cmUgZ2VuZXJhdGlvbiBjb2RlIGZvciB0aGUKICAgICAgICAgIFRjbCBtb2R1bGUuICBOb3csIGEgc21hbGwgc2V0IG9mIHJ1bnRpbWUgZnVuY3Rpb25zIGFyZSB1c2VkCiAgICAgICAgICB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBjbGFzc2VzIChpbnN0ZWFkIG9mIGEKICAgICAgICAgIG1hc3NpdmUgYW1vdW50IG9mIHJ1bnRpbWUgY29kZSBiZWluZyBnZW5lcmF0ZWQgZm9yIGVhY2ggY2xhc3MpLgogICAgICAgICAgQ2xhc3Mgc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgc2ltcGx5IGVuY29kZWQgaW4gYSBzZXJpZXMgb2YKICAgICAgICAgIHN0YXRpYyB0YWJsZXMuICAgVGhpcyByZXN1bHRzIGluIGEgKkhVR0UqIHJlZHVjdGlvbiBpbiB3cmFwcGVyCiAgICAgICAgICBjb2RlIHNpemUtLWVzcGVjaWFsbHkgZm9yIEMrKy4KCjExLzEzLzk5OiBSZW1vdmVkIHRoZSAtdGNsIChUY2wgNy54KSBtb2R1bGUuICBUY2wgOC4wIGlzIG5vdyBzZXZlcmFsCiAgICAgICAgICB5ZWFycyBvbGQgYW5kIHRoZSBkZWZhY3RvIHN0YW5kYXJkLS1ubyByZWFsIHJlYXNvbiB0byBrZWVwCiAgICAgICAgICBzdXBwb3J0aW5nIHRoZSBvbGQgdmVyc2lvbiBhdCB0aGlzIHBvaW50LgoKMTEvMTMvOTk6IENsZWFuZWQgdXAgLWMgb3B0aW9uIGZvciBQeXRob24gbW9kdWxlLiAgVGhlIHB5ZXhwLnN3ZyBmaWxlCiAgICAgICAgICBpcyBub3cgZ29uZS4KCjExLzEzLzk5OiBGaXhlZCBleHRlcm5hbCBkZWNsYXJhdGlvbnMgdG8gd29yayBiZXR0ZXIgd2l0aCBzdGF0aWMgbGlua2luZwogICAgICAgICAgb24gV2luZG93cy4gIFN0YXRpYyBsaW5raW5nIHNob3VsZCBub3cgYmUgcG9zc2libGUgYnkgZGVmaW5pbmcKICAgICAgICAgIHRoZSAtRFNUQVRJQ19MSU5LIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgUGF0Y2ggY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IEFsYmVydG8gRm9uc2VjYS4KCjExLzUvOTkgOiBGaXhlZCBhbiBvYnNjdXJlIGNvZGUgZ2VuZXJhdGlvbiBidWcgcmVsYXRlZCB0byB0aGUgZ2VuZXJhdGlvbgogICAgICAgICAgb2YgZGVmYXVsdCBjb25zdHJ1Y3RvcnMuICAgQnVnIHJlcG9ydGVkIGJ5IEJyYWQgQ2xlbWVudHMuCgoxMS81Lzk5IDogRml4ZWQgYSBmZXcgbWVtb3J5IHByb2JsZW1zIGZvdW5kIGJ5IHB1cmlmeS4KCjExLzUvOTkgOiBPZmZpY2lhbGx5IGRlcHJlY2F0ZWQgdGhlIC1odGNsLCAtaHRrLCBhbmQgLXBsdWdpbiBvcHRpb25zCiAgICAgICAgICBmcm9tIHRoZSBUY2wgYW5kIFRjbDggbW9kdWxlcy4KCjEwLzI2Lzk5OiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBmcm9tIHB5dGhvbi90eXBlbWFwcy5pLiAgUGF0Y2gKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IEtlaXRoIERhdmlkc29uLgoKOC8xNi85OSA6IEFkZGVkIF9XSU4zMiBzeW1ib2wgdG8gbGlicmFyaWVzIHRvIGJldHRlciBzdXBwb3J0IFdpbmRvd3MuCgo4LzE2Lzk5IDogRGVwcmVjYXRlZCB0aGUgUGVybDQgbW9kdWxlLiAgIEl0IGlzIG5vIGxvbmdlciBpbmNsdWRlZCBpbiB0aGUKICAgICAgICAgIGRpc3RyaWJ1dGlvbiBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIEluIHRoZSBlbnRpcmUgMyB5ZWFycyBTV0lHCiAgICAgICAgICBoYXMgYmVlbiBhcm91bmQgSSBuZXZlciByZWNlaXZlZCBhIHNpbmdsZSBjb21tZW50IGFib3V0IGl0IHNvIEknbQogICAgICAgICAgYXNzdW1pbmcgbm8gb25lIHdpbGwgbWlzcyBpdC4uLgoKOC8xNi85OSA6IE1vZGlmaWVkIHRoZSB0eXBlLWNoZWNraW5nIGNvZGUgdG8gcmVnaXN0ZXIgdHlwZSBtYXBwaW5ncyB1c2luZyBhCiAgICAgICAgICB0YWJsZSBpbnN0ZWFkIG9mIHJlcGVhdGVkIGNhbGxzIHRvIFNXSUdfUmVnaXN0ZXJNYXBwaW5nKCkuICBUaGlzCiAgICAgICAgICByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gc29tZXdoYXQuCgo4LzE1Lzk5IDogQ2xlYW5lZCB1cCB0aGUgcG9pbnRlciB0eXBlLWNoZWNraW5nIGNvZGUgaW4gdGhlIFRjbCBtb2R1bGUuCgo4LzE1Lzk5IDogTWFueSBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJpZXMgdG8gc3VwcG9ydCBydW50aW1lIGxpYnJhcmllcy4KCjgvMTMvOTkgOiBFbGltaW5hdGVkIEMrKyBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzIGFib3V0IGV4dGVybiAiQyIgbGlua2FnZS4KCjgvMTMvOTkgOiBTb21lIGNsZWFudXAgb2YgUHl0aG9uIC5zd2cgZmlsZXMgdG8gYmV0dGVyIHN1cHBvcnQgcnVudGltZSBsaWJyYXJpZXMKICAgICAgICAgIG9uIFdpbmRvd3MuCgo4LzEzLzk5IDogTW9kaWZpZWQgdGhlICVwcmFnbWEgZGlyZWN0aXZlIHRvIGF0dGFjaCBwcmFnbWFzIGRlY2xhcmVkIGluc2lkZQogICAgICAgICAgYSBjbGFzcyBkZWZpbml0aW9uIHRvIHRoZSBjbGFzcyBpdHNlbGYuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgZm9vIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAlcHJhZ21hKHB5dGhvbikgYWRkdG9tZXRob2QgPSAiaW5zZXJ0OnByaW50IGBoZWxsbyB3b3JsZCciCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBNb3N0IHBlb3BsZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGhvdyB0aGlzIHdvcmtzLiAgRm9yIHBlb3BsZQogICAgICAgICAgd3JpdGluZyBiYWNrZW5kIG1vZHVsZXMsIGNsYXNzLWJhc2VkIHByYWdtYXMgd29yayBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIGxhbmctPmNwcF9vcGVuX2NsYXNzKCkgICAgICAgICAgICAgLy8gT3BlbiBhIGNsYXNzCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX3ByYWdtYSgpICAgICAgICAgICAgICAgICAvLyBTdXBwbHkgcHJhZ21hcwogICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1pdCBtZW1iZXJzCgogICAgICAgICAgICAgIGxhbmctPmNwcF9jbG9zZV9jbGFzcygpICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNsYXNzCgogICAgICAgICAgQWxsIG9mIHRoZSBwcmFnbWFzIGFyZSBwYXNzZWQgZmlyc3Qgc2luY2UgdGhleSBtaWdodCBiZSB1c2VkIHRvCiAgICAgICAgICBhZmZlY3QgdGhlIGNvZGUgZ2VuZXJhdGlvbiBvZiBvdGhlciBtZW1iZXJzLiAgIFBsZWFzZSBzZWUKICAgICAgICAgIHRoZSBQeXRob24gbW9kdWxlIGZvciBhbiBleGFtcGxlLiAgIFBhdGNoZXMgY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IFJvYmluIER1bm4uCgo4LzEzLzk5IDogUGF0Y2ggdG8gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHRvIGVsaW1pbmF0ZSBpZ25vcmVkCiAgICAgICAgICBleGNlcHRpb24gZXJyb3JzIGluIGRlc3RydWN0b3JzLiAgUGF0Y2ggY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IFJvYmluIER1bm4uCgo4LzExLzk5IDogTWlub3IgcGF0Y2ggdG8gc3dpZ19saWIvcHl0aG9uL3N3aWdwdHIuc3dnICAoYWRkZWQgU1dJR1NUQVRJQwogICAgICAgICAgZGVjbGFyYXRpb24pLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTHlsZSBKb2huc29uLgoKOC8xMS85OSA6IEFkZGVkIEZJUlNUS0VZL05FWFRLRVkgbWV0aG9kcyB0byBQZXJsNSBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGVubmlzIE1hcnNhLgoKOC8xMS85OSA6IE1vZGlmaWVkIFB5dGhvbiBtb2R1bGUgc28gdGhhdCBOVUxMIHBvaW50ZXJzIGFyZSByZXR1cm5lZAogICAgICAgICAgYW5kIHBhc3NlZCBhcyAnTm9uZS4nICBQYXRjaCBjb250cmlidXRlZCBieSBUYWwgU2hhbGlmLgoKOC8xMC85OSA6IEZpeGVkIG1pc3NpbmcgJ2ludCcgc3BlY2lmaWVycyBpbiB2YXJpb3VzIHBsYWNlcy4KCjgvMTAvOTkgOiBBZGRlZCBXaW5kb3dzIG1ha2VmaWxlIGZvciBSdW50aW1lIGxpYnJhcmllcy4gIENvbnRyaWJ1dGVkCiAgICAgICAgICBieSBCb2IgVGVjaGVudGluLgoKOC8xMC85OSA6IEZpeGVkIG1pbm9yIHByb2JsZW0gaW4gUHl0aG9uIHJ1bnRpbWUgbWFrZWZpbGUgaW50cm9kdWNlZAogICAgICAgICAgYnkga2V5d29yZCBhcmd1bWVudHMuCgo4LzgvOTkgIDogQ2hhbmdlZCAkdGFyZ2V0IG9mIHBlcmw1KG91dCkgdHlwZW1hcCBmcm9tIFNUKDApIHRvCiAgICAgICAgICBTVChhcmd2aSkuICBQYXRjaCBjb250cmlidXRlZCBieSBHZW9mZnJleSBIb3J0LgoKOC84Lzk5ICA6IEZpeGVkIGJ1ZyBpbiB0eXBlbWFwIGNoZWNraW5nIHJlbGF0ZWQgdG8gdGhlIEFOWSBrZXl3b3JkCiAgICAgICAgICBpbiBhcnJheXMgYW5kIGlnbm9yZWQgYXJndW1lbnRzLiAgRXJyb3IgcmVwb3J0ZWQgYnkKICAgICAgICAgIEdlb2ZmcmV5IEhvcnQuCgo4LzgvOTkgIDogJWVuYWJsZWRvYyBhbmQgJWRpc2FibGVkb2MgZGlyZWN0aXZlcyBjYW4gbm93IGJlIHVzZWQKICAgICAgICAgIGluc2lkZSBjbGFzcy9zdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICAgSG93ZXZlciwgbm8gY2hlY2sKICAgICAgICAgIGlzIG1hZGUgdG8gc2VlIGlmIHRoZXkgYXJlIGJhbGFuY2VkIChpLmUuLCBhICVkaXNhYmxlZG9jCiAgICAgICAgICBkaXJlY3RpdmUgaW5zaWRlIGEgY2xhc3MgZG9lcyBub3QgaGF2ZSB0byBoYXZlIGEgbWF0Y2hpbmcKICAgICAgICAgICVlbmFibGVkb2MgaW4gdGhlIHNhbWUgY2xhc3MpLgoKOC84Lzk5ICA6IEtleXdvcmQgYXJndW1lbnQgaGFuZGxpbmcgaXMgbm93IHN1cHBvcnRlZCBpbiB0aGUgUHl0aG9uCiAgICAgICAgICBtb2R1bGUuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbnQgZm9vKGNoYXIgKmJhciwgaW50IHNwYW0sIGRvdWJsZSB4KTsKCiAgICAgICAgICBDYW4gYmUgY2FsbGVkIGZyb20gUHl0aG9uIGFzCgogICAgICAgICAgICAgICBmb28oeCA9IDMuNCwgYmFyPSJoZWxsbyIsIHNwYW09NDIpCgogICAgICAgICAgVG8gZW5hYmxlIHRoaXMgZmVhdHVyZSwgcnVuIFNXSUcgd2l0aCB0aGUgJy1rZXl3b3JkJyBjb21tYW5kCiAgICAgICAgICBsaW5lIG9wdGlvbi4gICAgTWl4aW5nIGtleXdvcmQgYW5kIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICBzaG91bGQgd29yayBhcyB3ZWxsLiAgIFVubmFtZWQgYXJndW1lbnRzIGFyZSBhc3NpZ25lZCBuYW1lcwogICAgICAgICAgc3VjaCBhcyAiYXJnMSIsICJhcmcyIiwgZXRjLi4uCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBGdW5jdGlvbnMgd2l0aCBkdXBsaWNhdGUgYXJndW1lbnQgbmFtZXMgc3VjaCBhcwogICAgICAgICAgYmFyKGludCAqT1VUUFVULCBpbnQgKk9VVFBVVCkgd2lsbCBsaWtlbHkgY2F1c2UgcHJvYmxlbWF0aWMKICAgICAgICAgIHdyYXBwZXIgY29kZSB0byBiZSBnZW5lcmF0ZWQuICAgVG8gZml4IHRoaXMsICB1c2UgZGlmZmVyZW50CiAgICAgICAgICBuYW1lcyBvciB1c2UgJWFwcGx5IHRvIG1hcCB0eXBlbWFwcyB0byBhbHRlcm5hdGUgbmFtZXMuCgo4LzgvOTkgIDogSGFuZGxpbmcgb2YgdGhlICd0aGlzJyBwb2ludGVyIGhhcyBiZWVuIGNoYW5nZWQgaW4gUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFByZXZpb3VzbHksIGRlcmVmZXJlbmNpbmcgb2YgJy50aGlzJyBvY2N1cnJlZCBpbiB0aGUKICAgICAgICAgIFB5dGhvbiBzaGFkb3cgY2xhc3MgaXRzZWxmLiAgIE5vdywgdGhpcyBzdGVwIG9jY3VycyBpbiB0aGUgQwogICAgICAgICAgd3JhcHBlcnMgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKCiAgICAgICAgICAgICAgICBTV0lHX0dldFB0ck9iaihQeU9iamVjdCAqLCB2b2lkICoqcHRyLCBjaGFyICp0eXBlKQoKICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgY29udGFpbmluZyBhIHBvaW50ZXIKICAgICAgICAgIG9yIGEgc2hhZG93IGNsYXNzIGluc3RhbmNlIHdpdGggYSAnLnRoaXMnIGF0dHJpYnV0ZSBvZgogICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZS4gIFRoaXMgY2hhbmdlIGFsbG93cyB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgIDEuICBUaGUgcmVhbCBzaGFkb3cgY2xhc3MgaW5zdGFuY2UgZm9yIGFuIG9iamVjdCBpcwogICAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgQyB3cmFwcGVycyB3aGVyZSBpdCBjYW4gYmUgZXhhbWluZWQvbW9kaWZpZWQKICAgICAgICAgICAgICBieSB0eXBlbWFwcy4KCiAgICAgICAgICAyLiAgSGFuZGxpbmcgb2YgZGVmYXVsdC9rZXl3b3JkIGFyZ3VtZW50cyBpcyBub3cgZ3JlYXRseQogICAgICAgICAgICAgIHNpbXBsaWZpZWQuCgogICAgICAgICAgMy4gIFRoZSBQeXRob24gd3JhcHBlciBjb2RlIGlzIG11Y2ggbW9yZSBzaW1wbGUuCgogICAgICAgICAgUGx1cywgaXQgZWxpbWluYXRlZCBtb3JlIHRoYW4gMzAwIGxpbmVzIG9mIEMrKyBjb2RlIGluIHRoZQogICAgICAgICAgUHl0aG9uIG1vZHVsZS4KCiAgICAgICAgICAqKiogQ0FWRUFUIDogVGhpcyByZXF1aXJlcyB0aGUgYWJzdHJhY3Qgb2JqZWN0IGludGVyZmFjZS4KICAgICAgICAgIEl0IHNob3VsZCB3b3JrIHdpdGggUHl0aG9uIDEuNCwgYnV0IHByb2JhYmx5IG5vdGhpbmcgb2xkZXIKICAgICAgICAgIHRoYW4gdGhhdC4KCgo4LzgvOTkgIDogRml4ZWQgaGFuZGxpbmcgb2YgImNvbnN0IiBhbmQgcG9pbnRlcnMgaW4gY2xhc3Nlcy4gIEluIHBhcnRpY3VsYXIsCiAgICAgICAgICBkZWNsYXJhdGlvbnMgc3VjaCBhcwoKICAgICAgICAgICBjbGFzcyBmb28gewogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICBjb25zdCBjaGFyICptc2c7CiAgICAgICAgICAgICBjb25zdCBpbnQgICppcHRyOwogICAgICAgICAgfQoKICAgICAgICAgIGFyZSBoYW5kbGVkIGFzIGFzc2lnbmFibGUgdmFyaWFibGVzIGFzIG9wcG9zZWQgdG8gY29uc3RhbnQKICAgICAgICAgIHZhbHVlcyAodGhpcyBpcyB0aGUgY29ycmVjdCBiZWhhdmlvciBpbiBDL0MrKykuICAgTm90ZToKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzICJjaGFyICpjb25zdCBtc2ciIGFyZSBzdGlsbCB1bnN1cHBvcnRlZC4KICAgICAgICAgIENvbnN0YW50cyBkZWNsYXJlZCBhdCB0aGUgZ2xvYmFsIGxldmVsIHVzaW5nIGNvbnN0IGFyZSBhbHNvCiAgICAgICAgICBicm9rZW4gKGJlY2F1c2UgSSBoYXZlIGEgbnVtYmVyIG9mIGludGVyZmFjZXMgdGhhdCByZWx5IHVwb24KICAgICAgICAgIHRoaXMgYmVoYXZpb3IpLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0CiAgICAgICAgICBtaXN0YWtlbmx5IHRyZWF0ICdjb25zdCBjaGFyIConIHR5cGVzIGFzIGNvbnN0YW50IHZhbHVlcy4KCjgvOC85OSAgOiBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIHN1cHBvcnQgYml0LWZpZWxkcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19rZXl3b3JkIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfZXh0ZXJuICA6IDE7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX3N0YXRpYyAgOiAxOwogICAgICAgICAgfSBmbGFnczsKCiAgICAgICAgICBCaXQtZmllbGRzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gaW50ZWdlciB0eXBlcyBhbmQgdGhlaXIKICAgICAgICAgIGFyZSBvdGhlciByZXN0cmljdGlvbnMuICBTV0lHIHBlcmZvcm1zIG5vIHN1Y2ggdHlwZS1jaGVja2luZwogICAgICAgICAgKGFsdGhvdWdoIHRoZSBDIGNvbXBpbGVyIHdpbGwgY2F0Y2ggcHJvYmxlbXMgd2hlbiBpdCB0cmllcyB0bwogICAgICAgICAgY29tcGlsZSB0aGUgd3JhcHBlciBjb2RlKS4KCjgvOC85OSAgOiBSZW1vdmVkIHRyYWlsaW5nIHNwYWNlIG9mICRiYXNldHlwZSBzdWJzdGl0dXRpb24gaW4gdHlwZW1hcHMuCiAgICAgICAgICBUaGlzIGlzIHRvIGFsbG93IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgJXR5cGVtYXAocHl0aG9uLCBhcmdvdXQpIHNwYW0qKiBPVVRQVVR7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgY2hhciogYSA9ICIkYmFzZXR5cGVfcCI7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICB9CgogICAgICAgICAgKFBhdGNoIHN1Z2dlc3RlZCBieSBOYXRoYW4gRHVuZmllbGQpLgoKNi8yMi85OSA6IE1hZGUgYSB2ZXJ5IHNsaWdodCB0d2VhayB0byB0aGUgUGVybDUgc2hhZG93IGNsYXNzCiAgICAgICAgICBjb2RlIHRoYXQgYWxsb3dzIHR5cGVtYXBzIHRvIGFsdGVyIHRoZSByZXR1cm4gdHlwZQogICAgICAgICAgb2Ygb2JqZWN0cyAodG8gc3VwcG9ydCBwb2x5bW9ycGhpYyB0eXBlcykuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgRHJha2UgRGllZHJpY2guCgo0LzgvOTkgIDogRml4ZWQgbnVsbCBwb2ludGVyIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsIG1vZHVsZS4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjMvMTcvOTkgOiBGaXhlZCBidWcgaW4gcGVybDVwdHIuc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR3JlZyBBbmRlcnNvbi4KCjIvMjcvOTkgOiBFbGltaW5hdGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIFN3aWcgcnVucyBvbgogICAgICAgICAgZW1wdHkgZmlsZXMuCgoyLzI3Lzk5IDogQWRkZWQgcGF0Y2ggdG8gR3VpbGUgbW9kdWxlIHRvIGVsaW1pbmF0ZSB1bnVzZWQKICAgICAgICAgIHZhcmlhYmxlcy4gICBDb250cmlidXRlZCBieSBNaWtlIFNpbW9ucy4KCjIvMjcvOTkgOiBGaXhlZCBwcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgcmV0dXJuaW5nIHJlZmVyZW5jZXMuCgoyLzI3Lzk5IDogRml4ZWQgUnVudGltZS9NYWtlZmlsZS4gUGF0Y2ggY29udHJpYnV0ZWQgYnkKICAgICAgICAgIE1pa2UgUm9tYmVyZy4KCjIvMjcvOTkgOiBJbmNvcnBvcmF0ZWQgcGF0Y2hlcyB0byB0aGUgdHlwZS1jaGVja2VyLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAtZXhwb3J0YWxsIHN3aXRjaCBhbmQgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIGluIFBlcmw1IG1vZHVsZS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjIvMjcvOTkgOiBNb2RpZmllZCBQZXJsNSBtb2R1bGUgdG8gcmVjb2duaXplICd1bmRlZicgYXMgYSBOVUxMIGNoYXIgKi4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgUGVybDUgbW9kdWxlIHRvIHN1cHBvcnQgdGhlIG5ld2VyIHZlcnNpb25zIG9mCiAgICAgICAgICBBY3RpdmVTdGF0ZSBQZXJsIGZvciBXaW4zMi4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgaW5jbHVkZSBvcmRlciBvZiBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgIC1JIG9wdGlvbi4KCjIvNS85OC0gOiBEYXZlIGZpbmlzaGVzIGhpcyBkaXNzZXJ0YXRpb24sIGdvZXMgam9iIGh1bnRpbmcsIG1vdmVzIHRvCjIvNS85OSAgICBDaGljYWdvIGFuZCBnZW5lcmFsbHkgdGhyYXNoZXMgYWJvdXQuCgpWZXJzaW9uIDEuMSBQYXRjaCA1IChGZWJydWFyeSA1LCAxOTk4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMi80Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoZW4gZGlmZmVyZW50IHBhY2thZ2UKICAgICAgICAgIGxvY2F0aW9ucyBhcmUgc3BlY2lmaWVkICgtLXdpdGgtdGNsaW5jbCwgZXRjLi4uKS4KCjIvMi85OCAgOiBGaXhlZCBuYW1lLWNsYXNoIGJ1ZyByZWxhdGVkIHRvIHRoZSBzd2l0Y2ggdG8gQyBtYWNyb3MgZm9yIGFjY2Vzc29yCiAgICAgICAgICBmdW5jdGlvbnMuICBUaGUgbmV3IHNjaGVtZSBkaWQgbm90IHdvcmsgY29ycmVjdGx5IGZvciBvYmplY3RzCiAgICAgICAgICB3aXRoIG1lbWJlcnMgc3VjaCBhcyAnb2JqJywgJ3ZhbCcsIGV0Yy4uLiAgIEZpeGVkIHRoZSBidWcgYnkKICAgICAgICAgIGFwcGVuZGluZyB0aGUgd29yZCAnc3dpZycgdG8gbWFjcm8gYXJndW1lbnQgbmFtZXMuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgUnVkeSBBbGJhY2h0ZW4uCgoyLzIvOTggIDogU2xpZ2h0IGZpeCB0byB0aGUgUGVybDUgbW9kdWxlIHRvIGVsaW1pbmF0ZSB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICBhYm91dCAndmFybmFtZSB1c2VkIG9ubHkgb25jZSA6IHBvc3NpYmxlIHR5cG8nLiAgRml4CiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjEvOS85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUGVybCA1IG1vZHVsZSByZWxhdGVkIHRvIHRoZSBjcmVhdGlvbiBvZgogICAgICAgICAgY29uc3RhbnRzIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjEvOS85OCAgOiBGaXhlZCBsaW5raW5nIGJ1ZyB3aXRoIFB5dGhvbiAxLjUgZW1iZWQuaSBsaWJyYXJ5IGZpbGUuCgpWZXJzaW9uIDEuMSBQYXRjaCA0IChKYW51YXJ5IDQsIDE5OTgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEvNC85OCAgOiBDaGFuZ2VkIHN0cnVjdHVyZWQgb2YgdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSB0byBiZSBtb3JlIGZyaWVuZGx5CiAgICAgICAgICB0byBCb3JsYW5kIEMrKy4KCjEvNC85OCAgOiBBZGRlZCB0aGUgZnVuY3Rpb24gTWFrZWZpbGUud2luLmJjIGZvciBjb21waWxpbmcgdGhlIGV4YW1wbGVzCiAgICAgICAgICB1bmRlciBCb3JsYW5kIDUuMi4KCjEvNC85OCAgOiBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwZXJsNSBtb2R1bGUgYW5kIEMrKyBjb21waWxhdGlvbi4gIFRoZQogICAgICAgICAgPG1hdGguaD4gbGlicmFyeSBpcyBub3cgaW5jbHVkZWQgYmVmb3JlIGFueSBQZXJsIGhlYWRlcnMKICAgICAgICAgIGJlY2F1c2UgUGVybCB0aGUgZXh0ZXJuICJDIiBsaW5rYWdlIG9mIG1hdGguaCBzY3Jld3MgYWxvdAogICAgICAgICAgb2YgdGhpbmdzIHVwIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MpLgoKMS8yLzk4ICA6IENoYW5nZSB0byB0aGUgUHl0aG9uIG1vZHVsZSB0aGF0IHJlZHVjZXMgdGhlIG51bWJlciBvZiBjb25zdGFudHMKICAgICAgICAgIGNyZWF0ZWQgYnkgQysrIGNsYXNzZXMsIGluaGVyaXRhbmNlLCBhbmQgc2hhZG93IGNsYXNzZXMuICAgVGhpcwogICAgICAgICAgbW9kaWZpY2F0aW9uIG1heSBpbnRyb2R1Y2UgYSBmZXcgc2xpZ2h0IGluY29tcGF0aWJpbGl0aWVzIGlmCiAgICAgICAgICB5b3UgYXR0ZW1wdCB0byB1c2UgdGhlIG5vbi1zaGFkb3cgY2xhc3MgaW50ZXJmYWNlIHdpdGggc2hhZG93CiAgICAgICAgICBjbGFzc2VzIGVuYWJsZWQuICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IE1pa2UgUm9tYmVyZy4KCjEvMi85OCAgOiBTdXBwb3J0IGZvciBUY2wgOC4wIG5hbWVzcGFjZXMgaGFzIGJlZW4gYWRkZWQuICAgVGhpcyAqcmVwbGFjZXMqCiAgICAgICAgICB0aGUgb3JpZ2luYWwgU1dJRyBtZWNoYW5pc20gdGhhdCBhc3N1bWVkIFtpbmNyIFRjbF0gbmFtZXNwYWNlcy4KICAgICAgICAgIFRvIHVzZSBuYW1lc3BhY2VzLCBzaW1wbHkgcnVuIFNXSUcgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnMKCiAgICAgICAgICAgICBzd2lnIC10Y2wgLW5hbWVzcGFjZSAgZm9vLmkKCiAgICAgICAgICAgICAgICAgICAgVGhpcyBwbGFjZXMgZXZlcnl0aGluZyBpbiBhIG5hbWVzcGFjZSB0aGF0IG1hdGNoZXMKICAgICAgICAgICAgICAgICAgICB0aGUgbW9kdWxlIG5hbWUKCiAgICAgICAgICAgICBzd2lnIC10Y2wgLW5hbWVzcGFjZSAtcHJlZml4IGJhciBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIHRoZSBuYW1lc3BhY2UgJ2JhcicKCiAgICAgICAgICBUaGUgdXNlIG9mIG5hbWVzcGFjZXMgaXMgbmV3IGluIFRjbCA4LjAuICBIb3dldmVyLCB0aGUgd3JhcHBlciBjb2RlCiAgICAgICAgICBnZW5lcmF0ZWQgYnkgU1dJRyB3aWxsIHN0aWxsIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMgb2YgVGNsIG5ld2VyCiAgICAgICAgICB0aGFuIGFuZCBpbmNsdWRpbmcgVGNsIDcuMy9UazMuNiBldmVuIGlmIHRoZSAtbmFtZXNwYWNlIG9wdGlvbiBpcwogICAgICAgICAgdXNlZC4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBleGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCByZWxpZWQgb24gdGhlCiAgICAgICAgICAtcHJlZml4IGFuZCAtbmFtZXNwYWNlIG9wdGlvbnMuCgoxLzIvOTggIDogQWRkZWQgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgdG8gdGhlIFRjbCB3cmFwcGVyIGNvZGUKCiAgICAgICAgICAgICAgICAgU1dJR19uYW1lICAgICAgLSBOYW1lIG9mIHRoZSBTV0lHIG1vZHVsZQogICAgICAgICAgICAgICAgIFNXSUdfcHJlZml4ICAgIC0gUHJlZml4L25hbWVzcGFjZSBhcHBlbmRlZCB0byBjb21tYW5kIG5hbWVzCiAgICAgICAgICAgICAgICAgU1dJR19uYW1lc3BhY2UgLSBOYW1lIG9mIHRoZSBuYW1lc3BhY2UKCiAgICAgICAgICBTV0lHIGxpYnJhcnkgd3JpdGVycyBjYW4gdXNlIHRoZXNlIHRvIHRoZWlyIGFkdmFudGFnZXMuCgoxLzIvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIFRjbDggbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBwb2ludGVyIGNvbnN0YW50cyAodGhlIGZ1bmN0aW9uIFNXSUdfTWFrZVB0ciB3YXMgbWlzc2luZyBmcm9tCiAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlKS4KCjEvMi85OCAgOiBBZGRlZCB0aGUgY29uc3RoYXNoLmkgbGlicmFyeSBmaWxlIHRvIHRoZSBUY2wgYW5kIFRjbDggbW9kdWxlcy4KCjEvMS85OCAgOiBDaGFuZ2VkIGFuZCBjbGVhbmVkIHVwIHRoZSBQeXRob24gdHlwZW1hcHMuaSBmaWxlLiAgIFRoZSBmb2xsb3dpbmcKICAgICAgICAgIHNpZ25pZmljYW50IGNoYW5nZXMgd2VyZSBtYWRlIDoKCiAgICAgICAgICAgICAgICAxLiAgVGhlIE9VVFBVVCB0eXBlbWFwIG5vdyByZXR1cm5zIFB5dGhvbiB0dXBsZXMgaW5zdGVhZCBvZgogICAgICAgICAgICAgICAgICAgIGxpc3RzLiAgIExpc3RzIGNhbiBiZSByZXR1cm5lZCBhcyBiZWZvcmUgYnkgdXNpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgTF9PVVRQVVQgdHlwZS4gICAgSWYgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zCiAgICAgICAgICAgICAgICAgICAgaXMgbmVlZGVkLCBydW4gU1dJRyB3aXRoIHRoZSAtRE9VVFBVVF9MSVNUIG9wdGlvbi4KCiAgICAgICAgICAgICAgICAyLiAgVGhlIEJPVEggdHlwZW1hcCBoYXMgYmVlbiByZW5hbWVkIHRvIElOT1VULiAgRm9yIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHksIHRoZSAiQk9USCIgbWV0aG9kIHN0aWxsIGV4aXN0cyBob3dldmVyLgoKICAgICAgICAgICAgICAgIDMuICBPdXRwdXQgdHlwZW1hcHMgbm93IGdlbmVyYXRlIGxlc3MgY29kZSB0aGFuIGJlZm9yZS4KCiAgICAgICAgICBDaGFuZ2VzIHRvIHR5cGVtYXBzLmkgbWF5IGJyZWFrIGV4aXN0aW5nIFB5dGhvbiBzY3JpcHRzIHRoYXQgYXNzdW1lCiAgICAgICAgICBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgYSBsaXN0LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8zMS85NzogRml4ZWQgbG9uZyBvdmVyZHVlIHByb2JsZW1zIHdpdGggdGhlIHRlc3Rpbmcgc2NyaXB0cyBhbmQgY2VydGFpbgogICAgICAgICAgbWFrZWZpbGVzIHRoYXQgcmVxdWlyZWQgdGhlIHVzZSBvZiB0aGUgYmFzaCBzaGVsbC4gICBFdmVyeXRoaW5nIHNob3VsZAogICAgICAgICAgd29yayBwcm9wZXJseSB3aXRoIHRoZSBzdGFuZGFyZCBCb3VybmUgc2hlbGwgKHNoKSBub3cuCgoxMi8zMS85NzogTW9kaWZpZWQgdHlwZW1hcHMgdG8gYWxsb3cgJGJhc2V0eXBlIGFzIGEgdmFsaWQgbG9jYWwgdmFyaWFibGUuCiAgICAgICAgICBUaGlzIGFsbG93cyBmb3IgYWxsIHNvcnRzIG9mIGJpemFycmUgaGFja2lzaCB0eXBlbWFwcyB0aGF0CiAgICAgICAgICBkbyBjb29sIHRoaW5ncy4gICBQYXRjaCBjb250cmlidXRlZCBieSBEb21pbmlxdWUgRHVtb250LgoKMTIvMzEvOTc6IFN3aXRjaGVkIGFjY2Vzc29yIGZ1bmN0aW9ucyBnZW5lcmF0ZWQgZm9yIG1lbWJlciBkYXRhIHRvCiAgICAgICAgICBDIHByZXByb2Nlc3NvciBtYWNyb3MgKGV4Y2VwdCBpbiBjYXNlcyBpbnZvbHZpbmcgdHlwZW1hcHMKICAgICAgICAgIG9yIGNoYXIgKikuCgoxMi8zMS85NzogRml4ZWQgYSBidWcgcmVsYXRlZCB0byBDKysgbWVtYmVyIGRhdGEgaW52b2x2aW5nIHJlZmVyZW5jZXMuCgoxMi8zMS85NzogQ2hhbmdlZCBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIEMrKyBtZW1iZXIgZnVuY3Rpb25zIHRvCiAgICAgICAgICBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgIFRoaXMgY2xlYW5zIHVwIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGFuZCByZXN1bHRzIGluIGZld2VyIGZ1bmN0aW9uIGRlZmluaXRpb25zLgoKMTIvMzEvOTc6IENoYW5nZWQgdGhlIGRlZmF1bHQgQyBjb25zdHJ1Y3RvciB0byB1c2UgY2FsbG9jKCkgaW5zdGVhZAogICAgICAgICAgb2YgbWFsbG9jKCkKCjEyLzMwLzk3OiBDaGFuZ2VkIHRoZSBjcmVhdGlvbiBvZiBjb25zdGFudHMgaW4gdGhlIFBlcmw1IG1vZHVsZS4KICAgICAgICAgIEZvciBhbGwgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGV5IHNob3VsZCB3b3JrIGluIGV4YWN0bHkgdGhlCiAgICAgICAgICBzYW1lIHdheSBhcyBiZWZvcmUgZXhjZXB0IHRoYXQgdGhleSBub3cgcmVxdWlyZSBtdWNoIGxlc3MKICAgICAgICAgIHdyYXBwZXIgY29kZS4gICBNb2R1bGVzIGNvbnRhaW5pbmcgbGFyZ2UgbnVtYmVycyBvZgogICAgICAgICAgY29uc3RhbnRzIG1heSBzZWUgZ3JlYXRlciB0aGFuIGEgNTAlIHJlZHVjdGlvbiBpbiB3cmFwcGVyCiAgICAgICAgICBjb2RlIHNpemUuCgoxMi8zMC85NzogTW9kaWZpZWQgdGhlIFB5dGhvbiBtb2R1bGUgdG8gYmUgbW9yZSBpbnRlbGxpZ2VudCBhYm91dCB0aGUKICAgICAgICAgIGNyZWF0aW9uIG9mIGNvbnN0YW50cy4gIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyByZWR1bmRhbnQKICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHRoZSBzaXplIG9mIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24KICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBiZSByZWR1Y2VkLiAgIChNYW55IHRoYW5rcyB0byBKaW0gRnVsdG9uKS4KCjEyLzI5Lzk3OiBGaXhlZCBhIGJ1ZyBpbiBDKysgY29kZSBnZW5lcmF0aW9uIHJlbGF0ZWQgdG8gbWVtYmVyIGZ1bmN0aW9ucywKICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzLCBhbmQgcmVmZXJlbmNlcy4KCjEyLzI5Lzk3OiBGaXhlZCBjb25maWd1cmUgc2NyaXB0IGFuZCBhIGZldyBtYWtlZmlsZXMgdG8gc3VwcG9ydCBQeXRob24gMS41CgoxMi8yOS85NzogQWRkZWQgJ2VtYmVkMTUuaScgbGlicmFyeSBmaWxlLiAgVGhpcyBmaWxlIHNob3VsZCBiZSB1c2VkIHRvCiAgICAgICAgICBzdGF0aWNhbGx5IGxpbmsgdmVyc2lvbnMgb2YgUHl0aG9uIDEuNS4gICAgVG8gbWFrZSBpdCB0aGUgZGVmYXVsdCwKICAgICAgICAgIHNpbXBseSBjb3B5ICdzd2lnX2xpYi9weXRob24vZW1iZWQxNS5pJyB0byAnc3dpZ19saWIvcHl0aG9uL2VtYmVkLmknCgpWZXJzaW9uIDEuMSBQYXRjaCAzIChOb3ZlbWJlciAyNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgd2l0aCBzaGFkb3cgY2xhc3NlcyBhbmQKICAgICAgICAgIHN0YXRpYyBjbGFzcyBmdW5jdGlvbnMgdGhhdCByZXR1cm4gY2xhc3MgaW5zdGFuY2VzLgogICAgICAgICAgTm90ZSA6IFRoZSBmaXggZm9yIHRoaXMgYnVnIHJlcXVpcmVzIGEgc2xpZ2h0IHJlc3RydWN0dXJpbmcgb2YKICAgICAgICAgIG9mIHRoZSAucG0gZmlsZXMgY3JlYXRlZCBieSBTV0lHLgoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBUY2wvVGNsOCBtb2R1bGVzIHJlbGF0ZWQgdG8gdmFyaWFibGUgbGlua2luZwogICAgICAgICAgb2YgY2hhcmFjdGVyIGFycmF5cy4gIElmIHlvdSBkZWNsYXJlZCBhIGdsb2JhbCB2YXJpYWJsZSAnY2hhciBmb29bMTBdJywKICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIHdvdWxkIGVpdGhlciBjYXVzZSBhIHNlZ21lbnRhdGlvbiBmYXVsdAogICAgICAgICAgaW1tZWRpYXRlbHkgdXBvbiBsb2FkaW5nIG9yIHdlaXJkIG1lbW9yeSBjb3JydXB0aW9uIGVsc2V3aGVyZS4KICAgICAgICAgIFRoaXMgc2hvdWxkIG5vdyBiZSBmaXhlZCBhbHRob3VnaCBjaGFyYWN0ZXIgYXJyYXlzIGNhbiBvbmx5IGJlCiAgICAgICAgICByZWFkLW9ubHkuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUgdGhhdCBjYXVzZWQgaXQgdG8KICAgICAgICAgIGZhaWwgaWYgZmlsZXMgd2VyZSBpbXBvcnRlZCBmcm9tIGRpcmVjdG9yaWVzIG90aGVyIHRoYW4KICAgICAgICAgIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgoKMTEvMjMvOTc6IEZpeGVkIGluY29ycmVjdCBkaWFnbm9zdGljIG1lc3NhZ2UgaW4gdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24KICAgICAgICAgIG1vZHVsZS4KCjExLzIzLzk3OiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiB0aGUgLW8gb3B0aW9uIHdoZW4gdXNlZCB3aXRoIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gSWYgLW8gd2FzIHVzZWQgdG8gc3BlY2lmeSBib3RoIHRoZSBwYXRobmFtZSBhbmQgZmlsZW5hbWUKICAgICAgICAgIG9mIFNXSUcncyBvdXRwdXQgc3VjaCBhcwoKICAgICAgICAgICAgICAgICBzd2lnIC1vIC9ob21lL3N3aWcvd3JhcHBlci5jIC1zaGFkb3cgLXBlcmw1IGZvby5pCgogICAgICAgICAgVGhlIHdyYXBwZXIgY29kZSB3b3VsZCBiZSBwbGFjZWQgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggLW8sCiAgICAgICAgICBidXQgdGhlIC5wbSBmaWxlIGFuZCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIHBsYWNlZCBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSB3aGVyZSBTV0lHIHdhcyBydW4uICAgTm93LCB0aGVzZSBmaWxlcyBhcmUgcGxhY2VkCiAgICAgICAgICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggdGhlIC1vIG9wdGlvbi4KICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGFsc28gbmVlZGVkIGZvciBwcm9wZXIgb3BlcmF0aW9uIG9uIHRoZQogICAgICAgICAgTWFjaW50b3NoLgoKMTEvMjMvOTc6IEFkZGVkIGEgJ3RoaXMoKScgbWV0aG9kIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLiAgIFRoaXMgY2FuCiAgICAgICAgICBiZSB1c2VkIHRvIHJldHVybiB0aGUgbm9ybWFsIHBvaW50ZXIgdmFsdWUgZnJvbSBhIHNoYWRvdwogICAgICAgICAgY2xhc3MgdGhhdCBpcyByZXByZXNlbnRlZCBhcyBhIHRpZWQgaGFzaC4gICBUbyB1c2UganVzdAogICAgICAgICAgaW52b2tlIGFzIGEgbWV0aG9kIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICRsID0gbmV3IExpc3Q7ICAgICAgICMgQ3JlYXRlIGFuIG9iamVjdAogICAgICAgICAgICAgICRwdHIgPSAkbC0+dGhpcygpOyAgICMgR2V0IHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZQoKICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzIzLzk3OiBGaXhlZCB0aGUgVGNsIDggcG9pbnRlci5pIGxpYnJhcnkgZmlsZSAod2hpY2ggd2FzIGNvbXBsZXRlbHkKICAgICAgICAgIGJyb2tlbiBpbiAxLjFwMikuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIFBlcmw1IHR5cGUtY2hlY2tlciB0byBmaXggYSBmZXcgcHJvYmxlbXMKICAgICAgICAgIHdpdGggZ2xvYmFsIHZhcmlhYmxlcyBvZiBwb2ludGVyIHR5cGVzIGFuZCB0byBhbGxvdwogICAgICAgICAgdGllZCBoYXNoZXMgdG8gYmUgdXNlZCBpbnRlcmNoYW5nYWJseSB3aXRoIG5vcm1hbAogICAgICAgICAgcG9pbnRlciB2YWx1ZXMuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIHR5cGVtYXAgbWVjaGFuaXNtIHRvIGFsbG93IG91dHB1dAogICAgICAgICAgdHlwZW1hcHMgb2YgdHlwZSAndm9pZCcuICAgVGhlc2Ugd2VyZSBpZ25vcmVkIHByZXZpb3VzbHksCiAgICAgICAgICBidXQgbm93IGlmIHlvdSBzcGVjaWZ5LAoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGxhbmcsb3V0KSB2b2lkIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiByZXR1cm4gYSB2b2lkIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFlvdSBjYW4gY2hhbmdlIG9yIGFzc2lnbiBhIHJldHVybiB2YWx1ZSB0byB0aGUgZnVuY3Rpb24uCgoxMS8yMy85NzogRml4ZWQgcHJvY2Vzc2luZyBvZiAnYm9vbCcgZGF0YXR5cGVzIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMTEvMjMvOTc6IEZpeGVkIG1pbm9yIHBhcnNpbmcgZXJyb3Igd2l0aCBDKysgaW5pdGlhbGl6ZXJzLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgQigpIDogQSgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2w4IG1vZHVsZSBzbyB0aGF0IEMgZnVuY3Rpb25zIHRoYXQgY2FsbCBiYWNrIGludG8KICAgICAgICAgIFRjbCBkb24ndCBjb3JydXB0IHRoZSByZXR1cm4gcmVzdWx0IG9iamVjdCAoU1dJRyB3YXMgZ2F0aGVyaW5nCiAgICAgICAgICB0aGUgcmVzdWx0IG9iamVjdCB0b28gZWFybHkgd2hpY2ggbGVhZHMgdG8gcHJvYmxlbXMgaWYgc3Vic2VxdWVudAogICAgICAgICAgVGNsIGNhbGxzIGFyZSBtYWRlKS4KCjExLzIzLzk3OiBGaXhlZCBhIGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gdGhlIFB5dGhvbiBtb2R1bGUgd2hlbiB0d28gb3IKICAgICAgICAgIG1vcmUgb3V0cHV0IHBhcmFtZXRlcnMgd2VyZSB1c2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudHMgb2YgYQogICAgICAgICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICVpbmNsdWRlIHR5cGVtYXBzLmkKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKk9VVFBVVCwgZG91YmxlICpPVVRQVVQsIGRvdWJsZSBhKTsKCiAgICAgICAgICBQcmV2aW91c2x5LCBkb2luZyB0aGlzIHJlc3VsdGVkIGluIHRoZSBjcmVhdGlvbiBvZiBhbgogICAgICAgICAgZXh0cmFuZW91cyBjb21tYSBpbiB0aGUgb3V0cHV0LCByZXN1bHRpbmcgaW4gYSBDIHN5bnRheCBlcnJvci4KCjExLzIyLzk3OiBGaXhlZCBhIGJ1ZyB3aGVuIHRlbXBsYXRlIGhhbmRsaW5nIHRoYXQgd2FzIHN0cmlwcGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICBhcm91bmQgbmVzdGVkIHRlbXBsYXRlcy4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIEZvbzxCYXI8ZG91YmxlPiA+CgogICAgICAgICAgd2FzIGdldHRpbmcgbXVuZ2VkIGludG8gRm9vPEJhcj4+IHdoaWNoIGlzIGEgc3ludGF4IGVycm9yIGluCiAgICAgICAgICBpbiB0aGUgQysrIGNvbXBpbGVyLgoKMTEvMjIvOTc6IEZpeGVkIGJ1Z3MgaW4gdGhlIEJvcmxhbmQgQysrIG1ha2VmaWxlcy4KCjExLzIyLzk3OiBGaXhlZCBtZW1vcnkgY29ycnVwdGlvbiBidWcgd2hlbiBwcm9jZXNzaW5nIGludGVnZXIKICAgICAgICAgIGFyZ3VtZW50cyBpbiBUY2w4IG1vZHVsZS4KCjExLzIxLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUnVudGltZS9NYWtlZmlsZSByZWxhdGVkIHRvIFRjbCA4LgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIHdpdGggdGhlICVuZXcgZGlyZWN0aXZlIGFuZCBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgIE5vIGxvbmdlciBnZW5lcmF0ZXMgYSBwZXJsIHN5bnRheCBlcnJvci4KCjExLzkvOTcgOiBDaGFuZ2VkIGEgc3RybmNweSgpIHRvIHN0cmNweSgpIGluIHRoZSBwb2ludGVyIHR5cGUtY2hlY2tlci4KICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhIHN1YnN0YW50aWFsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGluCiAgICAgICAgICB0eXBlLWNoZWNraW5nLgoKMTAvMjkvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBjb2RlIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBhcmd1bWVudHMgYW5kCiAgICAgICAgICB1c2VyLWRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKFZlY3RvciBhLCBWZWN0b3IgYiA9IGQpOwoKICAgICAgICAgIHNob3VsZCBub3cgd29yayBwcm9wZXJseS4KClZlcnNpb24gMS4xIFBhdGNoIDIgKFNlcHRlbWJlciA0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvNC85NyAgOiBGaXhlZCBwcm9ibGVtIHdpdGggaGFuZGxpbmcgb2YgdmlydHVhbCBmdW5jdGlvbnMgdGhhdAogICAgICAgICAgd2FzIGludHJvZHVjZWQgYnkgc29tZSBjaGFuZ2VzIGluIHRoZSBDKysgbW9kdWxlLgoKVmVyc2lvbiAxLjEgUGF0Y2ggMSAoQXVndXN0IDI3LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo4LzI2Lzk3IDogRml4ZWQgY29tcGlsYXRpb24gYW5kIHJ1bi10aW1lIGJ1Z3Mgd2l0aCBUY2wgOC4wIGZpbmFsLgoKOC8yMS85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2l0aCBhcnJheXMgYXBwZWFyaW5nIGFzIGFyZ3VtZW50cwogICAgICAgICAgdG8gQysrIG1lbWJlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgQmFyKGludCBhWzIwXVsyMF0pOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICBUaGVyZSBpcyBzdGlsbCBhIGJ1ZyB1c2luZyBhcnJheXMgd2l0aCBhZGRlZCBtZXRob2RzCiAgICAgICAgICBob3dldmVyLgoKOC8yMC85NyA6IEZpeGVkIGEgYnVnIHdpdGggZ2VuZXJhdGluZyB0aGUgY29kZSBmb3IgYWRkZWQgbWV0aG9kcwogICAgICAgICAgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo4LzE5Lzk3IDogTW9kaWZpZWQgdGhlIHR5cGVtYXBwZXIgdG8gc3Vic3RpdHV0ZSB0aGUgJyRhcmcnIHZhbHVlCiAgICAgICAgICB3aGVuIGRlY2xhcmluZyBsb2NhbCB2YXJpYWJsZXMuICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqIChkb3VibGUgdGVtcF8kYXJnKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIGRvIHNvbWV0aGluZyAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgV2hlbiBhcHBsaWVkIHRvIGEgcmVhbCBmdW5jdGlvbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOgoKICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKmEsIGRvdWJsZSAqYiwgZG91YmxlICpyZXN1bHQpOwoKICAgICAgICAgIHRocmVlIGxvY2FsIHZhcmlhYmxlcyB3aWxsIGJlIGNyZWF0ZWQgYXMgZm9sbG93cyA6CgogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX2E7CiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYjsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9yZXN1bHQ7CgogICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB3aGVuIHdyaXRpbmcgbXVsdGlwbGUgdHlwZW1hcHMgdGhhdCBuZWVkCiAgICAgICAgICB0byBhY2Nlc3MgdGhlIHNhbWUgbG9jYWwgdmFyaWFibGVzLgoKCjcvMjcvOTcgOiBGaXhlZCBhIHZhcmlldHkgb2YgcHJvYmxlbXMgd2l0aCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSBhbmQgYXJyYXlzLgogICAgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlcyBvZiBkZWNsYXJhdGlvbnMgc2hvdWxkIG5vdyB3b3JrIDoKCiAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgW0FOWV0geyBSZWFsIFtBTlldIH07CiAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgWzRdIHsgZG91YmxlIFsxMF0gfTsKCiAgICAgICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiBhcHBseSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSB7IFJlYWwgfTsKCiAgICAgICAgICBzaG91bGQgbm93IHdvcmstLWV2ZW4gaWYgYXJyYXlzIGludm9sdmluZyBkb3VibGVzIGFuZCBSZWFscyBhcmUKICAgICAgICAgIHVzZWQgbGF0ZXIuCgo3LzI3Lzk3IDogQ2hhbmdlZCB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgIkFycmF5IFggaGFzIGJlZW4gY29udmVydGVkIHRvIFkiIHRvCiAgICAgICAgICBvbmx5IGFwcGVhciBpZiBydW5uaW5nIFNXSUcgaW4gdmVyYm9zZSBtb2RlLgoKNy8yNy85NyA6IEFkZGVkIHRoZSB2YXJpYWJsZXMgJHBhcm1uYW1lIGFuZCAkYmFzZW1hbmdsZSB0byB0aGUgdHlwZW1hcAogICAgICAgICAgZ2VuZXJhdG9yLiAgICAkcGFybW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB1c2VkCiAgICAgICAgICB3aGVuIHRoZSB0eXBlbWFwIHdhcyBtYXRjaGVkLiAgSXQgbWF5IGJlICIiIGlmIG5vIHBhcmFtZXRlcgogICAgICAgICAgd2FzIHVzZWQuICAgJGJhc2VtYW5nbGUgaXMgYSBtYW5nbGVkIHZlcnNpb24gb2YgdGhlIGJhc2UKICAgICAgICAgIGRhdGF0eXBlLiAgICBTb21ldGltZXMgdXNlZCBmb3IgYXJyYXkgaGFuZGxpbmcuCgo3LzI3Lzk3IDogQ2hhbmdlZCB0aGUgYmVoYXZpb3Igb2Ygb3V0cHV0IGFyZ3VtZW50cyB3aXRoIFB5dGhvbiBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgIE9yaWdpbmFsbHksIGlmIGEgZnVuY3Rpb24gcmV0dXJuZWQgYW4gb2JqZWN0ICdGb28nLCB0aGUgc2hhZG93IGNsYXNzCiAgICAgICAgICBtZWNoYW5pc20gd291bGQgY3JlYXRlIGNvZGUgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICBkZWYgcmV0dXJuX2ZvbygpOgogICAgICAgICAgICAgICAgICAgICAgdmFsID0gRm9vUHRyKHNoYWRvd2MucmV0dXJuX2ZvbygpKQogICAgICAgICAgICAgICAgICAgICAgdmFsLnRoaXMgPSAxCiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgVGhlIHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgdHlwZW1hcHMgYWxsb3cgYSB1c2VyIHRvIHJlZGVmaW5lCiAgICAgICAgICB0aGUgb3V0cHV0IGJlaGF2aW9yIG9mIGEgZnVuY3Rpb24tLWFzIGEgcmVzdWx0LCB3ZSBjYW4gbm8gbG9uZ2VyCiAgICAgICAgICBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgcmV0dXJuIHR5cGUgYmVpbmcgYSBwb2ludGVyIG9yCiAgICAgICAgICBldmVuIGJlaW5nIGEgc2luZ2xlIHZhbHVlIGZvciB0aGF0IG1hdHRlciAoaXQgY291bGQgYmUgYSBsaXN0LAogICAgICAgICAgdHVwbGUsIGV0Yy4uLikuICAgSWYgU1dJRyBkZXRlY3RzIHRoZSB1c2Ugb2Ygb3V0cHV0IHR5cGVtYXBzCiAgICAgICAgICAoZWl0aGVyICJvdXQiIG9yICJhcmdvdXQiKSBpdCByZXR1cm5zIHRoZSByZXN1bHQgdW5tb2RpZmllZCBsaWtlCiAgICAgICAgICB0aGlzIDoKCiAgICAgICAgICAgICAgICBkZWYgcmV0dXJuX2ZvbygpOgogICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2hhZG93Yy5yZXR1cm5fZm9vKCkKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byBkbwogICAgICAgICAgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIChpbmNsdWRpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIGNvbnZlcnRpbmcgaXQKICAgICAgICAgIGludG8gYSBQeXRob24gY2xhc3MpLgoKNy8yNi85NyA6IEZpeGVkIGEgcGFyc2luZyBwcm9ibGVtIHdpdGggdHlwZXMgbGlrZSAndW5zaWduZWQgbG9uZyBpbnQnLAogICAgICAgICAgJ3Vuc2lnbmVkIHNob3J0IGludCcsIGV0Yy4uLgoKNy8yNC85NyA6IE1pbm9yIGJ1ZyBmaXggdG8gVGNsIDggbW9kdWxlIHRvIHBhcnNlIGVudW1zIHByb3Blcmx5LiAgQWxzbwogICAgICAgICAgZml4ZWQgYSBtZW1vcnkgY29ycnVwdGlvbiBwcm9ibGVtIGluIHRoZSB0eXBlLWNoZWNrZXIuCiAgICAgICAgICAocGF0Y2ggY29udHJpYnV0ZWQgYnkgSGVucnkgUm93bGV5LgoKNy8yNC85NyA6IEFkZGVkIFB5dGhvbi10dXBsZSB0eXBlbWFwcyBjb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKNy8yNC85NyA6IEluY29ycG9yYXRlZCBzb21lIGNoYW5nZXMgdG8gdGhlIFB5dGhvbiBtb2R1bGUgaW4gc3VwcG9ydCBvZgogICAgICAgICAgTWFyayBIYW1tb25kJ3MgQ09NIHN1cHBvcnQuICBJJ20gbm90IGVudGlyZWx5IHN1cmUgdGhleQogICAgICAgICAgd29yayB5ZXQgaG93ZXZlci4gIE5lZWRzIGRvY3VtZW50YXRpb24gYW5kIHRlc3RpbmcuCgo3LzI0Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1Z3Mgd2hlbiBzdHJ1Y3R1cmVzIGhhZCBhcnJheSBtZW1iZXJzCiAgICAgICAgICBhbmQgdHlwZW1hcHMgd2VyZSB1c2VkLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChtZW1iZXJpbikgZG91YmxlIFsyMF1bMjBdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgYSBkb3VibGUgWzIwXVsyMF0gLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgICBkb3VibGUgYVsyMF1bMjBdOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBPcmlnaW5hbGx5LCB0aGlzIHdvdWxkIGdlbmVyYXRlIGEgY29tcGlsZXItdHlwZSBlcnJvciB3aGVuCiAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlIHdhcyBjb21waWxlZC4gICBOb3csIGEgaGVscGVyIGZ1bmN0aW9uIGxpa2UKICAgICAgICAgIHRoaXMgaXMgZ2VuZXJhdGVkIDoKCiAgICAgICAgICAgICAgICBkb3VibGUgKkZvb19hX3NldChGb28gKmEsIGRvdWJsZSB2YWxbMjBdWzIwXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLi4uIG1lbWJlcmluIHR5cGVtYXAgaGVyZSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZG91YmxlICopIHZhbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIHdyaXRpbmcgdHlwZW1hcHMsIG9uZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHNvdXJjZSB2YXJpYWJsZQogICAgICAgICAgaXMgYW4gYXJyYXkgb2YgdGhlICpzYW1lKiB0eXBlIGFzIHRoZSBzdHJ1Y3R1cmUgbWVtYmVyLiBUaGlzCiAgICAgICAgICBtYXkgYnJlYWsgc29tZSBjb2RlcyB0aGF0IG1hbmFnZWQgdG8gd29yayBhcm91bmQgdGhlIGFycmF5IGJ1Zy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8xMy85NyA6IEZpeGVkIGJ1ZyBpbiBQZXJsNSBtb2R1bGUgd2hlbiB1c2luZyBDIGdsb2JhbCB2YXJpYWJsZXMgdGhhdAogICAgICAgICAgYXJlIHBvaW50ZXJzLiAgV2hlbiB1c2VkIGluIGZ1bmN0aW9uIGNhbGxzIGFuZCBvdGhlciBvcGVyYXRpb25zLAogICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyIHdvdWxkIGJlIGludmFsaWQtLS1jYXVzaW5nIGNvcmUKICAgICAgICAgIGR1bXBzIGFuZCBvdGhlciBwcm9ibGVtcy4gIFNXSUcgaW1wbGVtZW50cyBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICB1c2luZyBQZXJsIG1hZ2ljIHZhcmlhYmxlcy4gIEFzIGl0IHR1cm5zIG91dCwgdGhlIGVycm9yCiAgICAgICAgICB3YXMgY2F1c2VkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHBvaW50ZXItZXh0cmFjdGlvbiBjb2RlCiAgICAgICAgICB3YXMgc29tZWhvdyBieXBhc3NpbmcgdGhlIHByb2NlZHVyZSB1c2VkIHRvIHJlc29sdmUgbWFnaWNhbAogICAgICAgICAgdmFyaWFibGVzIChoZW5jZSwgbGVhdmluZyB0aGUgdmFsdWUgdW5kZWZpbmVkKS4gIFRvIGZpeAogICAgICAgICAgdGhlIHByb2JsZW0sIFNXSUcgbm93IGV4cGxpY2l0bHkgcmVzb2x2ZXMgbWFnaWMgYmVmb3JlCiAgICAgICAgICBleHRyYWN0aW5nIHBvaW50ZXIgdmFsdWVzLgoKNy8xMi85NyA6IEVsaW1pbmF0ZWQgdGhlIGxhc3QgcmVtbmFudHMgb2YgZnJlZSgpIGFuZCBtYWxsb2MoKSBmcm9tCiAgICAgICAgICB0aGUgU1dJRyBjb21waWxlci4KCjcvMTIvOTcgOiBGaXhlZCBwYXJzaW5nIHByb2JsZW1zIHdpdGggdHlwZW1hcHMgaW52b2x2aW5nIGFycmF5cyBhbmQKICAgICAgICAgIHRlbXBvcmFyeSB2YXJpYWJsZXMgb2YgYXJyYXlzLiAgICBBbHNvIG1hZGUgaXQgcG9zc2libGUgZm9yCiAgICAgICAgICBTV0lHIHRvIGhhbmRsZSB0eXBlbWFwcyBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFtBTlldIChkb3VibGUgdGVtcFskZGltMF0pIHsKCQkgICAgICAuLi4gc3RvcmUgZGF0YSBpbiB0ZW1wWyRkaW0wXSAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgTm90IG9ubHkgZG9lcyB0aGlzIHR5cGVtYXAgbWF0Y2ggYW55IGRvdWJsZSBbXSBhcnJheSwgaXQKICAgICAgICAgIGNyZWF0ZXMgYSBsb2NhbCB2YXJpYWJsZSB3aXRoIHByZWNpc2VseSB0aGUgcmlnaHQgZGltZW5zaW9ucy4KICAgICAgICAgIChpZS4gJGRpbTAgZ2V0cyBmaWxsZWQgaW4gd2l0aCB0aGUgcmVhbCBudW1iZXIgb2YgZGltZW5zaW9ucykuCiAgICAgICAgICBPZiBjb3Vyc2UsIG9mZiB0aGUgcmVjb3JkLCB0aGlzIHdpbGwgYmUgYSB3YXkgdG8gYWRkIG1vcmUKICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHR5cGVtYXBzLmkgbGlicmFyaWVzLgoKNy85Lzk3ICA6IEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBQZXJsNSwgc3RhdGljIGxpbmtpbmcsIGFuZCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICBXaGVuIHN0YXRpY2FsbHkgbGlua2luZyBtdWx0aXBsZSBtb2R1bGVzIHRvZ2V0aGVyLCB3cml0ZQogICAgICAgICAgYSB0b3AtbGV2ZWwgaW50ZXJmYWNlIGZpbGUgbGlrZSB0aGlzIHdoZW4gc2hhZG93IGNsYXNzZXMgYXJlIG5vdAogICAgICAgICAgdXNlZCA6CgogICAgICAgICAgICAgICAgICVtb2R1bGUgc3dpZywgZm9vLCBiYXIsIGdsb2I7CiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgcGVybG1haW4uaQoKICAgICAgICAgIFdoZW4gc2hhZG93IGNsYXNzZXMgYXJlIHVzZWQsIHRoZSBtb2R1bGUgbmFtZXMgaGF2ZSBhbiBleHRyYSAnYycKICAgICAgICAgIGFwcGVuZGVkIHNvIGl0IHNob3VsZCByZWFkIGFzIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb29jLCBiYXJjLCBnbG9iYzsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMsIGNvbnNpZGVyIHVzaW5nIHRoZSBTV0lHIHJ1bnRpbWUKICAgICAgICAgIGxpYnJhcnkuCgo3LzgvOTcgIDogSW5jb3Jwb3JhdGVkIGZpeGVkIHZlcnNpb25zIG9mIHRoZSBCb3JsYW5kIEMrKyBNYWtlZmlsZXMuCgo3LzgvOTcgIDogRmlyc3QgY3V0IGF0IHRyeWluZyB0byBlbGltaW5hdGUgZXhjZXNzaXZlIGNvbXBpbGVyIHdhcm5pbmdzLgogICAgICAgICAgQXMgaXQgdHVybnMgb3V0LCBhbG90IG9mIHdhcm5pbmdzIGdvIGF3YXkgaWYgeW91IGp1c3QgbWFrZQogICAgICAgICAgZGVjbGFyYXRpb25zIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICAgY2xpZW50RGF0YSA9IGNsaWVudERhdGE7CgogICAgICAgICAgaW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUuICBNb3N0IGNvbXBpbGVycyBzaG91bGQganVzdAogICAgICAgICAgaWdub3JlIHRoaXMgY29kZSAoYXQgbGVhc3Qgd291bGQgY2FuIGhvcGUpLgoKNy84Lzk3ICA6IEZpeGVkIGJpemFycmUgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIHR5cGVtYXBzIGFuZCBDKysgY2xhc3Nlcy4KICAgICAgICAgIEluIHNvbWUgY2FzZXMsIHR5cGVtYXBzIGNvbnRhaW5pbmcgcHJpbnRmIGZvcm1hdHRpbmcgc3RyaW5ncyBzdWNoIGFzCgogICAgICAgICAgICAgICAgICAldHlwZW1hcChtZW1iZXJvdXQpIGludCAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLDQyKTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdvdWxkIGdlbmVyYXRlIGNvbXBsZXRlbHkgYm9ndXMgY29kZSB3aXRoIGdhcmJhZ2UgcmVwbGFjaW5nCiAgICAgICAgICB0aGUgJyVkJy4gICBDYXVzZWQgYnkgb25lIGZhdWx0eSB1c2Ugb2YgcHJpbnRmICh3YXNuJ3QgYWJsZSB0byBmaW5kCiAgICAgICAgICBhbnkgb3RoZXIgb2NjdXJyZW5jZXMpLgoKNy83Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gc2hhZG93IGNsYXNzIGdlbmVyYXRpb24gd2l0aCBub24tbWVtYmVyCiAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBhcmUgcmV0dXJuaW5nIG1vcmUgdGhhbiBvbmUgdmFsdWUuCgo3LzcvOTcgIDogSW5jb3Jwb3JhdGVkIG1vZGlmaWNhdGlvbnMgdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCBHdWlsZSAxLjIuCiAgICAgICAgICBTdGlsbCBuZWVkIHRvIHRlc3QgaXQgb3V0LCBidXQgaXQgaXMgcnVtb3JlZCB0byB3b3JrLgoKNy8yLzk3ICA6IEZpeGVkIHNvbWUgYnVncyByZWxhdGVkIHRvIG91dHB1dCBhcmd1bWVudHMgYW5kIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICAgIElmIGFuIG91dHB1dCBhcmd1bWVudCBpcyBkZXRlY3RlZCwgU1dJRyBhc3N1bWVzCiAgICAgICAgICB0aGF0IHRoZSByZXN1bHQgaXMgYSBsaXN0IGFuZCBoYW5kbGVzIGl0IGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICBJZiB0aGUgbm9ybWFsIHJldHVybiB0eXBlIG9mIGFuIGZ1bmN0aW9uIGlzIGFuIG9iamVjdCwKICAgICAgICAgIGl0IHdpbGwgYmUgY29udmVydGVkIGludG8gYSBzaGFkb3cgY2xhc3MgYXMgYmVmb3JlLCBidXQKICAgICAgICAgIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhCiAgICAgICAgICBsaXN0LiAgKioqIE5PVEUgOiBUaGlzIGJlaGF2aW9yIGhhcyBiZWVuIHN1YnNlcXVlbnRseSBjaGFuZ2VkICoqKgoKNi8yOS85NyA6IENoYW5nZWQgRVhQT1JUIHRvIFNXSUdFWFBPUlQgaW4gYWxsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgU2hvdWxkIHByb3ZpZGUgYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5kb3dzLgoKNi8yOS85NyA6IE1vZGlmaWVkIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyBzbyB0aGF0IG91dHB1dCBhcmd1bWVudHMKICAgICAgICAgIHdvcmsgY29ycmVjdGx5ICh3aGVuIHR5cGVtYXBzIGFyZSB1c2VkKS4KClZlcnNpb24gMS4xIChKdW5lIDI0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjYvMjQvOTcgOiBGaXhlZCBPYmplY3RpdmUtQyBjb25zdHJ1Y3RvciBidWcgd2hlbiB3b3JraW5nIHdpdGggUGVybDUKICAgICAgICAgIHNoYWRvdyBjbGFzc2VzLgoKNi8yMy85NyA6IEZpeGVkIHNvbWUgcGFyc2luZyBwcm9ibGVtcyB3aXRoIE9iamVjdGl2ZS1DLiAgRGVjbGFyYXRpb25zCiAgICAgICAgICBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmsgbm93IDoKCiAgICAgICAgICAgICAgIC0gZm9vIDogKGludCkgYSB3aXRoOiAoaW50KSBiOwoKNi8yMi85NyA6IEFkZGVkIFNXSUcgUnVudGltZSBsaWJyYXJ5LiAgIFRoaXMgbGlicmFyeSBjb250YWlucwogICAgICAgICAgdGhlIFNXSUcgcG9pbnRlciB0eXBlLWNoZWNrZXIgYW5kIHN1cHBvcnQgZnVuY3Rpb25zCiAgICAgICAgICB0aGF0IGFyZSBub3JtYWxseSBpbmNsdWRlZCBpbiBldmVyeSBtb2R1bGUuICBCeSB1c2luZwogICAgICAgICAgdGhlIGxpYnJhcnksIGl0IGlzIGVhc2llciB0byB3b3JrIHdpdGggbXVsdGlwbGUgU1dJRwogICAgICAgICAgZ2VuZXJhdGVkIG1vZHVsZXMuCgo2LzIyLzk3IDogRml4ZWQgbWlub3IgYnVnIGluIFBlcmw1IG1vZHVsZSByZWxhdGVkIHRvIHN0YXRpYyBsaW5raW5nCiAgICAgICAgICBvZiBtdWx0aXBsZSBtb2R1bGVzLgoKNi8yMi85NyA6IEZpeGVkIHNvbWUgYnVncyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gV2hlbiB1c2VkIHdpdGgKICAgICAgICAgIFBlcmw1IHNoYWRvdyBjbGFzc2VzLCB0aGlzIGdlbmVyYXRlcyBhICdyZXF1aXJlJyBzdGF0ZW1lbnQKICAgICAgICAgIHRvIGxvYWQgaW4gZXh0ZXJuYWwgbW9kdWxlcy4KCjYvMjIvOTcgOiBBZGRlZCAtc3dpZ2xpYiBvcHRpb24uICBUaGlzIHByaW50cyBvdXQgdGhlIGxvY2F0aW9uIG9mIHRoZQogICAgICAgICAgU1dJRyBsaWJyYXJ5IGFuZCBleGl0cy4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgcmVhbGx5IHVzZWZ1bCB0bwogICAgICAgICAgY29uZmlndXJhdGlvbiB0b29scyB0aGF0IGFyZSBsb29raW5nIGZvciBTV0lHIGFuZCBpdHMgbGlicmFyeQogICAgICAgICAgbG9jYXRpb24gKGUuZy4gYXV0b2NvbmYsIGNvbmZpZ3VyZSwgZXRjLi4uKS4KCjYvMjEvOTcgOiBGaXhlZCBleHBvcnQgYnVnIHdpdGggUGVybDUuMDA0IG9uIFdpbmRvd3MtTlQuCgo2LzIwLzk3IDogTWlub3IgY2hhbmdlIHRvIGNvZGUgZ2VuZXJhdGlvbiBvZiBjbGFzcy9zdHJ1Y3R1cmUgbWVtYmVycyBpbgogICAgICAgICAgb3JkZXIgdG8gd29yayBiZXR0ZXIgd2l0aCB0eXBlbWFwcy4gU2hvdWxkIGhhdmUgbm8gbm90aWNhYmxlCiAgICAgICAgICBpbXBhY3Qgb24gZXhpc3RpbmcgU1dJRyBtb2R1bGVzLgoKNi8xOS85NyA6IEFkZGVkIC10IG9wdGlvbi4gVGhpcyBhbGxvd3MgU1dJRyB0byBsb2FkIGEgdHlwZW1hcCBmaWxlIGJlZm9yZQogICAgICAgICAgcHJvY2Vzc2luZyBhbnkgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICBzd2lnIC10IHR5cGVtYXBzLmkgLXB5dGhvbiBleGFtcGxlLmkKCiAgICAgICAgICBBdCBtb3N0LCBvbmx5IG9uZSB0eXBlbWFwIGZpbGUgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGlzIG1hbm5lci4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTgvOTcgOiBOZWVkIGEgTWFrZWZpbGUgZmFzdD8gVHlwZQoKICAgICAgICAgICAgICAgICBzd2lnIFstdGNsLCAtcGVybDUsIC1weXRob25dIC1jbyBNYWtlZmlsZQoKICAgICAgICAgIGFuZCB5b3Ugd2lsbCBnZXQgYSBNYWtlZmlsZSBzcGVjaWZpYyB0byB0aGF0IHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgIFlvdSBqdXN0IG5lZWQgdG8gbW9kaWZ5IGl0IGZvciB5b3VyIGFwcGxpY2F0aW9uIGFuZCB5b3UncmUKICAgICAgICAgIHJlYWR5IHRvIHJ1bi4KCjYvMTgvOTcgOiBDb21wbGV0ZWQgdGhlIC1jaSBvcHRpb24uICBUaGlzIG9wdGlvbiBjaGVja3MgYSBmaWxlIGludG8gdGhlCiAgICAgICAgICBTV0lHIGxpYnJhcnkuICAgSXQgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhCiAgICAgICAgICBsYW5ndWFnZSBvcHRpb24uIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgIHN3aWcgLXRjbCAtY2kgZm9vYmFyLmkKCiAgICAgICAgICBDaGVja3MgdGhlIGZpbGUgZm9vYmFyLmkgaW50byB0aGUgVGNsIHBhcnQgb2YgdGhlIGxpYnJhcnkuCiAgICAgICAgICBJbiBvcmRlciB0byBjaGVjayBhIGZpbGUgaW50byB0aGUgZ2VuZXJhbCBsaWJyYXJ5IChhY2Nlc3NpYmxlCiAgICAgICAgICB0byBhbGwgbGFuZ3VhZ2VzIG1vZHVsZXMpLCBkbyB0aGUgZm9sbG93aW5nCgogICAgICAgICAgICAgICAgICBzd2lnIC1jaSAtbyAuLi9mb29iYXIuaSBmb29iYXIuaQoKICAgICAgICAgIChBZG1pdHRlZGx5IHRoaXMgbG9va3MgYSBsaXR0bGUgc3RyYW5nZSBidXQgaXMgdW5hdm9pZGFibGUpLgogICAgICAgICAgVGhlIGNoZWNrLWluIG9wdGlvbiBpcyBwcmltYXJpbHkgZGVzaWduZWQgZm9yIFNXSUcgbWFpbnRlbmFuY2UKICAgICAgICAgIGFuZCBsaWJyYXJ5IGRldmVsb3BtZW50LiBUaGUgY29tbWFuZCB3aWxsIGZhaWwgaWYgdGhlIHVzZXIgZG9lcwogICAgICAgICAgbm90IGhhdmUgd3JpdGUgcGVybWlzc2lvbiB0byB0aGUgU1dJRyBsaWJyYXJ5LiAgVGhpcmQgcGFydHkgbGlicmFyeQogICAgICAgICAgZXh0ZW5zaW9ucyBjYW4gZWFzaWx5IGluc3RhbGwgdGhlbXNlbHZlcyBieSBzaW1wbHkgcHJvdmlkaW5nCiAgICAgICAgICBhIHNoZWxsIHNjcmlwdCB0aGF0IHVzZXMgJ3N3aWcgLWNpJyB0byBpbnN0YWxsIHRoZSBhcHByb3ByaWF0ZQogICAgICAgICAgbGlicmFyeSBmaWxlcy4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8ga25vdyB3aGVyZSB0aGUgU1dJRyBsaWJyYXJ5CiAgICAgICAgICBpcyBsb2NhdGVkIGlmIHlvdSB1c2UgdGhpcyBtZWNoYW5pc20uCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE2Lzk3IDogRml4ZWQgYSBidWcgaW4gc2hhZG93IGNsYXNzIGdlbmVyYXRpb24gd2hlbiAlbmFtZSgpIHdhcyBhcHBsaWVkCiAgICAgICAgICB0byBhIGNsYXNzIGRlZmluaXRpb24uICAgVW5mb3J0dW5hdGVseSwgZml4aW5nIHRoZSBidWcgcmVxdWlyZWQKICAgICAgICAgIGEgY2hhbmdlIGluIHRoZSBMYW5ndWFnZSBDIEFQSSBieSBhZGRpbmcgYW4gZXh0cmEgYXJndW1lbnQgdG8KICAgICAgICAgIHRoZSBMYW5ndWFnZTo6Y3BwX2NsYXNzX2RlY2woKSBmdW5jdGlvbi4gIFRoaXMgbWF5IGJyZWFrCiAgICAgICAgICBTV0lHIEMrKyBleHRlbnNpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo2LzE1Lzk3IDogQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgbm8gbW9kdWxlIG5hbWUgaXMgc3BlY2lmaWVkIHdpdGggdGhlCiAgICAgICAgICAlbW9kdWxlIGRpcmVjdGl2ZSBvciAtbW9kdWxlIG9wdGlvbi4KCjYvMTUvOTcgOiBGaXhlZCBsaW5lIG51bWJlciBidWcgd2hlbiByZXBvcnRpbmcgZXJyb3JzIGZvciB1bmRlZmluZWQKICAgICAgICAgIGJhc2UgY2xhc3Nlcy4KCjYvMTUvOTcgOiBBZGRlZCBuZXcgJXJlbmFtZSBkaXJlY3RpdmUuICBUaGlzIGFsbG93cyB0aGUgZm9yd2FyZCBkZWNsYXJhdGlvbgogICAgICAgICAgb2YgYSByZW5hbWluZy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJXJlbmFtZSBPbGROYW1lIE5ld05hbWU7CgogICAgICAgICAgICAgICAgIC4uLi4gbGF0ZXIgLi4uCiAgICAgICAgICAgICAgICAgaW50IE9sZE5hbWUoaW50KTsKCiAgICAgICAgICBVbmxpa2UgJW5hbWUsICVyZW5hbWUgd2lsbCByZW5hbWUgYW55IG9jY3VycmVuY2Ugb2YgdGhlIG9sZCBuYW1lLgogICAgICAgICAgVGhpcyBhcHBsaWVzIHRvIGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjbGFzcyBtZW1iZXJzIGFuZCBzbyBmb3J0aC4KICAgICAgICAgIFRoZXJlIGlzIG5vIHdheSB0byBkaXNhYmxlICVyZW5hbWUgb25jZSBzZXQsIGJ1dCB5b3UgY2FuIGNoYW5nZSB0aGUKICAgICAgICAgIG5hbWUgYnkgcmVkZWNsYXJpbmcgaXQgdG8gc29tZXRoaW5nIGVsc2UuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE1Lzk3IDogSW1wcm92ZWQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSAlbmFtZSBkaXJlY3RpdmUgc28gdGhhdCBpdAogICAgICAgICAgY291bGQgYmUgdXNlZCB3aXRoIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIDoKCiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFNXSUcKICAgICAgICAgICAgICAgICAgICAlbmFtZShOZXdOYW1lKQogICAgICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICAgICAgIGludCBPbGROYW1lKGludCk7Cgo2LzE1Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gcmV0dXJuIGRhdGF0eXBlLiAgSW4gdGhpcyBjYXNlLAogICAgICAgICAgU1dJRyBhc3N1bWVzIGEgcmV0dXJuIHR5cGUgb2YgJ2ludCcuCgo2LzExLzk3IDogSW1wcm92ZWQgZXJyb3IgcmVwb3J0aW5nIGluIHRoZSBwYXJzZXIuICBJdCBzaG91bGQgYmUgYSBsaXR0bGUKICAgICAgICAgIGxlc3Mgc2Vuc2l0aXZlIHRvIGVycm9ycyB0aGF0IG9jY3VyIGluc2lkZSBjbGFzcyBkZWZpbml0aW9ucwogICAgICAgICAgbm93LiAgQWxzbyByZXBvcnRzIGVycm9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuCgo2LzExLzk3IDogTWFkZSAnJCcgYSBsZWdhbCBzeW1ib2wgaW4gaWRlbnRpZmllcnMuICBUaGlzIGlzIHRvIHN1cHBvcnQKICAgICAgICAgIHNvbWUgT2JqZWN0aXZlLUMgbGlicmFyaWVzLiAgU29tZSBjb21waWxlcnMgKHN1Y2ggYXMgZ2NjKSBtYXkgYWxzbwogICAgICAgICAgYWxsb3cgaWRlbnRpZmllcnMgdG8gY29udGFpbiBhICQgaW4gQy9DKysgY29kZSBhcyB3ZWxsICh0aGlzIGlzCiAgICAgICAgICBhbiBvYnNjdXJlIGZlYXR1cmUgb2YgQykuIFdoZW4gJyQnIGFwcGVhcnMgaW4gaWRlbnRpZmllciwgU1dJRwogICAgICAgICAgcmVtYXBzIGl0IHRvIHRoZSBzdHJpbmcgJ19TXycgd2hlbiBjcmVhdGluZyB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlCiAgICAgICAgICBmdW5jdGlvbi4gVGh1cyBhIGZ1bmN0aW9uICdmb28kYmFyJyB3b3VsZCBiZSBjYWxsZWQgJ2Zvb19TX2JhcicuCgo2LzExLzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB3aXRoIF9fcmVwcl9fIG1ldGhvZC4gIElmCiAgICAgICAgICBzdXBwbGllZCBieSB0aGUgdXNlciwgaXQgd2FzIGlnbm9yZWQsIGJ1dCBub3cgaXQgc2hvdWxkIHdvcmsuCgo2LzkvOTcgIDogRml4ZWQgdGhlIFRjbCA4LjAgbW9kdWxlIHRvIHdvcmsgd2l0aCBUY2wgOC4wYjEuICAgU1dJRyBpcyBubwogICAgICAgICAgbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCAqYW55KiBhbHBoYSByZWxlYXNlIG9mIFRjbCA4LjAuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvNy85NyAgOiBQdXQgYSBtYXhpbWFsIGVycm9yIGNvdW50IGluIChjdXJyZW50bHkgc2V0IHRvIDIwKS4gU1dJRyB3aWxsIGJhaWwgb3V0CiAgICAgICAgICBpZiBpdCBnZW5lcmF0ZXMgbW9yZSBlcnJvcnMgdGhhbiB0aGlzICh1c2VmdWwgZm9yIHByZXZlbnRpbmcgU1dJRwogICAgICAgICAgZnJvbSBwcmludGluZyA0MDAwIHN5bnRheCBlcnJvcnMgd2hlbiBpdCBnZXRzIGNvbmZ1c2VkKS4KCjYvNy85NyAgOiBGaXhlZCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBwYXJzaW5nIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuCgo2LzcvOTcgIDogTWlub3IgY2hhbmdlIHRvIFBlcmw1IG1vZHVsZS4gIEMrKyBzdGF0aWMgZnVuY3Rpb25zIGFyZSBub3cKICAgICAgICAgIHB1dCBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZWlyIGNsYXNzIHdoZW4gdXNpbmcgc2hhZG93IGNsYXNzZXMuCgo2LzcvOTcgIDogQ2VudHJhbGl6ZWQgdGhlIG5hbWluZyBvZiBmdW5jdGlvbnMsIG1lbWJlcnMsIHdyYXBwZXJzIGV0Yy4uLiBCeQogICAgICAgICAgY2VudHJhbGl6aW5nIHRoZSBuYW1pbmcgc2NoZW1lLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gbWFrZQogICAgICAgICAgc29tZSBtdWx0aS1maWxlIG9wdGltaXphdGlvbnMuICBBbHNvLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8KICAgICAgICAgIGNoYW5nZSBTV0lHJ3MgbmFtaW5nIHNjaGVtZSAocGVyaGFwcyBhIG5ldyBmZWF0dXJlIHRvIGJlIGFkZGVkCiAgICAgICAgICBsYXRlcikuCgo2LzIvOTcgIDogQWRkZWQgJ2FyZ2luaXQnIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBhc3NpZ24gaW5pdGlhbCB2YWx1ZXMKICAgICAgICAgIHRvIGZ1bmN0aW9uIGFyZ3VtZW50cy4gIERvaW5nIHNvIG1ha2VzIGl0IHNvbWV3aGF0IGVhc2llciB0byBkZXRlY3QKICAgICAgICAgIGltcHJvcGVyIGFyZ3VtZW50IHBhc3Npbmcgd2hlbiB3b3JraW5nIHdpdGggb3RoZXIgdHlwZW1hcHMuCgo2LzIvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHJlYWQtb25seSB2YXJpYWJsZXMgd2VyZSBpbmhlcml0ZWQKICAgICAgICAgIGludG8gb3RoZXIgY2xhc3Nlcy4gIFVuZGVyIGluaGVyaXRhbmNlLCB0aGUgdmFyaWFibGVzIHdvdWxkCiAgICAgICAgICBiZWNvbWUgd3JpdGFibGUsIGJ1dCB0aGlzIGhhcyBub3cgYmVlbiBjb3JyZWN0ZWQuCgo1LzMwLzk3IDogQW4gZW1wdHkgJW5hbWUoKSBkaXJlY3RpdmUgaXMgbm8gbG9uZ2VyIGFsbG93ZWQgb3Igc3VwcG9ydGVkLgogICAgICAgICAgVGhpcyBkaXJlY3RpdmUgd2FzIG9yaWdpbmFsbHkgdXNlZCB0byBzdHJpcCB0aGUgcHJlZml4CiAgICAgICAgICBvZmYgb2YgYSBjbGFzcyBvciBzdHJ1Y3R1cmUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG5ldmVyIHJlYWxseQogICAgICAgICAgc2VlbWVkIHRvIHdvcmsgcmlnaHQgYW5kIGl0IGNvbXBsaWNhdGVkIHRoZSBDKysgY29kZSBnZW5lcmF0b3IKICAgICAgICAgIHNpZ25pZmljYW50bHkuICAgQXMgZmFyIGFzIEkgY2FuIHRlbGwgbm8gb25lIHVzZXMgaXQsIHNvIGl0CiAgICAgICAgICBpcyBub3cgaGlzdG9yeS4gICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNS8yOC85NyA6IEZpeGVkIGEgcGFyc2luZyBidWcgd2l0aCAjZGVmaW5lIGFuZCBDKysgY29tbWVudHMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBub3cgd29yayBwcm9wZXJseSA6CgogICAgICAgICAgICAgICAgICAgI2RlZmluZSBDT05TVCAgIDQgICAgIC8vIEEgQ29tbWVudAoKNS8yOC85NyA6IE1hZGUgc29tZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgdG8gdGhlIFNXSUcgU3RyaW5nIGNsYXNzLgogICAgICAgICAgKG9ubHkgYWZmZWN0cyB0aGUgU1dJRyBjb21waWxlciBpdHNlbGYpLgoKNS8yOC85NyA6IE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gc2tpcCB0ZW1wbGF0ZSBkZWZpbml0aW9ucyBhbmQgaXNzdWUgYQogICAgICAgICAgd2FybmluZyBtZXNzYWdlLgoKNS8yOC85NyA6IFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZXMgYWRkZWQgKGllLiB0ZW1wbGF0ZXMpLgogICAgICAgICAgVHlwZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNob3VsZCBwYXNzIHRocm91Z2ggdGhlIFNXSUcgY29tcGlsZXIKCiAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28odmVjdG9yPGNvbXBsZXg+ICphLCB2ZWN0b3I8ZG91YmxlPiAqYik7CgogICAgICAgICAgV2hlbiB1c2VkLCB0aGUgZW50aXJlIG5hbWUgJ3ZlY3Rvcjxjb21wbGV4PicgYmVjb21lcyB0aGUgbmFtZQogICAgICAgICAgb2YgdGhlIGRhdGF0eXBlLiAgICAgIER1ZSB0byBzcGFjZSBsaW1pdGF0aW9ucyBpbiBkYXRhdHlwZQogICAgICAgICAgcmVwcmVzZW50YXRpb25zLCB0aGUgbmFtZSBzaG91bGQgbm90IGV4Y2VlZCA5NiBjaGFyYWN0ZXJzLgoKICAgICAgICAgIE5vdGUgOiBUaGlzIGlzIG9ubHkgcGFydCBvZiB3aGF0IGlzIG5lZWRlZCBmb3IgdGVtcGxhdGUgc3VwcG9ydC4KICAgICAgICAgIFRlbXBsYXRlIGNsYXNzIGRlZmluaXRpb25zIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBieSBTV0lHLgoKICAgICAgICAgIFRoZSB0ZW1wbGF0ZSBub3RhdGlvbiBhYm92ZSBtYXkgYWxzbyBiZSB1c2VkIHdoZW4gc3BlY2lmeWluZwogICAgICAgICAgT2JqZWN0aXZlLUMgcHJvdG9jb2wgbGlzdHMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzI0Lzk3IDogRmlyc3QgY3V0IGF0IE9iamVjdGl2ZS1DIHN1cHBvcnQgYWRkZWQuICAgQXMgaXQgdHVybnMgb3V0LCBhbG1vc3QKICAgICAgICAgIGV2ZXJ5dGhpbmcgY2FuIGJlIGhhbmRsZWQgd2l0aCBvbmx5IGEgZmV3IG1pbm9yIG1vZGlmaWNhdGlvbnMgdG8KICAgICAgICAgIHRoZSBDKysgbW9kdWxlLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNS8yMy85NyA6IEZpeGVkIHJlcGVhdGVkIGRlZmluaXRpb24gYnVnIGluIG11bHRpcGxlIGluaGVyaXRhbmNlIGhhbmRsaW5nCiAgICAgICAgICB3aGVuIG11bHRpcGxlIGJhc2UgY2xhc3NlcyBzaGFyZSBhIGNvbW1vbiBiYXNlIGNsYXNzIChpZS4KICAgICAgICAgIHRoZSBldmlsIGRpYW1vbmQpLgoKNS8yMS85NyA6IEZpeGVkIHJhdGhlciBlbWJhcnJhc3NpbmcgdHlwbyB0aGF0IHdvcmtlZCBpdHMgd2F5IGludG8gdGhlCiAgICAgICAgICBUZXN0cy9CdWlsZCBkaXJlY3RvcnkuCgo1LzE5Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIG5hdGl2ZSBtZXRob2RzIGFuZAogICAgICAgICAgc2hhZG93IGNsYXNzZXMgd2l0aCBQeXRob24gYW5kIFBlcmw1IG1vZHVsZXMuCgo1LzE5Lzk3IDogTW9kaWZpZWQgdGhlICVhcHBseSBkaXJlY3RpdmUgc2xpZ2h0bHkgc28gdGhhdCBpdCB3b3VsZCB3b3JrCiAgICAgICAgICB3aXRoIHBvaW50ZXJzIGEgbGl0dGxlIGJldHRlci4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJWFwcGx5IHVuc2lnbmVkIGxvbmcgeyBEV09SRCB9OwoKICAgICAgICAgIEFwcGxpZXMgKmFsbCogdHlwZW1hcHMgYXNzb2NpYXRlZCB3aXRoICJ1bnNpZ25lZCBsb25nIiB0bwogICAgICAgICAgIkRXT1JEIi4gICBUaGlzIG5vdyBpbmNsdWRlcyBwb2ludGVycyB0byB0aGUgdHdvIGRhdGF0eXBlcy4KICAgICAgICAgIEZvciBleGFtcGxlLCBhIHR5cGVtYXAgYXBwbGllZCB0byAidW5zaWduZWQgbG9uZyAqKiIgd291bGQKICAgICAgICAgIGFsc28gYmUgYXBwbGllZCB0byBhbnkgb2NjdXJyZW5jZSBvZiAiRFdPUkQgKioiIGFzIHdlbGwuCgo1LzE5Lzk3IDogRml4ZWQgYW4gb3duZXJzaGlwIGFzc2lnbm1lbnQgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgd2hlbgogICAgICAgICAgY2xhc3MgbWVtYmVycyB3ZXJlIHJldHVybmluZyBuZXcgb2JqZWN0cyBiZWxvbmdpbmcgdG8KICAgICAgICAgIGRpZmZlcmVudCBjbGFzc2VzLgoKNS8xNy85NyA6IEFkZGVkIGEgZmV3IG1vcmUgdHlwZW1hcCB2YXJpYWJsZXMuCgogICAgICAgICAgICAgICAgICAkbmFtZSAgICAgICAgICAtIE5hbWUgb2YgZnVuY3Rpb24vdmFyaWFibGUvbWVtYmVyCiAgICAgICAgICAgICAgICAgICRiYXNldHlwZSAgICAgIC0gQmFzZSBkYXRhdHlwZSAodHlwZSB3aXRob3V0IHBvaW50ZXJzKQogICAgICAgICAgICAgICAgICAkYXJnbnVtICAgICAgICAtIEFyZ3VtZW50IG51bWJlcgoKNS8xNi85NyA6IEZpeGVkIGVtYmFycmFzc2luZyB1bmRlcnNjb3JlIGVycm9yIGluIGxvY2FsIHZhcmlhYmxlCiAgICAgICAgICBhbGxvY2F0b3IuCgo1LzE2Lzk3IDogRml4ZWQgbmFtZXNwYWNlIGNsYXNoIGJ1ZyBpbiBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzCiAgICAgICAgICB3aGVuIGNyZWF0aW5nIGFycmF5cyBhcyBuZXcgbG9jYWwgdmFyaWFibGVzLgoKNS8xNS85NyA6IEZpeGVkIHNvbWUgYnVncyB3aXRoIGluaGVyaXRhbmNlIG9mIGFkZGVkIG1ldGhvZHMgYWNyb3NzCiAgICAgICAgICBtdWx0aXBsZSBmaWxlcy4gICBTV0lHIG5vdyB1c2VzIG5hbWVzIG9mIGJhc2UgY2xhc3NlcwogICAgICAgICAgd2hlbiBnZW5lcmF0aW5nIHN1Y2ggZnVuY3Rpb25zLgoKNS8xNC85NyA6IEZpbmlzaGVkIHN1cHBvcnQgZm9yIGRlZmF1bHQgdHlwZW1hcHMuICBQcmltYXJpbHkgdXNlZAogICAgICAgICAgaW50ZXJuYWxseSwgdGhleSBjYW4gYmUgdXNlZCB0byBtYXRjaCB0aGUgYmFzaWMKICAgICAgICAgIGJ1aWx0LWluIGRhdGF0eXBlcyB1c2VkIGluc2lkZSBvZiBTV0lHLiAgIFlvdSBjYW4KICAgICAgICAgIHNwZWNpZnkgdGhlbSBpbiBpbnRlcmZhY2UgZmlsZXMgYXMgd2VsbCBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgU1dJR19ERUZBVUxUX1RZUEUgewogICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gYXRvaSgkdGFyZ2V0KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFVubGlrZSBub3JtYWwgdHlwZW1hcHMsIHRoaXMgZGVmYXVsdCBtYXAgd2lsbCBnZXQgYXBwbGllZAogICAgICAgICAgdG8gKmFsbCogaW50ZWdlciBkYXRhdHlwZXMgZW5jb3VudGVyZWQsIGluY2x1ZGluZyB0aG9zZQogICAgICAgICAgcmVuYW1lZCB3aXRoIHR5cGVkZWYsIGV0Yy4uLgoKNS8xMy85NyA6IEZpeGVkIHN1YnN0cmluZyBidWcgaW4gdHlwZSBjaGVja2VyLgoKNS8xMi85NyA6IEZpeGVkIGJ1ZyBpbiBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzIHdoZW4gZGVjbGFyaW5nIGxvY2FsCiAgICAgICAgICB2YXJpYWJsZXMgb2Ygc3RydWN0dXJlcy4KClZlcnNpb24gMS4xIEJldGE2IChNYXkgOSwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNS85Lzk3ICA6IEZpeGVkIGJpemFycmUgTlVMTCBwb2ludGVyIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsNSBtb2R1bGUuCgo1LzgvOTcgIDogRml4ZWQgbXlzdGVyaW91cyBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBydW5uaW5nIFNXSUcgb24gYW4KICAgICAgICAgIGVtcHR5IGZpbGUuCgo1LzcvOTcgIDogVGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgbm93IHJlcGxhY2UgdGhlIHNwZWNpYWwgc3ltYm9sICIkY2xlYW51cCIKICAgICAgICAgIHdpdGggdGhlIGNsZWFudXAgY29kZSBzcGVjaWZpZWQgd2l0aCB0aGUgImZyZWVhcmciIHR5cGVtYXAuCiAgICAgICAgICBUaGlzIGNoYW5nZSBuZWVkZWQgdG8gcHJvcGVybHkgbWFuYWdlIG1lbW9yeSBhbmQgZXhjZXB0aW9ucy4KCjUvNS85NyAgOiBBZGRlZCB0aGUgJ3R5cGVtYXBzLmknIGxpYnJhcnkgZmlsZS4gIFRoaXMgY29udGFpbnMgYQogICAgICAgICAgdmFyaWV0eSBvZiBjb21tb24gdHlwZW1hcHMgZm9yIGlucHV0IHZhbHVlcywgcG9pbnRlcnMsCiAgICAgICAgICBhbmQgc28gb24uCgo1LzUvOTcgIDogQ2hhbmdlZCBiZWhhdmlvciBvZiAiYXJnb3V0IiB0eXBlbWFwIGluIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICBPbGQgdmVyc2lvbnMgYXV0b21hdGljYWxseSB0dXJuZWQgdGhlIHJlc3VsdCBpbnRvIGEKICAgICAgICAgIFB5dGhvbiBsaXN0LiAgVGhlIG5ldyB2ZXJzaW9uIGRvZXMgbm90aGluZywgbGVhdmluZyB0aGUKICAgICAgICAgIGltcGxlbWVudGF0aW9uIHVwIHRvIHRoZSB1c2VyLiAgVGhpcyBwcm92aWRlcyBtb3JlIGZsZXhpYmlsaXR5CiAgICAgICAgICBidXQgbWF5IGJyZWFrIG9sZGVyIGNvZGVzIHRoYXQgcmVseSBvbiB0eXBlbWFwcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNS81Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGludGVyYWN0aW9uIG9mCiAgICAgICAgICAiYXJnb3V0IiBhbmQgImlnbm9yZSIgdHlwZW1hcHMuCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgdGhhdCB3b3VsZCBnZW5lcmF0ZSBpbmNvcnJlY3QgY29kZQogICAgICAgICAgaWYgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBhcmUgImlnbm9yZWQiLgoKNS80Lzk3ICA6IEFkZGVkICVhcHBseSBhbmQgJWNsZWFyIGRpcmVjdGl2ZXMuICAgVGhlc2UgZm9ybSBhIGhpZ2hlciBsZXZlbAogICAgICAgICAgaW50ZXJmYWNlIHRvIHRoZSB0eXBlbWFwIG1lY2hhbmlzbS4gIEluIGEgbnV0c2hlbGwsIHRoZXkKICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgcHJvY2Vzc2luZyBvZiB2YXJpb3VzIGRhdGF0eXBlcyB3aXRob3V0CiAgICAgICAgICBldmVyIGhhdmluZyB0byB3cml0ZSBhIHR5cGVtYXAuICBTZWUgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbgogICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4gICoqIE5FVyBGRUFUVVJFICoqCgo1LzQvOTcgIDogQWRkZWQgYSBsb2NhbCB2YXJpYWJsZSBleHRlbnNpb24gdG8gdGhlIHR5cGVtYXAgaGFuZGxlci4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgKihkb3VibGUgdGVtcCkgewoJCSAgICAgICAgdGVtcCA9IGF0b2YoJHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSAmdGVtcDsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCAndGVtcCcgaXMgYSBsb2NhbCB2YXJpYWJsZSB0aGF0IGV4aXN0cwogICAgICAgICAgaW4gdGhlIGVudGlyZSB3cmFwcGVyIGZ1bmN0aW9uIChub3QganVzdCB0aGUgdHlwZW1hcAogICAgICAgICAgY29kZSkuICBUaGlzIG1lY2hhbmlzbSBwcm92aWRlcyBiZXR0ZXIgc3VwcG9ydCBmb3IKICAgICAgICAgIGNlcnRhaW4gdHlwZXMgb2YgYXJndW1lbnQgaGFuZGxpbmcgYW5kIGFsc28gbWFrZXMgaXQKICAgICAgICAgIHBvc3NpYmxlIHRvIHdyaXRlIHRocmVhZC1zYWZlIHR5cGVtYXBzLiAgQW55IG51bWJlcgogICAgICAgICAgbG9jYWwgdmFyaWFibGVzIGNhbiBiZSBkZWNsYXJlZCBieSBzdXBwbHlpbmcgYSBjb21tYQogICAgICAgICAgc2VwYXJhdGVkIGxpc3QuICAgTG9jYWwgdmFyaWFibGVzIGFyZSBndWFyYW50ZWVkIHRvIGJlCiAgICAgICAgICB1bmlxdWUsIGV2ZW4gaWYgdGhlIHNhbWUgdHlwZW1hcCBpcyBhcHBsaWVkIG1hbnkgdGltZXMKICAgICAgICAgIGluIGEgZ2l2ZW4gZnVuY3Rpb24uCiAgICAgICAgICAqKiBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBQZXJsNCBvciBHdWlsZSBtb2R1bGVzLgoKNS8yLzk3ICA6IEZpeGVkIHByb2Nlc3Npbmcgb2YgJWlmZGVmLCAlZW5kaWYsICVpZiwgZXRjLi4uICAoVGhlc2UgYXJlCiAgICAgICAgICBTV0lHIGVxdWl2YWxlbnRzIG9mIHRoZSBDIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHRoYXQKICAgICAgICAgIGNhbiBwYXNzIHRocm91Z2ggdGhlIEMgcHJlcHJvY2Vzc29yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKS4KCjUvMi85NyAgOiBGaXhlZCBtYWpvciAoYnV0IHN1YnRsZSkgYnVnIGluIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIKICAgICAgICAgIHJlbGF0ZWQgdG8gc2VhcmNoaW5nIGFuZCB0eXBlLWNoZWNraW5nIGZvciBDKysgaW5oZXJpdGFuY2UuCiAgICAgICAgICBUbyBtYWtlIGEgbG9uZyBzdG9yeSBzaG9ydCwgaWYgeW91IGhhZCB0d28gY2xhc3NlcyBuYW1lZAogICAgICAgICAgIkZvbyIgYW5kICJGb29PYmplY3QiIHRoZSB0eXBlIGNoZWNrZXIgd291bGQgc29tZXRpbWVzCiAgICAgICAgICBnZXQgY29uZnVzZWQgYW5kIGJlIHVuYWJsZSB0byBsb2NhdGUgIkZvbyIgaW4gYW4gaW50ZXJuYWwKICAgICAgICAgIHRhYmxlLgoKNS8yLzk3ICA6IEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgLWNvIG9wdGlvbi4KCjQvMjQvOTcgOiBQb2ludGVyIGxpYnJhcnkgYWRkZWQgdG8gdGhlIFNXSUcgbGlicmFyeS4KCjQvMTkvOTcgOiBBZGRlZCB0aGUgJW5ldyBkaXJlY3RpdmUuICAgVGhpcyBpcyBhICJoaW50IiB0aGF0IGNhbiBiZSB1c2VkCiAgICAgICAgICB0byB0ZWxsIFNXSUcgdGhhdCBhIGZ1bmN0aW9uIGlzIHJldHVybmluZyBhIG5ldyBvYmplY3QuIEZvcgogICAgICAgICAgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlbmV3IEZvbyAqY3JlYXRlX2ZvbygpOwoKICAgICAgICAgIFRoaXMgdGVsbHMgU1dJRyB0aGF0IGNyZWF0ZV9mb28oKSBpcyBjcmVhdGluZyBhIG5ldyBvYmplY3QKICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIHRvIGl0LiAgIE1hbnkgbGFuZ3VhZ2UgbW9kdWxlcyBtYXkKICAgICAgICAgIGNob29zZSB0byBpZ25vcmUgdGhlIGhpbnQsIGJ1dCB3aGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3NlcywKICAgICAgICAgIHRoZSAlbmV3IGlzIHVzZWQgdG8gaGFuZGxlIHByb3BlciBvd25lcnNoaXAgb2Ygb2JqZWN0cy4KCiAgICAgICAgICAlbmV3IGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5ncy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgY2hhciAqY3JlYXRlX3N0cmluZygpOwoKICAgICAgICAgIFdoZW4gdXNlZCwgYWxsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHdpbGwgYXV0b21hdGljYWxseSBjbGVhbnVwCiAgICAgICAgICB0aGUgcmV0dXJuZWQgc3RyaW5nLS1lbGltaW5hdGluZyBtZW1vcnkgbGVha3MuCiAgICAgICAgICAqKiBORVcgRkVBVFVSRSAqKgoKNC8xOS85NyA6IEFkZGVkIGEgbmV3IHR5cGVtYXAgIm5ld2ZyZWUiLiAgIFRoaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCiAgICAgICAgICB0aGUgJW5ldyBkaXJlY3RpdmUgYW5kIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgbWV0aG9kIGJ5IHdoaWNoCiAgICAgICAgICBhIG5ldyBvYmplY3QgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiBpcyBkZWxldGVkLgoKNC8xOS85NyA6IFRoZSBzeW1ib2wgIl9fY3BsdXNwbHVzIiBpcyBub3cgZGVmaW5lZCBpbiB0aGUgU1dJRyBpbnRlcnByZXRlcgogICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggdGhlIC1jKysgb3B0aW9uLgoKNC8xNy85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIHdoZW4gdXNlZCBpbnNpZGUgdGhlCiAgICAgICAgICAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuCgo0LzE1Lzk3IDogQWRkZWQgYSBzcGVjaWFsIHR5cGVtYXAgc3ltYm9sIFBSRVZJT1VTIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgIHJlc3RvcmUgYSBwcmV2aW91cyB0eXBlbWFwLiBGb3IgZXhhbXBsZSA6CgoJICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgKiA9IFBSRVZJT1VTOwoKICAgICAgICAgIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgaW4gbGlicmFyeSBmaWxlcy4KCjQvMTMvOTcgOiBBZGRlZCAlcHJhZ21hIGRpcmVjdGl2ZSBmb3IgUGVybDUgbW9kdWxlLiAgIFR3byBuZXcgcHJhZ21hcyBhcmUKICAgICAgICAgIGF2YWlsYWJsZSA6CgogICAgICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGNvZGUgPSAic3RyaW5nIgogICAgICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGluY2x1ZGUgPSAiZmlsZS5wbCIKCiAgICAgICAgICBCb3RoIGluc2VydCBjb2RlIGludG8gdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4gIFRoaXMgY2FuCiAgICAgICAgICBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgY3VzdG9taXplIHRoZSAucG0gZmlsZSBjcmVhdGVkIGJ5IFNXSUcuCgo0LzEzLzk3IDogU2Nhbm5lciBtb2RpZmllZCB0byBvbmx5IHJlY29nbml6ZSBDKysga2V5d29yZHMgd2hlbiB0aGUgLWMrKwogICAgICAgICAgb3B0aW9uIGhhcyBiZWVuIHNwZWNpZmllZC4gIFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgQyBwcm9ncmFtcwogICAgICAgICAgdGhhdCBtYWtlIHVzZSBvZiB0aGVzZSBrZXl3b3JkcyBmb3IgaWRlbnRpZmllcnMuCiAgICAgICAgICBTV0lHIG1heSBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgcnVuIHdpdGggdGhlIC1jKysgb3B0aW9uIHdoZW4KICAgICAgICAgIGNvbXBpbGluZyBDKysgY29kZSAodGhpcyB3YXMgYWxsb3dlZCwgYnV0IG5vdCByZWNvbW1lbmRlZCBpbgogICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMpLiAqKlBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkqKgoKNC8xMS85NyA6IEZpeGVkIGEgcmF0aGVyIG5hc3R5IGJ1ZyBpbiB0aGUgUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gdXNpbmcKICAgICAgICAgIHZhcmlhYmxlIGxpbmtpbmcgd2l0aCBjb21wbGV4IGRhdGF0eXBlcyBhbmQgcG9pbnRlcnMuICAgT24gVW5peCwKICAgICAgICAgIGNvZGUgd291bGQgd29yayAoc29tZWhvdyksIGJ1dCB3b3VsZCBjYXVzZSBhbiBhY2Nlc3MgdmlvbGF0aW9uCiAgICAgICAgICB1bmRlciBXaW5kb3dzLU5ULiAgVGhlIGZpeCBzaG91bGQgY29ycmVjdCB0aGUgcHJvYmxlbSwKICAgICAgICAgIGJ1dCB0aGVyZSBtYXkgc3RpbGwgYmUgYSBwcm9ibGVtIHVzaW5nIGdsb2JhbCB2YXJpYWJsZXMgb2YKICAgICAgICAgIGNvbXBsZXggZGF0YXR5cGVzIGluIGNvbmp1bmN0aW9uIHdpdGggc2hhZG93IGNsYXNzZXMuICBGb3J0dW5hdGVseSwKICAgICAgICAgIHRoaXMgc29ydCBvZiB0aGluZyBzZWVtcyB0byBiZSByZWxhdGl2ZWx5IHJhcmUgKGNvbnNpZGVyaW5nCiAgICAgICAgICB0aGF0IHRoZSBidWcgaGFzIGJlZW4gYXJvdW5kIGZvciBtb3JlIHRoYW4gYSB5ZWFyIC0geWlrZXMhKS4KCjQvMTEvOTcgOiBGaXhlZCBiaXphcnJlIGNvbnN0YW50IGV2YWx1YXRpb24gYnVnIGluIFBlcmw1IGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgd2hlbiBydW5uaW5nIHVuZGVyIFdpbmRvd3MtTlQuCgo0LzgvOTcgIDogQnVnIHdoZW4gdXNpbmcgZGVmYXVsdCBhcmd1bWVudHMgYW5kIEMrKyByZWZlcmVuY2VzIGZpeGVkLgoKNC84Lzk3ICA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWdzIGluIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcyByZWxhdGVkIHRvCiAgICAgICAgICB1c2luZyBjbGFzcyByZW5hbWluZyAoYXBwbHlpbmcgdGhlICVuYW1lIGRpcmVjdGl2ZSB0byBhIGNsYXNzCiAgICAgICAgICBkZWZpbml0aW9uKSBhbmQgc2hhZG93IGNsYXNzZXMuCgo0LzcvOTcgIDogRml4ZWQgbWlub3IgYnVncyBpbiBzd2lncHRyLnN3ZywgdGNsOHB0ci5zd2csIGFuZCBwZXJsNXB0ci5zd2cgdG8KICAgICAgICAgIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlbiB3ZWlyZCBkYXRhdHlwZXMgYXJlIHBhc3NlZC4KCjMvMjkvOTcgOiAnTWFrZWZpbGUud2luJyBhZGRlZC4gICBUaGlzIGlzIHVzZWQgdG8gYnVpbGQgbW9zdCBvZiB0aGUgZXhhbXBsZXMKICAgICAgICAgIGluIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgdW5kZXIgV2luZG93cyBOVC85NS4KCjMvMjcvOTcgOiBGaXhlcyB0byBTV0lHJ3MgZXJyb3IgcmV0dXJuIGNvZGVzLiAgIFNXSUcgbm93IHJldHVybnMgbm9uLXplcm8KICAgICAgICAgIGV4aXQgY29kZXMgZm9yIGNlcnRhaW4ga2luZHMgb2YgZXJyb3JzICh3aGljaCBtYWtlcyBpdCBtb3JlCiAgICAgICAgICBmcmllbmRseSB0byBtYWtlZmlsZXMpLiAgICAgQW4gb3ZlcmhhdWwgb2YgdGhlIGVycm9yIGhhbmRsaW5nCiAgICAgICAgICBpcyBvbiB0aGUgdG8tZG8gbGlzdCBhbmQgd2lsbCBwcm9iYWJseSBzaG93IHVwIGluIGEgbGF0ZXIgcmVsZWFzZS4KCjMvMjUvOTcgOiBCdWcgZml4LiAgImZyZWVhcmciIGFuZCAiYXJnb3V0IiB0eXBlbWFwcyBoYXZlIGJlZW4gZml4ZWQgaW4KICAgICAgICAgIHRoZSBQZXJsNSBtb2R1bGUuICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgZnVuY3Rpb24gaW5wdXQgcGFyYW1ldGVycwogICAgICAgICAgYW5kIGZ1bmN0aW9uIG91dHB1dCBwYXJhbWV0ZXJzIHNoYXJlZCB0aGUgc2FtZSBtZW1vcnkgc3BhY2UtLWNhdXNpbmcKICAgICAgICAgIGFsbCBzb3J0cyBvZiBuYXN0eSBwcm9ibGVtcyB3aGVuIHRyeWluZyB0byBwYXNzIHBlcmwgdmFsdWVzIGJ5CiAgICAgICAgICByZWZlcmVuY2UuICAgU1dJRyBub3cgaW50ZXJuYWxseSBtYWtlcyBhICJjb3B5IiAod2hpY2ggaXMgcmVhbGx5CiAgICAgICAgICBqdXN0IGEgcG9pbnRlcikgb2YgYWZmZWN0ZWQgcGFyYW1ldGVycyBhbmQgdXNlcyB0aGF0LiAgIFRoaXMKICAgICAgICAgIGlzIGRvbmUgdHJhbnNwYXJlbnRseSBzbyB0aGVyZSBpcyBubyBub3RpY2FibGUgaW1wYWN0IG9uIGFueQogICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcy4gICBUaGlzIGNoYW5nZSBpcyBwcm9iYWJseSBvbmx5IG5vdGljYWJsZQogICAgICAgICAgdG8gZXhwZXJ0IHVzZXJzLgoKMy8yNS85NyA6IEFkZGVkIHR5cGUtY2hlY2sgdG8gdmVyYm9zZSBhbmQgc3RhdCBtb2RlLiAgU1dJRyB3aWxsIG5vdyBnZW5lcmF0ZSBhIGxpc3QKICAgICAgICAgIG9mIGFsbCBkYXRhdHlwZXMgdGhhdCB3ZXJlIHVzZWQgYnV0IHVuZGVmaW5lZCAodXNlZnVsIGZvciB0cmFja2luZwogICAgICAgICAgZG93biB3ZWlyZCBidWdzKS4gICBUaGlzIGlzIGVuYWJsZWQgd2l0aCB0aGUgLXYgb3B0aW9uICh3aGljaAogICAgICAgICAgaXMgbm93IG9mZmljaWFsbHkga25vd24gYXMgIm92ZXJseSB2ZXJib3NlIiBtb2RlKSBvciB0aGUgLXN0YXQgb3B0aW9uLgoKMy8yNS85NyA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBhcnNlciB0byBtYWtlIGluY2x1ZGUgZ3VhcmRzIHdvcmsgY29ycmVjdGx5LgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICNpZm5kZWYgSU5URVJGQUNFX0kKICAgICAgICAgICAgICAgICNkZWZpbmUgSU5URVJGQUNFX0kKICAgICAgICAgICAgICAgICVtb2R1bGUgZm9vYmFyLmkKICAgICAgICAgICAgICAgIC4uLiBkZWNsYXJhdGlvbnMgLi4uCiAgICAgICAgICAgICAgICAjZW5kaWYKCjMvMjQvOTcgOiAlY2hlY2tvdXQgZGlyZWN0aXZlIGFkZGVkLiAgIFRoaXMgYWxsb3dzIGFuIGludGVyZmFjZSBmaWxlIHRvCiAgICAgICAgICBleHRyYWN0IGZpbGVzIGZyb20gdGhlIFNXSUcgbGlicmFyeSBhbmQgcGxhY2UgdGhlbSBpbiB0aGUKICAgICAgICAgIGN1cnJlbnQgZGlyZWN0b3J5LiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCBzY3JpcHRzIGFuZAogICAgICAgICAgb3RoZXIgaGVscGVyIGNvZGUgdGhhdCBtaWdodCBiZSBhc3NvY2lhdGVkIHdpdGggbGlicmFyeSBmaWxlcy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAlY2hlY2tvdXQgYXJyYXkudGNsCgogICAgICAgICAgV2lsbCBsb29rIGZvciBhIGZpbGUgImFycmF5LnRjbCIgaW4gdGhlIGxpYnJhcnkgYW5kIGNvcHkgaXQKICAgICAgICAgIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gICAgSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlCiAgICAgICAgICBkaXJlY3RvcnksIHRoaXMgZGlyZWN0aXZlIGRvZXMgbm90aGluZyAoaXQgd2lsbCBub3Qgb3ZlcndyaXRlIGFuCiAgICAgICAgICBleGlzdGluZyBmaWxlKS4gIFRoaXMgb25seSBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBmb3Igbm93LgoKMy8yNC85NyA6IFNXSUcgd2lsbCBub3cgbG9vayBpbiB0aGUgU1dJRyBMaWJyYXJ5IGZvciBhIGZpbGUgaWYgaXQgY2FuJ3QKICAgICAgICAgIGZpbmQgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgQXMgYSByZXN1bHQsIGl0IGlzIGVhc3kgdG8KICAgICAgICAgIG1ha2UgbW9kdWxlcyBmcm9tIFNXSUcgbGlicmFyeSBmaWxlcy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgIHdhbnQgdG8gbWFrZSBhIFB5dGhvbiBtb2R1bGUgZnJvbSB0aGUgU1dJRyB0aW1lcnMgbGlicmFyeSwganVzdAogICAgICAgICAgdHlwZSB0aGlzIGluIGFueSBkaXJlY3RvcnkgOgoKICAgICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiB0aW1lcnMuaQoKICAgICAgICAgIFlvdSB3aWxsIGdldCB0aGUgZmlsZXMgdGltZXJzX3dyYXAuYyBhbmQgdGltZXJzX3dyYXAuZG9jIGluCiAgICAgICAgICB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhhdCB5b3UgY2FuIG5vdyBjb21waWxlLiAgIFRoZSBmaWxlCiAgICAgICAgICByZW1haW5zIGluIHRoZSBTV0lHIGxpYnJhcnkgKGFsdGhvdWdoIHlvdSBjYW4gY2hlY2sgaXQgb3V0CiAgICAgICAgICB1c2luZyB0aGUgLWNvIG9wdGlvbikuICAqKiogTmV3IEZlYXR1cmUgKioqCgozLzI0Lzk3IDogLWNvIG9wdGlvbiBhZGRlZCB0byBTV0lHIHRvIGFsbG93IGVhc3kgYWNjZXNzIHRvIHRoZSBTV0lHIGxpYnJhcnkuCiAgICAgICAgICBXaGVuIHVzZWQsIHRoaXMgaW5zdHJ1Y3RzIFNXSUcgdG8gY2hlY2sgb3V0IGEgbGlicmFyeSBmaWxlIGFuZAogICAgICAgICAgcGxhY2UgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgIHVuaXggPiBzd2lnIC1jbyBhcnJheS5pCiAgICAgICAgICAgICAgICBhcnJheS5pIGNoZWNrZWQgb3V0IGZyb20gdGhlIFNXSUcgbGlicmFyeQogICAgICAgICAgICAgICAgdW5peCA+CgogICAgICAgICAgT25jZSBpbiB5b3VyIGRpcmVjdG9yeSB5b3UgY2FuIGN1c3RvbWl6ZSB0aGUgZmlsZSB0byBzdWl0IHlvdXIKICAgICAgICAgIHBhcnRpY3VsYXIgcHVycG9zZXMuICBUaGUgY2hlY2tvdXQgb3B0aW9uIG1ha2VzIGl0IGVhc3kgdG8KICAgICAgICAgIGdyYWIgbGlicmFyeSBmaWxlcyB3aXRob3V0IGtub3dpbmcgYW55dGhpbmcgYWJvdXQgdGhlIFNXSUcKICAgICAgICAgIGluc3RhbGxhdGlvbiwgYnV0IGl0IGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gc3RhcnQKICAgICAgICAgIGluY2x1ZGluZyBzY3JpcHRzLCBDIGNvZGUsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzIGZpbGVzCiAgICAgICAgICBpbiB0aGUgbGlicmFyeS4gIEZvciBleGFtcGxlLCB5b3UgY291bGQgcHV0IGEgY29vbCBzY3JpcHQKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5IGFuZCBjaGVjayBpdCBvdXQgd2hlbmV2ZXIgeW91IHdhbnRlZCB0byB1c2UgaXQuCiAgICAgICAgICAqKiogTmV3IEZlYXR1cmUgKioqCgozLzI0Lzk3IDogI3ByYWdtYSBleHBvcnQgZGlyZWN0aXZlcyBhZGRlZCB0byBUY2wgb3V0cHV0IGZvciBjb21waWxpbmcKICAgICAgICAgIHNoYXJlZCBsaWJyYXJpZXMgb24gdGhlIE1hYy4KCjMvMjQvOTcgOiBNaW5vciBjaGFuZ2VzIHRvIHdpc2guaSBhbmQgdGNsc2guaSBsaWJyYXJ5IGZpbGVzIHRvIHByb3ZpZGUKICAgICAgICAgIHN1cHBvcnQgZm9yIHRoZSBNYWNpbnRvc2guCgozLzE5Lzk3IDogU1dJRydzIHBvbGljeSB0b3dhcmRzIE5VTEwgcG9pbnRlcnMgaGFzIGJlZW4gcmVsYXhlZC4gIFRoZQogICAgICAgICAgcG9saWN5IG9mIHJlcXVpcmluZyBhIHNwZWNpYWwgY29tcGlsZXIgZGlyZWN0aXZlIC1EQUxMT1dfTlVMTAogICAgICAgICAgdG8gdXNlIE5VTEwgcG9pbnRlcnMgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIFdoaWxlIHRoaXMgbWF5CiAgICAgICAgICBzZWVtICJ1bnNhZmUiLCBpdCB0dXJucyBvdXQgdGhhdCB5b3UgY2FuIHVzZSBhICJjaGVjayIKICAgICAgICAgIHR5cGVtYXAgdG8gYWNoaWV2ZSBzb21lIHNhZmV0eS4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAocGVybDUsY2hlY2spIE5vZGUgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIk5VTEwgUG9pbnRlcnMgbm90IGFsbG93ZWQuIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBwcmV2ZW50cyBhbnkgTlVMTCB2YWx1ZSBvZiBhICJOb2RlICoiIHBvaW50ZXIgdG8gYmUKICAgICAgICAgIHBhc3NlZCB0byBhIGZ1bmN0aW9uLiAgIChJIHRoaW5rIHRoaXMgaXMgbXVjaCBjbGVhbmVyCiAgICAgICAgICB0aGFuIHRoZSBvbGQgLURBTExPV19OVUxMIGhhY2sgYW55d2F5cykuCgozLzE5Lzk3IDogRml4ZWQgcG9pbnRlciBoYW5kbGluZyBlcnJvcnMgaW4gUGVybDUgbW9kdWxlLiAgTW9kdWxlcyBubwogICAgICAgICAgbG9uZ2VyIGNvcmUgZHVtcCB3aGVuIGEgUGVybCByZWZlcmVuY2UgaXMgaW5hZHZlcnRlbnRseQogICAgICAgICAgcGFzc2VkIGluIGFzIGEgQyBwb2ludGVyLgoKMy8xOC85NyA6IEFkZGVkIGEgImNoZWNrIiB0eXBlbWFwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlCiAgICAgICAgICB2YWxpZGl0eSBvZiBmdW5jdGlvbiBpbnB1dCB2YWx1ZXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAocGVybDUsY2hlY2spIGludCBwb3NpbnQgewogICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGFyZ2V0IDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIkFyZ3VtZW50IGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIiKTsKICAgICAgICAgICAgICAgIH0KCjMvMTgvOTcgOiBBZGRlZCBhbiAkYXJnIHZhcmlhYmxlIHRvIFRjbCB0eXBlbWFwcy4gICBUaGlzIG1ha2VzIGl0IGVhc2llcgogICAgICAgICAgdG8gcmV0dXJuIGFyZ3VtZW50IHZhbHVlcyBieSAicmVmZXJlbmNlIi4KCjMvMTgvOTcgOiBGaXhlZCBhIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2hlbiB1c2luZyBDKysgcmVmZXJlbmNlcyBhbmQKICAgICAgICAgIHRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuCgozLzE4Lzk3IDogRml4ZWQgYSBmZXcgZ2xpdGNoZXMgaW4gdGhlIHR5cGVtYXAgbW9kdWxlIHdpdGggcmVzcGVjdCB0bwogICAgICAgICAgY2hhaW5pbmcuIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAgJGluICAgICAgICAgICAgICAgIC8vIEluc2VydHMgcHJleGlzdGluZyB0eXBlbWFwCiAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJSZWNlaXZlZCBhICVkXG4iLCAkdGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIGhhcyBiZWVuIGFsbG93ZWQgZm9yIHF1aXRlIHNvbWUgdGltZSwgYnV0IGRpZG4ndCB3b3JrCiAgICAgICAgICBpZiBubyBleGlzdGluZyB0eXBlbWFwIHdhcyBkZWZpbmVkLiAgTm93LCBpdCBzdGlsbCBkb2Vzbid0CiAgICAgICAgICB3b3JrIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgaXMgZGVmaW5lZCwgYnV0IGl0IGlzc3VlcyBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuICAgVGhlcmUgaXMgc29tZSBzdXBwb3J0IHVzaW5nIGRlZmF1bHQgdHlwZW1hcHMsCiAgICAgICAgICBidXQgbm9uZSBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyB0YWtlIGFkdmFudGFnZSBvZiBpdC4gIFRoaXMKICAgICAgICAgIHNob3VsZCBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCBhdCB0aGlzIHRpbWUuCgpWZXJzaW9uIDEuMWI1IFBhdGNoIDEgKE1hcmNoIDE2LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMy8xNi85NyA6IEZpeGVkIHJlZmVyZW5jZXMgYnVnIHdpdGggQysrIGNvZGUgZ2VuZXJhdGlvbi4KCjMvMTYvOTcgOiBGaXhlZCBpbml0aWFsaXphdGlvbiBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIHRoYXQKICAgICAgICAgIHdhcyBjYXVzaW5nIHdlaXJkIHByb2JsZW1zLgoKMy8xNi85NyA6IEZpeGVkIGZhdGFsIGJ1ZyB3aXRoIC1jIG9wdGlvbiBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KCjMvMTMvOTcgOiBGaXhlZCBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGludm9sdmluZyB0aGUgJXRleHQgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgc29ydGluZy4gSW4gdGhlIG9sZCBzeXN0ZW0sICV0ZXh0IGVudHJpZXMgd291bGQgZmxvYXQgdG8gdGhlCiAgICAgICAgICB0b3Agb2YgYSBzZWN0aW9uIGJlY2F1c2UgdGhleSB3ZXJlICJuYW1lbGVzcyIuICAgTm93IHRoZXkgYXJlCiAgICAgICAgICBhdHRhY2hlZCB0byB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24gYW5kIHdpbGwgc3RheSBpbiB0aGUgcHJvcGVyCiAgICAgICAgICBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgZW50cnkuCgpWZXJzaW9uIDEuMWI1IChNYXJjaCAxMiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzExLzk3IDogRml4ZWQgY29tcGlsYXRpb24gcHJvYmxlbXMgaW50cm9kdWNlZCBieSBUY2wvVGsgOC4wYTIuCiAgICAgICAgICAqKiogSU5DT01QQVRJQklMSVRZICoqKiBTV0lHIG5vIGxvbmdlciB3b3JrcyB3aXRoIFRjbC9UayA4LjBhMS4KCjMvMTAvOTcgOiBGaXhlZCBidWcgd2l0aCBpZ25vcmVkIGFyZ3VtZW50cyBhbmQgQysrIG1lbWJlciBmdW5jdGlvbnMgaW4KICAgICAgICAgIHRoZSBQeXRob24gbW9kdWxlLgoKMy85Lzk3ICA6IFBhcnNpbmcgYnVncyB3aXRoIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBhbmQgcHJpdmF0ZWx5CiAgICAgICAgICBkZWNsYXJlZCBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMgZml4ZWQuCgozLzkvOTcgIDogRml4ZWQgYSBmZXcgbWlub3IgY29kZSBnZW5lcmF0aW9uIGJ1Z3Mgd2l0aCBDKysgY2xhc3NlcyBhbmQKICAgICAgICAgIGNvbnN0cnVjdG9ycy4gICBJbiBzb21lIGNhc2VzLCB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZQogICAgICAgICAgd291bGQgbm90IGNvbXBpbGUgcHJvcGVybHkuICAgU1dJRyBub3cgYXR0ZW1wdHMgdG8gdXNlCiAgICAgICAgICB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGluc3RlYWQuCgozLzgvOTcgIDogQWRkZWQgYSAtbCBvcHRpb24gdG8gU1dJRyB0aGF0IGFsbG93cyBhZGRpdGlvbmFsIFNXSUcgbGlicmFyeSBmaWxlcwogICAgICAgICAgdG8gYmUgZ3JhYmJlZCB3aXRob3V0IGhhdmluZyB0aGVtIHNwZWNpZmllZCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBrZWVwIHRoZSBpbnRlcmZhY2UgZmlsZSBjbGVhbiBhbmQgbW92ZSBjZXJ0YWluCiAgICAgICAgICBvcHRpb25zIGludG8gYSBNYWtlZmlsZS4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgIHN3aWcgLXRjbCBleGFtcGxlLmkgICAgICAgICAgICAgICMgIEJ1aWxkIGEgbm9ybWFsIFRjbCBleHRlbnNpb24KICAgICAgICAgICAgICBzd2lnIC10Y2wgLWx3aXNoLmkgZXhhbXBsZS5pICAgICAjICBCdWlsZCBpdCBhcyBhIHdpc2ggZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgYnkgaW5jbHVkaW5nIHRoZSAnd2lzaC5pJyBmaWxlLgoKICAgICAgICAgICAgICBzd2lnIC1weXRob24gZXhhbXBsZS5pICAgICAgICAgICAjIEJ1aWxkIGEgZHluYW1pY2FsbHkgbG9hZGVkIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiAtbGVtYmVkLmkgZXhhbXBsZS5pICMgQnVpbGQgYSBzdGF0aWMgZXh0ZW5zaW9uCgogICAgICAgICAgVGhlc2Uga2luZHMgb2Ygb3B0aW9ucyBjb3VsZCBwcmV2aW91c2x5IGJlIGFjY29tcGxpc2hlZCB3aXRoCiAgICAgICAgICBjb25kaXRpb25hbCBjb21waWxhdGlvbiBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgICAgICAlbW9kdWxlIGV4YW1wbGUKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgI2lmZGVmIFNUQVRJQwogICAgICAgICAgICAgICAgICAgJWluY2x1ZGUgZW1iZWQuaQogICAgICAgICAgICAgICAgICAgI2VuZGlmCgozLzgvOTcgIDogSW5jb3Jwb3JhdGVkIGNoYW5nZXMgdG8gR3VpbGUgbW9kdWxlIHRvIHVzZSB0aGUgbmV3IGdoIGludGVyZmFjZQogICAgICAgICAgaW4gRlNGIEd1aWxlIDEuMC4gICAgVGhlIG9sZGVyIGdzY20gaW50ZXJmYWNlIHVzZWQgaW4gQ3lnbnVzCiAgICAgICAgICBHdWlsZSByZWxlYXNlcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IFNXSUcuCgozLzgvOTcgIDogQ2xlYW5lZCB1cCB0aGUgVGNsIE5ldHNjYXBlIHBsdWdpbiBleGFtcGxlLiAgIEl0IHNob3VsZCB3b3JrIHdpdGgKICAgICAgICAgIHZlcnNpb24gMS4xIG9mIHRoZSBwbHVnaW4gbm93LgoKMy84Lzk3ICA6IEFkZGVkIGJldHRlciBhcnJheSBzdXBwb3J0IHRvIHRoZSB0eXBlbWFwIG1vZHVsZS4gIFRoZSBrZXl3b3JkCiAgICAgICAgICBBTlkgY2FuIG5vdyBiZSB1c2VkIHRvIG1hdGNoIGFueSBhcnJheSBkaW1lbnNpb24uICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFtBTlldIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyB3aWxsIG1hdGNoIGFueSBzaW5nbGUtZGltZW5zaW9uYWwgZG91YmxlIGFycmF5LiAgIFRoZSBhcnJheQogICAgICAgICAgZGltZW5zaW9uIGlzIHBhc3NlZCBpbiB0aGUgdmFyaWFibGVzICRkaW0wLCAkZGltMSwgLi4uICRkaW05LiAgRm9yCiAgICAgICAgICBleGFtcGxlIDoKCgkJICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFtBTlldW0FOWV1bQU5ZXSB7CgkJCXByaW50ZigiUmVjZWl2ZWQgYSBkb3VibGVbJWRdWyVkXVslZF1cbiIsJGRpbTAsJGRpbTEsJGRpbTIpOwoJICAgICAgICAgICAgfQoKICAgICAgICAgIEFueSB0eXBlbWFwIGludm9sdmluZyBhIHNwZWNpZmljIGFycmF5IGRpbWVuc2lvbiB3aWxsIG92ZXJyaWRlIGFueQogICAgICAgICAgc3BlY2lmaWVkIHdpdGggdGhlIEFOWSB0YWcuICBUaHVzLCBhICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFs1XVs0XVtBTlldIHt9CiAgICAgICAgICB3b3VsZCBvdmVycmlkZSBhIGRvdWJsZSBbQU5ZXVtBTlldW0FOWV0uICBIb3dldmVyLCBvdmVydXNlIG9mIHRoZSBBTlkKICAgICAgICAgIHRhZyBpbiBhcnJheXMgb2YgaGlnaC1kaW1lbnNpb25zIG1heSBub3Qgd29yayBhcyB5b3UgZXhwZWN0IGR1ZSB0bwogICAgICAgICAgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgcnVsZSB1c2VkLiBGb3IgZXhhbXBsZSwgd2hpY2ggb2YgdGhlIGZvbGxvd2luZwogICAgICAgICAgdHlwZW1hcHMgaGFzIHByZWNlZGVuY2U/CgogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbQU5ZXVs1XSB7fSAgICAgLy8gQXZvaWQgdGhpcyEKICAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgWzVdW0FOWV0ge30KCjMvNy85NyAgOiBGaXhlZCBhIG51bWJlciBvZiBidWdzIHJlbGF0ZWQgdG8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgaGFuZGxpbmcuCiAgICAgICAgICBUeXBlZGVmcyBpbnZvbHZpbmcgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG5vdyB3b3JrcyBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIE1BVFJJWFs0XVs0XTsKCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGRvdWJsZSBmb28oTUFUUklYIGEpOwoKICAgICAgICAgIFR5cGVjYXN0aW5nIG9mIHBvaW50ZXJzIGludG8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGlzIG5vdwogICAgICAgICAgaW1wbGVtZW50ZWQgcHJvcGVybHkgd2hlbiBtYWtpbmcgQy9DKysgZnVuY3Rpb24gY2FsbHMuCgozLzYvOTcgIDogRml4ZWQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGJ1ZyBpbiB0aGUgVGNsIE9iamVjdC1vcmllbnRlZAogICAgICAgICAgaW50ZXJmYWNlLiAgV2VsbCwgYWN0dWFsbHksIGRpZG4ndCBmaXggaXQgYnV0IGlzc3VlZCBhCiAgICAgICAgICBUY2wgZXJyb3IgaW5zdGVhZC4gICBUaGUgYnVnIHdvdWxkIG1hbmlmZXN0IGl0c2VsZiBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XSAgICAgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJSBzZXQgbSBbTGlzdCAtdGhpcyAkbF0gICMgTWFrZSAkbSBpbnRvIGFuIG9iamVjdCBhc3N1bWluZyAkbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRhaW5zIGEgcG9pbnRlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTaW5jZSAkbSA9PSAkbCwgJGwgZ2V0cyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoc2luY2UgaXRzIHRoZSBzYW1lIGNvbW1hbmQgbmFtZSkKICAgICAgICAgICAgICAgICAlICRtIGluc2VydCBGb28KICAgICAgICAgICAgICAgICBTZWdtZW50YXRpb24gZmF1bHQgICAgICAgIyBOb3RlIDogdGhlIGxpc3Qgbm8gbG9uZ2VyIGV4aXN0cyEKCiAgICAgICAgICBOb3csIGFuIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkIGluc3RlYWQgb2YgcmVkZWZpbmluZyB0aGUgY29tbWFuZC4KICAgICAgICAgIEFzIGluIDoKCiAgICAgICAgICAgICAgICAgJSBzZXQgbCBbTGlzdF0KICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXQogICAgICAgICAgICAgICAgIE9iamVjdCBuYW1lIGFscmVhZHkgZXhpc3RzIQoKICAgICAgICAgIFVzZSBjYXRjaHt9IHRvIGlnbm9yZSB0aGUgZXJyb3IuCgozLzMvOTcgIDogQmV0dGVyIHN1cHBvcnQgZm9yIGVudW1zIGFkZGVkLiAgIERhdGF0eXBlcyBvZiAnZW51bSBNeUVudW0nCiAgICAgICAgICBhbmQgdHlwZWRlZnMgc3VjaCBhcyAndHlwZWRlZiBlbnVtIE15RW51bSBGb287JyBub3cgd29yay4KCjMvMy85NyAgOiBQYXJzZXIgbW9kaWZpZWQgdG8gaWdub3JlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycyBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICBpbnQgYSxiOwogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbyhpbnQgaSkgOiBhKDApLCBiKGkpLCBCYXIoaSwwKSB7IH07CiAgICAgICAgICAgICAgIH07CgozLzMvOTcgIDogTW9kaWZpZWQgcGFyc2VyIHRvIGlnbm9yZSBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpIHRocm93KFgsWSk7CgozLzMvOTcgIDogQWRkZWQgJWltcG9ydCBkaXJlY3RpdmUuICBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSAlZXh0ZXJuCiAgICAgICAgICBleGNlcHQgaXQgdGVsbHMgdGhlIGxhbmd1YWdlIG1vZHVsZSB0aGF0IHRoZSBkZWNsYXJhdGlvbnMgYXJlCiAgICAgICAgICBjb21pbmcgZnJvbSBhIHNlcGFyYXRlIG1vZHVsZS4gICBUaGlzIGlzIHVzdWFsbHkgb25seQogICAgICAgICAgbmVlZGVkIHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLgoKMy8yLzk3ICA6IENoYW5nZWQgcG9pbnRlciB0eXBlLWNoZWNrZXIgdG8gYmUgc2lnbmlmaWNhbnRseSBtb3JlCiAgICAgICAgICBlZmZpY2llbnQgd2hlbiB3b3JraW5nIHdpdGggZGVyaXZlZCBkYXRhdHlwZXMuICBUaGlzCiAgICAgICAgICBoYXMgYmVlbiBhY2NvbXBsaXNoZWQgYnkgc3RvcmluZyB0eXBlLW1hcHBpbmdzIGluIHNvcnRlZAogICAgICAgICAgb3JkZXIsIHVzaW5nIGJpbmFyeSBzZWFyY2ggc2NoZW1lcywgYW5kIGNhY2hpbmcgcmVjZW50bHkKICAgICAgICAgIHVzZWQgZGF0YXR5cGVzLiAgIEZvciBTV0lHIGdlbmVyYXRlZCBDKysgbW9kdWxlcyB0aGF0CiAgICAgICAgICBtYWtlIGEgbGFyZ2UgbnVtYmVyIG9mIEMgZnVuY3Rpb24gY2FsbHMgd2l0aCBkZXJpdmVkIHR5cGVzLAogICAgICAgICAgdGhpcyBjb3VsZCByZXN1bHQgaW4gc3BlZWR1cHMgb2YgYmV0d2VlbiAxMDAgYW5kIDUwMDAwIHBlcmNlbnQuCiAgICAgICAgICBIb3dldmVyLCBkdWUgdG8gdGhlIHJlcXVpcmVkIHNvcnRpbmcgb3BlcmF0aW9uLCBtb2R1bGUKICAgICAgICAgIGxvYWRpbmcgdGltZSBtYXkgaW5jcmVhc2VkIHNsaWdodGx5IHdoZW4gdGhlcmUgYXJlIGxvdHMgb2YKICAgICAgICAgIGRhdGF0eXBlcy4KCjMvMi85NyAgOiBGaXhlZCBzb21lIEMrKyBjb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIFB5dGhvbgogICAgICAgICAgZW1iZWQuaSBsaWJyYXJ5IGZpbGVzLgoKMi8yNy85NyA6IFNsaWdodCBjaGFuZ2UgdG8gQysrIGNvZGUgZ2VuZXJhdGlvbiB0byB1c2UgY29weSBjb25zdHJ1Y3RvcnMKICAgICAgICAgIHdoZW4gcmV0dXJuaW5nIGNvbXBsZXggZGF0YSB0eXBlIGJ5IHZhbHVlLgoKMi8yNi85NyA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHdpdGggLWMgb3B0aW9uLgoKMi8yNi85NyA6IFNsaWdodCB0d2VhayBvZiBwYXJzZXIgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWEgaW4gZW51bWVyYXRpb25zCiAgICAgICAgICBzdWNoIGFzCgogICAgICAgICAgICAgICAgZW51bSBWYWx1ZSAoQUxFLCBTVE9VVCwgTEFHRVIsIH07CgoyLzI1Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiBUY2wgbW9kdWxlIHdoZW4gdXNpbmcgdGhlCiAgICAgICAgICAlbmFtZSgpIGRpcmVjdGl2ZSBvbiBhIGNsYXNzbmFtZS4KCjIvMjUvOTcgOiBGaW5pc2hlZCBjb2RlLXNpemUgb3B0aW1pemF0aW9uIG9mIEMrKyBjb2RlIGdlbmVyYXRpb24gd2l0aAogICAgICAgICAgaW5oZXJpdGFuY2Ugb2YgYXR0cmlidXRlcy4gICAgSW5oZXJpdGVkIGF0dHJpYnV0ZXMgbm93CiAgICAgICAgICBvbmx5IGdlbmVyYXRlIG9uZSBzZXQgb2Ygd3JhcHBlciBmdW5jdGlvbnMgdGhhdCBhcmUgcmUtdXNlZAogICAgICAgICAgaW4gYW55IGRlcml2ZWQgY2xhc3Nlcy4gICBUaGlzIGNvdWxkIHByb3ZpZGUgYmlnIGNvZGUKICAgICAgICAgIHNpemUgaW1wcm92ZW1lbnRzIGluIHNvbWUgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZXMuCgoyLzI1Lzk3IDogUGVybDUgbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgYm90aCB0aGUgVW5peCBhbmQgV2luZG93cwogICAgICAgICAgdmVyc2lvbnMuICBUaGUgd2luZG93cyB2ZXJzaW9uIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHRoZQogICAgICAgICAgQWN0aXZld2FyZSBwb3J0IG9mIFBlcmwgNS4wMDMgcnVubmluZyB1bmRlciBXaW5kb3dzIDk1LgogICAgICAgICAgVGhlIEMgc291cmNlIGdlbmVyYXRlZCBieSBTV0lHIHNob3VsZCBjb21waWxlIHdpdGhvdXQKICAgICAgICAgIG1vZGlmaWNhdGlvbiB1bmRlciBib3RoIHZlcnNpb25zIG9mIFBlcmwsIGJ1dCBpcyBub3cKICAgICAgICAgIGV2ZW4gbW9yZSBoaWRlb3VzIHRoYW4gYmVmb3JlLgoKMi8yNS85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyBzY29wZSByZXNvbHV0aW9uIG9wZXJhdGlvbiB0bwogICAgICAgICAgYXBwZWFyIGluIGV4cHJlc3Npb25zIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBhcyBpbiA6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IGEgPSAgQmFyOjpkZWZ2YWx1ZSk7CgoyLzI1Lzk3IDogRml4ZWQgYnVnIHdoZW4gcmVzb2x2aW5nIHN5bWJvbHMgaW5zaWRlIEMrKyBjbGFzc2VzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgZW51bSBWYWx1ZSB7QUxFLCBTVE9VVCwgTEFHRVJ9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB2b2lkIGRlZmFyZyhWYWx1ZSB2ID0gU1RPVVQpOwoKICAgICAgICAgICAgICB9OwoKMi8yNC85NyA6IEZpeGVkIGJ1ZyB3aXRoIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQgKi4KCjIvMjMvOTcgOiBNb2RpZmllZCBQeXRob24gbW9kdWxlIHRvIGJlIGJldHRlciBiZWhhdmVkIHVuZGVyIFdpbmRvd3MKCiAgICAgICAgICAgIC0gIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBub3cgcHJvcGVybHkgZXhwb3J0ZWQuCiAgICAgICAgICAgICAgIEl0IHNob3VsZCBub3QgYmUgbmVjY2Vzc2FyeSB0byBleHBsaWNpdGx5IGV4cG9ydCB0aGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgIHlvdXJzZWxmLgoKICAgICAgICAgICAgLSAgQml6YXJyZSBjb21waWxhdGlvbiBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyCiAgICAgICAgICAgICAgIGNvZGUgYXMgQU5TSSBDIHVuZGVyIFZpc3VhbCBDKysgNC54IGZpeGVkLgoKICAgICAgICAgICAgLSAgVGVzdGVkIHdpdGggYm90aCB0aGUgc3RvY2sgUHl0aG9uLTEuNCBkaXN0cmlidXRpb24gYW5kIFB5dGhvbndpbgogICAgICAgICAgICAgICBydW5uaW5nIHVuZGVyIFdpbjk1LgoKMi8xOS85NyA6IEZpeGVkIHR5cGVkZWYgaGFuZGxpbmcgYnVnIGluIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMi8xOS85NyA6IEFkZGVkIGV4Y2VwdGlvbiBzdXBwb3J0LiAgVG8gdXNlIGl0LCBkbyB0aGUgZm9sbG93aW5nIDoKCiAgICAgICAgICAgICAgJWV4Y2VwdChsYW5nKSB7CiAgICAgICAgICAgICAgICAgIC4uLiB0cnkgcGFydCBvZiB0aGUgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgLi4uIGNhdGNoIHBhcnQgb2YgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAkZnVuY3Rpb24gaXMgYSBTV0lHIHZhcmlhYmxlIHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUKICAgICAgICAgIGFjdHVhbCBDL0MrKyBmdW5jdGlvbiBjYWxsIGluIGEgd3JhcHBlciBmdW5jdGlvbi4gIFRodXMsCiAgICAgICAgICBhIHJlYWwgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gbWlnaHQgbG9vayBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICVleGNlcHQocGVybDUpIHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGNoYXIgKiYgc3opIHsKICAgICAgICAgICAgICAgICAgICAuLi4gcHJvY2VzcyBhbiBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvYWsoIlVua25vd24gZXhjZXB0aW9uLiBCYWlsaW5nIG91dC4uLiIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CgoyLzE5Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgbWFuYWdpbmcgZ2VuZXJpYyBjb2RlIGZyYWdtZW50cyAobmVlZGVkCiAgICAgICAgICBmb3IgZXhjZXB0aW9ucykuCgoyLzE5Lzk3IDogRml4ZWQgc29tZSByZWFsbHkgb2JzY3VyZSB0eXBlbWFwIHNjb3BpbmcgYnVncyBpbiB0aGUgQysrCiAgICAgICAgICBoYW5kbGVyLgoKMi8xOC85NyA6IENsZWFuZWQgdXAgcGVybG1haW4uaSBmaWxlIGJ5IHJlbW92aW5nIHNvbWUgcHJvYmxlbWF0aWMsCiAgICAgICAgICBidXQgc2VlbWluZ2x5IHVubmVjZXNzYXJ5IGRlY2xhcmF0aW9ucy4KCjIvMTgvOTcgOiBPcHRpbWl6ZWQgaGFuZGxpbmcgb2YgbWVtYmVyIGZ1bmN0aW9ucyB1bmRlciBpbmhlcml0YW5jZS4KICAgICAgICAgIFNXSUcgY2FuIG5vdyB1c2Ugd3JhcHBlciBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZvciBhCiAgICAgICAgICBiYXNlIGNsYXNzIGluc3RlYWQgb2YgcmVnZW5lcmF0aW5nIHdyYXBwZXJzIGZvcgogICAgICAgICAgdGhlIHNhbWUgZnVuY3Rpb25zIGluIGEgZGVyaXZlZCBjbGFzcy4gICAgVGhpcyBjb3VsZAogICAgICAgICAgbWFrZSBhIGRyYXN0aWMgcmVkdWN0aW9uIGluIHdyYXBwZXIgY29kZSBzaXplIGZvciBDKysKICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aXRoIGRlZXAgaW5oZXJpdGFuY2UgaGllcmFyY2hpZXMgYW5kCiAgICAgICAgICBsb3RzIG9mIGZ1bmN0aW9ucy4KCjIvMTgvOTcgOiBBZGRpdGlvbmFsIG1ldGhvZHMgc3BlY2lmaWVkIHdpdGggJWFkZG1ldGhvZHMgY2FuIG5vdwogICAgICAgICAgYmUgaW5oZXJpdGVkIGFsb25nIHdpdGggbm9ybWFsIEMrKyBtZW1iZXIgZnVuY3Rpb25zLgoKMi8xOC85NyA6IE1pbm9yIGludGVybmFsIGZpeGVzIHRvIG1ha2UgU1dJRydzIHN0cmluZyBoYW5kbGluZyBhIGxpdHRsZQogICAgICAgICAgc2FmZXIuCgoyLzE2Lzk3IDogTW92ZWQgc29tZSBjb2RlIGdlbmVyYXRpb24gb2YgVGNsIHNoYWRvdyBjbGFzc2VzIHRvCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLgoKMi8xNi85NyA6IEZpeGVkIGRvY3VtZW50YXRpb24gZXJyb3Igb2YgJy1jb25maWd1cmUnIG1ldGhvZCBpbgogICAgICAgICAgVGNsIG1vZHVsZXMuCgoyLzE2Lzk3IDogTW9kaWZpZWQgUGVybDUgbW9kdWxlIHNsaWdodGx5IHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICB0byB1c2UgUGVybCByZWZlcmVuY2VzLgoKMi8xMi85NyA6IEZpeGVkIGFyZ3VtZW50IGNoZWNraW5nIGJ1ZyB0aGF0IHdhcyBpbnRyb2R1Y2VkIGJ5CiAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cyAoZnVuY3Rpb24gY2FsbHMgd2l0aCB0b28gbWFueQogICAgICAgICAgYXJndW1lbnRzIHdvdWxkIHN0aWxsIGJlIGV4ZWN1dGVkKS4gIEZ1bmN0aW9ucyBub3cKICAgICAgICAgIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGFzIEMgdmVyc2lvbgogICAgICAgICAgKHdpdGggcG9zc2liaWxpdHkgb2YgZGVmYXVsdC9vcHRpb25hbCBhcmd1bWVudHMKICAgICAgICAgIHN0aWxsIHN1cHBvcnRlZCkuCgoyLzEyLzk3IDogRml4ZWQgZGVmYXVsdCBhcmd1bWVudCBidWcgaW4gUGVybDUgbW9kdWxlIHdoZW4KICAgICAgICAgIGdlbmVyYXRpbmcgd3JhcHBlciBmdW5jdGlvbnMgaW52b2x2aW5nIGRlZmF1bHQKICAgICAgICAgIGFyZ3VtZW50cyBvZiBjb21wbGV4IGRhdGF0eXBlcy4KCjIvMTIvOTcgOiBGaXhlZCB0eXBlbWFwIHNjb3BpbmcgcHJvYmxlbXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIHsKICAgICAgICAgICAgICAgICAgICAuLiBnZXQgYSBkb3VibGUgLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgZG91YmxlIGJhcihkb3VibGUpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewogICAgICAgICAgICAgICAgICAgIC4uIG5ldyBnZXQgZG91YmxlIC4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdvdWxkIGFwcGx5IHRoZSBzZWNvbmQgdHlwZW1hcCB0byBhbGwgZnVuY3Rpb25zIGluIEZvbwogICAgICAgICAgZHVlIHRvIGRlbGF5ZWQgZ2VuZXJhdGlvbiBvZiBDKysgd3JhcHBlciBjb2RlIChjbGVhcmx5IHRoaXMKICAgICAgICAgIGlzIG5vdCB0aGUgZGVzaXJlZCBlZmZlY3QpLiAgIFByb2JsZW0gaGFzIGJlZW4gZml4ZWQgYnkKICAgICAgICAgIGFzc2lnbmluZyB1bmlxdWUgbnVtZXJpY2FsIGlkZW50aWZpZXJzIHRvIGV2ZXJ5IGRhdGF0eXBlIGluCiAgICAgICAgICBhbiBpbnRlcmZhY2UgZmlsZSBhbmQgcmVjb3JkaW5nIHRoZSAicmFuZ2Ugb2YgZWZmZWN0IiBvZiBlYWNoCiAgICAgICAgICB0eXBlbWFwLgoKMi8xMS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yICJpZ25vcmUiIGFuZCAiZGVmYXVsdCIgdHlwZW1hcHMuICBPbmx5IHVzZQogICAgICAgICAgaWYgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy4KCjIvOS85NyAgOiBBZGRlZCBhdXRvbWF0aWMgY3JlYXRpb24gb2YgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IKICAgICAgICAgIEMgc3RydWN0cyBhbmQgQysrIGNsYXNzZXMgdGhhdCBkbyBub3Qgc3BlY2lmeSBhbnkgc29ydCBvZgogICAgICAgICAgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gICBUaGlzIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQgYnkKICAgICAgICAgIHJ1bm5pbmcgU1dJRyB3aXRoIHRoZSAnLW1ha2VfZGVmYXVsdCcgb3B0aW9uIG9yIGJ5IGluc2VydGluZwogICAgICAgICAgdGhlIGZvbGxvd2luZyBwcmFnbWEgaW50byBhbiBpbnRlcmZhY2UgZmlsZSA6CgogICAgICAgICAgICAgICAgICVwcmFnbWEgbWFrZV9kZWZhdWx0CgogICAgICAgICAgVGhlIGZvbGxvd2luZyBwcmFnbWEgZGlzYWJsZXMgYXV0b21hdGljIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24KCiAgICAgICAgICAgICAgICAgJXByYWdtYSBub19kZWZhdWx0CgoyLzkvOTcgIDogQWRkZWQgLW1ha2VfZGVmYXVsdCBvcHRpb24gZm9yIHByb2R1Y2luZyBkZWZhdWx0IGNvbnN0cnVjdG9ycwogICAgICAgICAgYW5kIGRlc3RydWN0b3JzIGZvciBjbGFzc2VzIHdpdGhvdXQgdGhlbS4KCjIvOS85NyAgOiBDaGFuZ2VkIHRoZSBzeW50YXggb2YgdGhlIFNXSUcgJXByYWdtYSBkaXJlY3RpdmUgdG8KICAgICAgICAgICVwcmFnbWEgb3B0aW9uPXZhbHVlIG9yICVwcmFnbWEobGFuZykgb3B0aW9uPXZhbHVlLgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWFrZXMgdGhlIHN5bnRheCBhIGxpdHRsZSBtb3JlIGNvbnNpc3RlbnQKICAgICAgICAgIGJldHdlZW4gZ2VuZXJhbCBwcmFnbWFzIGFuZCBsYW5ndWFnZS1zcGVjaWZpYyBwcmFnbWFzLgogICAgICAgICAgVGhlIG9sZCBzeW50YXggc3RpbGwgd29ya3MsIGJ1dCB3aWxsIHByb2JhYmx5IGJlIHBoYXNlZAogICAgICAgICAgb3V0IChhIHdhcm5pbmcgbWVzc2FnZSBpcyBjdXJyZW50bHkgcHJpbnRlZCkuCgoyLzkvOTcgIDogSW1wcm92ZWQgVGNsIHN1cHBvcnQgb2YgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGFyZSBvZgogICAgICAgICAgc3RydWN0dXJlcywgY2xhc3NlcywgYW5kIHVuaW9ucy4KCjIvOS85NyAgOiBGaXhlZCBDKysgY29tcGlsYXRpb24gcHJvYmxlbSBpbiBQeXRob24gJ2VtYmVkLmknIGxpYnJhcnkgZmlsZS4KCjIvOS85NyAgOiBGaXhlZCBtaXNzaW5nIHJldHVybiB2YWx1ZSBpbiBwZXJsbWFpbi5pIGxpYnJhcnkgZmlsZS4KCjIvOS85NyAgOiBGaXhlZCBQeXRob24gc2hhZG93IGNsYXNzZXMgdG8gcmV0dXJuIGFuIEF0dHJpYnV0ZUVycm9yIHdoZW4KICAgICAgICAgIHVuZGVmaW5lZCBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NlZCAob2xkZXIgdmVyc2lvbnMgcmV0dXJuZWQKICAgICAgICAgIGEgTmFtZUVycm9yKS4KCjIvOS85NyAgOiBGaXhlZCBidWcgd2hlbiAlYWRkbWV0aG9kcyBpcyB1c2VkIGFmdGVyIGEgY2xhc3MgZGVmaW5pdGlvbiB3aG9zZQogICAgICAgICAgbGFzdCBzZWN0aW9uIGlzIHByb3RlY3RlZCBvciBwcml2YXRlLgoKMi84Lzk3ICA6IE1hZGUgc2xpZ2h0IGNoYW5nZXMgaW4gaW5jbHVkZSBmaWxlIHByb2Nlc3NpbmcgdG8gc3VwcG9ydAogICAgICAgICAgdGhlIE1hY2ludG9zaC4KCjIvOC85NyAgOiBFeHRlbmRlZCBzd2lnbWFpbi5jeHggdG8gcHJvdmlkZSBhIHJ1ZGltZW50YXJ5IE1hY2ludG9zaCBpbnRlcmZhY2UuCiAgICAgICAgICBJdCdzIGEgcmVhbGx5IGJhZCBpbnRlcmZhY2UsIGJ1dCB3b3JrcyB1bnRpbCBzb21ldGhpbmcgYmV0dGVyCiAgICAgICAgICBpcyB3cml0dGVuLgoKMS8yOS85NyA6IEZpeGVkIHR5cGUtY2FzdGluZyBidWcgaW50cm9kdWNlZCBieSAxLjFiNCB3aGVuIHNldHRpbmcvZ2V0dGluZyB0aGUKICAgICAgICAgIHZhbHVlIG9mIGdsb2JhbCB2YXJpYWJsZXMgaW52b2x2aW5nIGNvbXBsZXggZGF0YSB0eXBlcy4KCjEvMjkvOTcgOiBSZW1vdmVkIGVycm9uZW91cyB3aGl0ZSBzcGFjZSBiZWZvcmUgYW4gI2VuZGlmIGluIHRoZSBjb2RlIGdlbmVyYXRlZAogICAgICAgICAgYnkgdGhlIFB5dGhvbiBtb2R1bGUgKHdhcyBjYXVzaW5nIGVycm9ycyBvbiBERUMgQWxwaGEgY29tcGlsZXJzKS4KCjEvMjYvOTcgOiBGaXhlZCBlcnJvcnMgd2hlbiB1c2luZyBkZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50cyBpbiBQeXRob24gc2hhZG93CgkgIHNoYWRvdyBjbGFzc2VzLgoKMS8yMy85NyA6IEZpeGVkIGJ1ZyB3aXRoIG5lc3RlZCAlZXh0ZXJuIGRlY2xhcmF0aW9ucy4KCjEvMjEvOTcgOiBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZWRlZiBpbnZvbHZpbmcgY29uc3QgZGF0YXR5cGVzLgoKMS8yMS85NyA6IFNvbWV3aGF0IG9ic2N1cmUsIGJ1dCBzZXJpb3VzIGJ1ZyB3aXRoIGhhdmluZyBtdWx0aXBsZSBsZXZlbHMKICAgICAgICAgIG9mIHR5cGVkZWZzIGZpeGVkLiAgRm9yIGV4YW1wbGUgOgoKCQl0eXBlZGVmIGNoYXIgKlN0cmluZzsKICAgICAgICAgICAgICAgIHR5cGVkZWYgU3RyaW5nICBOYW1lOwoKVmVyc2lvbiAxLjEgQmV0YTQgKEphbnVhcnkgMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTm90ZSA6IFNXSUcgMS4xYjMgY3Jhc2hlZCBhbmQgYnVybmVkIHNob3J0bHkgYWZ0ZXIgdGFrZSBvZmYgZHVlCnRvIGEgZmV3IG1ham9yIHJ1bi10aW1lIHByb2JsZW1zIHRoYXQgc3VyZmFjZWQgYWZ0ZXIgcmVsZWFzZS4KVGhpcyByZWxlYXNlIHNob3VsZCBmaXggbW9zdCwgaWYgbm90IGFsbCwgb2YgdGhvc2UgcHJvYmxlbXMuCgoxLzE2Lzk3IDogRml4ZWQgbWFqb3IgbWVtb3J5IG1hbmFnZW1lbnQgYnVnIG9uIExpbnV4CgoxLzE0Lzk3IDogRml4ZWQgYnVnIGluIGZ1bmN0aW9ucyByZXR1cm5pbmcgY29uc3RhbnQgQysrIHJlZmVyZW5jZXMuCgoxLzE0Lzk3IDogTW9kaWZpZWQgQysrIG1vZHVsZSB0byBoYW5kbGUgZGF0YXR5cGVzIGJldHRlci4KCjEvMTQvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgYSAqc2luZ2xlKiBzY29wZSByZXNvbHV0aW9uCiAgICAgICAgICBvcGVyYXRvciBpbiBkYXRhdHlwZXMuICBJZSA6IEZvbzo6YmFyLiAgIFNXSUcgZG9lc24ndAogICAgICAgICAgeWV0IGhhbmRsZSBuZXN0ZWQgY2xhc3Nlcywgc28gdGhpcyBzaG91bGQgYmUKICAgICAgICAgIHN1ZmZpY2llbnQgZm9yIG5vdy4KCjEvMTQvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgdHlwZWRlZiBpbnNpZGUgYSBDKysgY2xhc3MuCgoxLzE0Lzk3IDogRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIGRhdGF0eXBlcyBkZWZpbmVkIGluc2lkZQogICAgICAgICAgYSBDKysgY2xhc3MuICBTV0lHIHdhcyBub3QgZ2VuZXJhdGluZyBjb3JyZWN0IGNvZGUsCiAgICAgICAgICBidXQgYSBuZXcgc2NvcGluZyBtZWNoYW5pc20gYW5kIG1ldGhvZCBmb3IgaGFuZGxpbmcKICAgICAgICAgIGRhdGF0eXBlcyBpbnNpZGUgYSBDKysgY2xhc3MgaGF2ZSBiZWVuIGFkZGVkLgoKMS8xNC85NyA6IENoYW5nZWQgZW51bWVyYXRpb25zIHRvIHVzZSB0aGUgdmFsdWUgbmFtZSBpbnN0ZWFkCiAgICAgICAgICBvZiBhbnkgdmFsdWVzIHRoYXQgbWlnaHQgaGF2ZSBhcHBlYXJlZCBpbiB0aGUgaW50ZXJmYWNlCiAgICAgICAgICBmaWxlLiAgVGhpcyBtYWtlcyB0aGUgY29kZSBhIGxpdHRsZSBtb3JlIGZyaWVuZGx5IHRvCiAgICAgICAgICBDKysgY29tcGlsZXJzLgoKMS8xNC85NyA6IFJlbW92ZWQgdHlwZWRlZiBidWcgdGhhdCBtYWRlIGFsbCBlbnVtZXJhdGlvbnMKICAgICAgICAgIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlciBpbiB0aGUgdHlwZSBjaGVja2VyIChzaW5jZQogICAgICAgICAgaXQgZ2VuZXJhdGVkIGFsb3Qgb2YgdW5uZWNlc3NhcnkgY29kZSkuCgpWZXJzaW9uIDEuMSBCZXRhMyAoSmFudWFyeSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTm90ZSA6IEEgKmh1Z2UqIG51bWJlciBvZiBjaGFuZ2VzIHJlbGF0ZWQgdG8gb25nb2luZyBtb2RpZmljYXRpb25zLgoKMS4gIFN1cHBvcnQgZm9yIEMrKyBtdWx0aXBsZSBpbmhlcml0YW5jZSBhZGRlZC4KCjIuICBUeXBlbWFwcyBhZGRlZC4KCjMuICBTb21lIHN1cHBvcnQgZm9yIG5lc3RlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgYWRkZWQuCgo0LiAgRGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZyBhZGRlZC4KCjUuICAtYyBvcHRpb24gYWRkZWQgZm9yIGJ1aWxkaW5nIGJhcmUgd3JhcHBlciBjb2RlIG1vZHVsZXMuCgo2LiAgUmV3cm90ZSBQb2ludGVyIHR5cGUtY2hlY2tpbmcgdG8gc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZQogICAgY29ycmVjdGx5LgoKNy4gIFRjbCA4LjAgbW9kdWxlIGFkZGVkLgoKOC4gIFBlcmw0IGFuZCBHdWlsZSBtb2R1bGVzIHJlc3VycmVjdGVkIGZyb20gdGhlIGRlYWQgKHdlbGwsIHRoZXkKICAgIGF0IGxlYXN0IHdvcmsgYWdhaW4pLgoKOS4gIE5ldyBPYmplY3QgT3JpZW50ZWQgVGNsIGludGVyZmFjZSBhZGRlZC4KCjEwLiBCdWcgZml4ZXMgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMuCgoxMS4gQ2xlYW5lZCB1cCBtYW55IG9mIHRoZSBpbnRlcm5hbCBtb2R1bGVzIG9mIHRoZSBwYXJzZXIuCgoxMi4gVG9ucyBvZiBleGFtcGxlcyBhbmQgdGVzdGluZyBtb2R1bGVzIGFkZGVkLgoKMTMuIEZpeGVkIGJ1Z3MgcmVsYXRlZCB0byB1c2Ugb2YgImNvbnN0IiByZXR1cm4gdmFsdWVzLgoKMTQuIEZpeGVkIGJ1ZyB3aXRoIEMrKyBtZW1iZXIgZnVuY3Rpb25zIHJldHVybmluZyB2b2lkICouCgoxNS4gQ2hhbmdlZCBTV0lHIGNvbmZpZ3VyYXRpb24gc2NyaXB0LgoKVmVyc2lvbiAxLjEgQmV0YTIgKERlY2VtYmVyIDMsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gQ29tcGxldGVseSByZXdyb3RlIHRoZSBTV0lHIGRvY3VtZW50YXRpb24gc3lzdGVtLiAgVGhlIGNoYW5nZXMKICAgaW52b2x2ZWQgYXJlIHRvbyBudW1lcm91cyB0byBtZW50aW9uLiAgQmFzaWNhbGx5LCB0YWtlIGV2ZXJ5dGhpbmcKICAgeW91IGtuZXcgYWJvdXQgdGhlIG9sZCBzeXN0ZW0sIHRocm93IHRoZW0gb3V0LCBhbmQgcmVhZCB0aGUKICAgZmlsZSBEb2MvZG9jLnBzLgoKMi4gTGltaXRlZCBzdXBwb3J0IGZvciAjaWYgZGVmaW5lZCgpIGFkZGVkLgoKMy4gVHlwZSBjYXN0cyBhcmUgbm93IGFsbG93ZWQgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuICBpZQoKICAgICAgICAgI2RlZmluZSAgQSAgIChpbnQpIDMKCjQuIEFkZGVkIHN1cHBvcnQgZm9yIHR5cGVkZWYgbGlzdHMuICBGb3IgZXhhbXBsZSA6CgoJdHlwZWRlZiBzdHJ1Y3QgewoJICAgICAgICBkb3VibGUgeCx5LHo7CiAgICAgICAgfSBWZWN0b3IsICpWZWN0b3JQdHI7Cgo1LiBOZXcgU1dJRyBkaXJlY3RpdmVzIChyZWxhdGVkIHRvIGRvY3VtZW50YXRpb24gc3lzdGVtKQoKCSVzdHlsZQoJJWxvY2Fsc3R5bGUKCSVzdWJzZWN0aW9uCgklc3Vic3Vic2VjdGlvbgoKNi4gUmVvcmdhbml6ZWQgdGhlIEMrKyBoYW5kbGluZyBhbmQgbWFkZSBpdCBhIGxpdHRsZSBlYXNpZXIgdG8KICAgd29yayB3aXRoIGludGVybmFsbHkuCgo3LiAgRml4ZWQgcHJvYmxlbSB3aXRoIGluaGVyaXRpbmcgZGF0YSBtZW1iZXJzIGluIFB5dGhvbgogICAgc2hhZG93IGNsYXNzZXMuCgo4LiAgRml4ZWQgc3ltYm9sIHRhYmxlIHByb2JsZW1zIHdpdGggc2hhZG93IGNsYXNzZXMgaW4gYm90aAogICAgUHl0aG9uIGFuZCBQZXJsLgoKOS4gIEZpeGVkIGFubm95aW5nIHNlZ21lbnRhdGlvbiBmYXVsdCBidWcgaW4gd3JhcHBlciBjb2RlCiAgICBnZW5lcmF0ZWQgZm9yIFBlcmw1LgoKMTAuIEZpeGVkIGJ1ZyB3aXRoICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4gIE5vdyBpdCBjYW4gYmUgcGxhY2VkCiAgICBhbnl3aGVyZSBpbiBhIGNsYXNzLgoKMTEuIE1vcmUgdGVzdCBjYXNlcyBhZGRlZCB0byB0aGUgU1dJRyBzZWxmLXRlc3QuICAgRG9jdW1lbnRhdGlvbgogICAgdGVzdHMgYXJlIG5vdyBwZXJmb3JtZWQgYWxvbmcgd2l0aCBvdGhlciB0aGluZ3MuCgoxMi4gUmVvcmdhbml6ZWQgdGhlIFNXSUcgbGlicmFyeSBhIGxpdHRsZSBiaXQgYW5kIHNldCBpdCB1cCB0bwogICAgc2VsZi1kb2N1bWVudCBpdHNlbGYgdXNpbmcgU1dJRy4KCjEzLiBMb3RzIGFuZCBsb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyAobW9zdGx5IG9ic2N1cmUsIGJ1dCBidWdzCiAgICBub25ldGhlbGVzcykuCgoKVmVyc2lvbiAxLjEgQmV0YTEgKE9jdG9iZXIgMzAsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gQWRkZWQgbmV3ICVleHRlcm4gZGlyZWN0aXZlIGZvciBoYW5kbGluZyBtdWx0aXBsZSBmaWxlcwoKMi4gUGVybDUgc2hhZG93IGNsYXNzZXMgYWRkZWQKCjMuIFJld3JvdGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gd29yayBiZXR0ZXIKCjQuIEFkZGVkICdib29sJyBkYXRhdHlwZQoKNS4gJXssJX0gYmxvY2sgaXMgbm93IG9wdGlvbmFsLgoKNi4gRml4ZWQgc29tZSBidWdzIGluIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIG1vZHVsZQoKNy4gUmV3cm90ZSBhbGwgb2YgdGhlIFNXSUcgdGVzdHMgdG8gYmUgbW9yZSBpbmZvcm1hdGl2ZQogICAoYW5kIGxlc3Mgc2NhcnkpLgoKOC4gUmV3cm90ZSBwYXJhbWV0ZXIgbGlzdCBoYW5kbGluZyB0byBiZSBtb3JlIG1lbW9yeQogICBlZmZpY2llbnQgYW5kIGZsZXhpYmxlLgoKOS4gQ2hhbmdlZCBwYXJzZXIgdG8gaWdub3JlICdzdGF0aWMnIGRlY2xhcmF0aW9ucy4KCjEwLiBJbml0aWFsaXplcnMgYXJlIG5vdyBpZ25vcmVkLiAgRm9yIGV4YW1wbGUgOgoKCXN0cnVjdCBGb29CYXIgYSA9IHszLDQsNX07CgoxMS4gU29tZXdoYXQgYmV0dGVyIHBhcnNpbmcgb2YgYXJyYXlzIChhbHRob3VnaCBpdCdzCiAgICB1c3VhbGx5IGp1c3QgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBub3cpLgoKMTIuIExvdCdzIG9mIG1pbm9yIGJ1ZyBmaXhlcy4KCgpWZXJzaW9uIDEuMCBGaW5hbCAoQXVndXN0IDMxLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gRml4ZWQgbWlub3IgYnVnIGluIEMrKyBtb2R1bGUKCjIuIEZpeGVkIG1pbm9yIGJ1ZyBpbiBwb2ludGVyIHR5cGUtY2hlY2tlciB3aGVuIHVzaW5nCiAgIC1EQUxMT1dfTlVMTC4KCjMuIEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gd29yayB3aXRoIFB5dGhvbiAxLjRiZXRhMwoKNC4gQ2hhbmdlZCBjb25maWd1cmUgc2NyaXB0IHRvIGFsbG93IGNvbXBpbGF0aW9uIHdpdGhvdXQKICAgeWFjYyBvciBiaXNvbi4KClZlcnNpb24gMS4wIEZpbmFsIChBdWd1c3QgMjgsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiAgQ2hhbmdlZCBwYXJzZXIgdG8gc3VwcG9ydCBtb3JlIEMvQysrIGRhdGF0eXBlcyAod2VsbCwKICAgIG1vcmUgdmFyaWFudHMpLiAgIFR5cGVzIGxpa2UgInVuc2lnbmVkIiwgInNob3J0IGludCIsCiAgICAibG9uZyBpbnQiLCBldGMuLi4gbm93IHdvcmsuCgoyLiAgInVuaW9ucyIgYWRkZWQgdG8gcGFyc2VyLgoKMy4gIFVzZSBvZiAidHlwZWRlZiIgYXMgaW4gOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgZG91YmxlIHgseSx6OwoJfSBWZWN0b3I7CgogICAgTm93IHdvcmtzIGNvcnJlY3RseS4gICBUaGUgbmFtZSBvZiB0aGUgdHlwZWRlZiBpcyB1c2VkIGFzCiAgICB0aGUgc3RydWN0dXJlIG5hbWUuCgo0LiAgQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2l0aCAjaWZkZWYsICNlbHNlLCAjZW5kaWYsIGV0Yy4uLgogICAgYWRkZWQuCgo1LiAgTmV3ICVkaXNhYmxlZG9jLCAlZW5hYmxlZG9jIGRpcmVjdGl2ZXMgYWxsb3cgZG9jdW1lbnRhdGlvbgogICAgdG8gc2VsZWN0aXZlbHkgYmUgZGlzYWJsZWQgZm9yIGNlcnRhaW4gcGFydHMgb2YgYSB3cmFwcGVyCiAgICBmaWxlLgoKNi4gIE5ldyBQeXRob24gbW9kdWxlIHN1cHBvcnRzIGJldHRlciB2YXJpYWJsZSBsaW5raW5nLCBjb25zdGFudHMsCiAgICBhbmQgc2hhZG93IGNsYXNzZXMuCgo3LiAgUGVybDUgbW9kdWxlIGltcHJvdmVkIHdpdGggYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBYUwogICAgYW5kIHhzdWJwcC4gICBTV0lHIHBvaW50ZXJzIGFuZCBub3cgY3JlYXRlZCBzbyB0aGF0IHRoZXkKICAgIGFyZSBjb21wYXRpYmxlIHdpdGggeHN1YnBwIHBvaW50ZXJzLgoKOC4gIFN1cHBvcnQgZm9yIFtpbmNyIFRjbF0gbmFtZXNwYWNlcyBhZGRlZCB0byBUY2wgbW9kdWxlLgoKOS4gICVwcmFnbWEgZGlyZWN0aXZlIGFkZGVkLgoKMTAuICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBhZGRlZC4KCjExLiAlbmF0aXZlIGRpcmVjdGl2ZSBhZGRlZCB0byBhbGxvdyBwcmUtZXhpc3Rpbmcgd3JhcHBlciBmdW5jdGlvbnMKICAgIHRvIGJlIHVzZWQuCgoxMi4gV3JvdGUgY29uZmlndXJlIHNjcmlwdCBmb3IgU1dJRyBpbnN0YWxsYXRpb24uCgoxMy4gRnVuY3Rpb24gcG9pbnRlcnMgbm93IGFsbG93ZWQgd2l0aCB0eXBlZGVmIHN0YXRlbWVudHMuCgoxNC4gJXR5cGVkZWYgbW9kaWZpZWQgdG8gaW5zZXJ0IGEgY29ycmVzcG9uZGluZyBDIHR5cGVkZWYgaW50bwogICAgdGhlIG91dHB1dCBmaWxlLgoKMTUuIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byBDKysgcmVmZXJlbmNlcy4KCjE2LiBOZXcgU3RyaW5nIGFuZCBXcmFwcGVyRnVuY3Rpb24gY2xhc3NlcyBhZGQgdG8gbWFrZSBnZW5lcmF0aW5nCiAgICB3cmFwcGVyIGNvZGUgZWFzaWVyLgoKMTcuIEZpeGVkIGNvbW1hbmQgbGluZSBvcHRpb24gcHJvY2Vzc2luZyB0byBlbGltaW5hdGUgY29yZSBkdW1wcwogICAgYW5kIHRvIGFsbG93IGhlbHAgbWVzc2FnZXMuCgoxOC4gTG90J3Mgb2YgbWlub3IgYnVnIGZpeGVzIHRvIGFsbW9zdCBhbGwgY29kZSBtb2R1bGVzCgoKVmVyc2lvbiAxLjAgQmV0YSAzIChQYXRjaCAxKSBKdWx5IDE3LCAxOTk2Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4wIEZpbmFsIGlzIG5vdCBxdWl0ZSByZWFkeSB5ZXQsIGJ1dCB0aGlzIHJlbGVhc2UgZml4ZXMgYQpudW1iZXIgb2YgaW1tZWRpYXRlIHByb2JsZW1zIDoKCjEuICBDb21waWxlciBlcnJvcnMgd2hlbiB1c2luZyAtc3RyaWN0IDEgdHlwZSBjaGVja2luZyBoYXZlIGJlZW4gZml4ZWQuCgoyLiAgUG9pbnRlciB0eXBlIGNoZWNrZXIgbm93IHJlY29nbml6ZXMgcG9pbnRlcnMgb2YgdGhlIGZvcm0KICAgIF8wX1R5cGUgY29ycmVjdGx5LgoKMy4gIEEgZmV3IG1pbm9yIGZpeGVzIHdlcmUgbWFkZSBpbiB0aGUgTWFrZWZpbGUKClZlcnNpb24gMS4wIEJldGEgMyAoSnVuZSAxNCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKClRoZXJlIGFyZSBsb3RzIG9mIGNoYW5nZXMgaW4gdGhpcyByZWxlYXNlIDoKCjEuICBTV0lHIGlzIG5vdyBpbnZva2VkIHVzaW5nIHRoZSAic3dpZyIgY29tbWFuZCBpbnN0ZWFkIG9mICJ3cmFwIi4KICAgIEhleSwgc3dpZyBzb3VuZHMgY29vbGVyLgoKMi4gIFRoZSBTV0lHX0xJQiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgc2V0IHRvIGNoYW5nZSB0aGUKICAgIGxvY2F0aW9uIHdoZXJlIFNXSUcgbG9va3MgZm9yIGxpYnJhcnkgZmlsZXMuCgozLiAgQysrIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuICAgWW91IHNob3VsZCB1c2UgdGhlIC1jKysgb3B0aW9uCiAgICB0byBlbmFibGUgaXQuCgo0LiAgVGhlICVpbml0IGRpcmVjdGl2ZSBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgJW1vZHVsZSBkaXJlY3RpdmUuCiAgICAlbW9kdWxlIGNvbnN0cnVjdHMgYSB2YWxpZCBuYW1lIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KICAgIGZvciB3aGF0ZXZlciB0YXJnZXQgbGFuZ3VhZ2UgeW91J3JlIHVzaW5nIChhY3R1YWxseSB0aGlzIG1ha2VzCiAgICBTV0lHIGZpbGVzIGEgbGl0dGxlIGNsZWFuZXIpLiAgVGhlIG9sZCAlaW5pdCBkaXJlY3RpdmUgc3RpbGwgd29ya3MuCgo1LiAgVGhlIHN5bnRheCBvZiB0aGUgJW5hbWUgZGlyZWN0aXZlIGhhcyBiZWVuIGNoYW5nZWQuICAgVXNlIG9mIHRoZQogICAgb2xkIG9uZSBzaG91bGQgZ2VuZXJhdGUgYSB3YXJuaW5nIG1lc3NhZ2UsIGJ1dCBtYXkgc3RpbGwgd29yay4KCjYuICBUbyBzdXBwb3J0IFRjbC9UayBvbiBub24tdW5peCBwbGF0Zm9ybXMsIFNXSUcgaW1wb3J0cyBhIGZpbGUgY2FsbGVkCiAgICBzd2lndGNsLmNmZyBmcm9tIHRoZSAkKFNXSUdfTElCKS90Y2wgZGlyZWN0b3J5LiAgIEkgZG9uJ3QgaGF2ZSBhY2Nlc3MKICAgIHRvIGFuIE5UIG1hY2hpbmUsIGJ1dCB0aGlzIGZpbGUgaXMgc3VwcG9zZWRseSBhbGxvd3MgU1dJRyB0bwogICAgcHJvZHVjZSB3cmFwcGVyIGNvZGUgdGhhdCBjb21waWxlcyBvbiBib3RoIFVOSVggYW5kIG5vbiBVTklYIG1hY2hpbmVzLgogICAgSWYgdGhpcyBkb2Vzbid0IHdvcmssIHlvdSdsbCBoYXZlIHRvIGVkaXQgdGhlIGZpbGUgc3dpZ3RjbC5jZmcuIFBsZWFzZQogICAgbGV0IG1lIGtub3cgaWYgdGhpcyBkb2Vzbid0IHdvcmsgc28gSSBjYW4gdXBkYXRlIHRoZSBmaWxlIGFzCiAgICBuZWNlc3NhcnkuCgo3LiAgVGhlIFNXSUcgcnVuLXRpbWUgdHlwZWNoZWNrZXIgaGFzIGJlZW4gaW1wcm92ZWQuICAgIFlvdSBjYW4gYWxzbwogICAgbm93IHJlZGVmaW5lIGhvdyBpdCB3b3JrcyBieSBzdXBwbHlpbmcgYSBmaWxlIGNhbGxlZCAic3dpZ3B0ci5jZmciCiAgICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgeW91ciBTV0lHIGludGVyZmFjZSBmaWxlcy4gICBCeSBkZWZhdWx0LAogICAgU1dJRyByZWFkcyB0aGlzIGZpbGUgZnJvbSAkKFNXSUdfTElCKS9jb25maWcuCgo4LiAgVGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGhhcyBiZWVuIGNoYW5nZWQgdG8gc3VwcG9ydCB0aGUgZm9sbG93aW5nIDoKCgktICBEb2N1bWVudGF0aW9uIG9yZGVyIGlzIHByaW50ZWQgaW4gaW50ZXJmYWNlIGZpbGUgb3JkZXIgYnkKICAgICAgICAgICBkZWZhdWx0LiAgIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHV0dGluZyBhbiAlYWxwaGEKICAgICAgICAgICBkaXJlY3RpdmUgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgIC0gIFlvdSBjYW4gc3VwcGx5IGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiB0ZXh0IHVzaW5nCgogICAgICAgICAgICV0ZXh0ICV7IHB1dCB5b3VyIHRleHQgaGVyZSAlfQoKICAgICAgICAtICBBIGZldyBtaW5vciBidWdzIHdlcmUgZml4ZWQuCgo5LiAgQSBmZXcgaW1wcm92ZW1lbnRzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBoYW5kbGluZyBvZiBjb21tYW5kIGxpbmUKICAgIG9wdGlvbnMgKGJ1dCBpdCdzIHN0aWxsIG5vdCBmaW5pc2hlZCkuCgoxMC4gIExvdHMgb2YgbWlub3IgYnVnIGZpeGVzIGluIG1vc3Qgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgaGF2ZSBiZWVuCiAgICAgbWFkZS4KCjExLiBGaWxlbmFtZXMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gOC4zIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYSBTV0lHCiAgICBwb3J0IHRvIG5vbi11bml4IHBsYXRmb3JtcyAod29yayBpbiBwcm9ncmVzcykuCgoxMi4gQysrIGZpbGUgc3VmZml4IGlzIG5vdyAuY3h4IChmb3Igc2FtZSByZWFzb24pLgoKMTMuIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZ3JhZGVkIHNpZ25pZmljYW50bHkgYW5kIGlzIG5vdwogICAgYXJvdW5kIDEwMCBwYWdlcy4gICAgSSBhZGRlZCBuZXcgZXhhbXBsZXMgYW5kIGEgc2VjdGlvbiBvbgogICAgQysrLiAgVGhlIGRvY3VtZW50YXRpb24gbm93IGluY2x1ZGVzIGEgVGFibGUgb2YgQ29udGVudHMuCgoxNC4gVGhlIFNXSUcgRXhhbXBsZXMgZGlyZWN0b3J5IGlzIHN0aWxsIHdvZWZ1bGx5IHNwYXJzZSwgYnV0IGlzCiAgICBnZXR0aW5nIGJldHRlci4KClNwZWNpYWwgbm90aWNlIGFib3V0IEMrKwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVGhpcyBpcyB0aGUgZmlyc3QgdmVyc2lvbiBvZiBTV0lHIHRvIHN1cHBvcnQgQysrIHBhcnNpbmcuICBDdXJyZW50bHkKdGhlIEMrKyBpcyBmYXIgZnJvbSBjb21wbGV0ZSwgYnV0IHNlZW1zIHRvIHdvcmsgZm9yIHNpbXBsZSBjYXNlcy4KTm8gd29yayBoYXMgYmVlbiBkb25lIHRvIGFkZCBzcGVjaWFsIEMrKyBwcm9jZXNzaW5nIHRvIGFueSBvZgp0aGUgdGFyZ2V0IGxhbmd1YWdlcy4gICBTZWUgdGhlIHVzZXIgbWFudWFsIGZvciBkZXRhaWxzIGFib3V0IGhvdwpDKysgaXMgaGFuZGxlZC4gICBJZiB5b3UgZmluZCBwcm9ibGVtcyB3aXRoIHRoZSBDKysgaW1wbGVtZW50YXRpb24sCnBsZWFzZSBsZXQgbWUga25vdy4gIEV4cGVjdCBtYWpvciBpbXByb3ZlbWVudHMgaW4gdGhpcyBhcmVhLgoKTm90ZSA6IEkgaGF2ZSBvbmx5IHN1Y2Nlc3NmdWxseSB1c2VkIFNXSUcgYW5kIEMrKyB3aXRoIFRjbCBhbmQKUHl0aG9uLgoKTm90aWNlIGFib3V0IFZlcnNpb24gMS4wRmluYWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClZlcnNpb24gMS4wQjMgaXMgdGhlIGxhc3QgQmV0YSByZWxlYXNlIGJlZm9yZSB2ZXJzaW9uIDEuMCBGaW5hbCBpcwpyZWxlYXNlZC4gIEkgaGF2ZSBmcm96ZW4gdGhlIGxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGluIHZlcnNpb24gMS4wCmFuZCB3aWxsIG9ubHkgZml4IGJ1Z3MgYXMgdGhleSBzaG93IHVwLiAgV29yayBvbiBTV0lHIHZlcnNpb24gMi4wIGlzCmFscmVhZHkgaW4gcHJvZ3Jlc3MsIGJ1dCBpcyBnb2luZyB0byByZXN1bHQgaW4gcmF0aGVyIHNpZ25pZmljYW50CmNoYW5nZXMgdG8gU1dJRydzIGludGVybmFsIHN0cnVjdHVyZSAoaG9wZWZ1bGx5IGZvciB0aGUgYmV0dGVyKS4gIE5vCmFudGljaXBhdGVkIGRhdGUgZm9yIHZlcnNpb24gMi4wIGlzIHNldCwgYnV0IGlmIHlvdSd2ZSBnb3QgYW4gaWRlYSwKbGV0IG1lIGtub3cuCgpWZXJzaW9uIDEuMCBCZXRhIDIgKEFwcmlsIDI2LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyByZWxlYXNlIGlzIGlkZW50aWNhbCB0byBCZXRhMSBleGNlcHQgYSBmZXcgbWlub3IgYnVncyBhcmUKZml4ZWQgYW5kIHRoZSBTV0lHIGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCB0byB3b3JrIHdpdGggVGNsIDcuNS9UayA0LjEuCkEgdGNsNy41IGV4YW1wbGVzIGRpcmVjdG9yeSBpcyBub3cgaW5jbHVkZWQuCgotIEZpeGVkIGEgYnVnIGluIHRoZSBNYWtlZmlsZSB0aGF0IGRpZG4ndCBpbnN0YWxsIHRoZSBsaWJyYXJpZXMKICBjb3JyZWN0bHkuCgotIFNXSUcgTGlicmFyeSBmaWxlcyBhcmUgbm93IHVwZGF0ZWQgdG8gd29yayB3aXRoIFRjbCA3LjUgYW5kIFRrIDQuMS4KCi0gTWlub3IgYnVnIGZpeGVzIGluIG90aGVyIG1vZHVsZXMuCgoKVmVyc2lvbiAxLjAgQmV0YSAxICAoQXByaWwgMTAsIDE5OTYpLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIGlzIHRoZSBmaXJzdCAic2VtaS1vZmZpY2lhbCIgcmVsZWFzZSBvZiBTV0lHLiAgICBJdCBoYXMgYQpudW1iZXIgb2Ygc3Vic3RhbnRpYWwgaW1wcm92ZW1lbnRzIG92ZXIgdGhlIEFscGhhIHJlbGVhc2UuICAgVGhlc2UKbm90ZXMgYXJlIGluIG5vIHBhcnRpY3VsYXIgb3JkZXItLWhvcGUgSSByZW1lbWJlcmVkIGV2ZXJ5dGhpbmcuLi4uCgoxLiAgVGNsL1RrCgpTV0lHIGlzIGtub3duIHRvIHdvcmsgd2l0aCBUY2w3LjMsIFRrMy42IGFuZCBsYXRlciB2ZXJzaW9ucy4KSSd2ZSBhbHNvIHRlc3RlZCBTV0lHIHdpdGggZXhwZWN0LTUuMTkuCgpOb3JtYWxseSBTV0lHIGV4cGVjdHMgdG8gdXNlIHRoZSBoZWFkZXIgZmlsZXMgInRjbC5oIiBhbmQgInRrLmgiLgpOZXdlciB2ZXJzaW9ucyBvZiBUY2wvVGsgdXNlIHZlcnNpb24gbnVtYmVycy4gICBZb3UgY2FuIHNwZWNpZnkgdGhlc2UKaW4gU1dJRyBhcyBmb2xsb3dzIDoKCiAgICAgICAgJSB3cmFwIC1odGNsIHRjbDcuNC5oIC1odGsgdGs0LjAuaCBleGFtcGxlLmkKCk9mIGNvdXJzZSwgSSBwcmVmZXIgdG8gc2ltcGx5IHNldCB1cCBzeW1ib2xpYyBsaW5rcyBiZXR3ZWVuICJ0Y2wuaCIgYW5kCnRoZSBtb3N0IHJlY2VudCBzdGFibGUgdmVyc2lvbiBvbiB0aGUgbWFjaGluZS4KCjIuICBQZXJsNAoKVGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBiYXNlZCBvbiBQZXJsLTQuMDM1LiAgU1dJRydzIGludGVyZmFjZSB0bwpQZXJsNCBpcyBiYXNlZCBvbiB0aGUgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCBpbiB0aGUgIlByb2dyYW1taW5nIFBlcmwiCmJvb2sgYnkgTGFycnkgV2FsbCwgYW5kIGZpbGVzIGxvY2F0ZWQgaW4gdGhlICJ1c3ViIiBkaXJlY3Rvcnkgb2YgdGhlClBlcmw0IGRpc3RyaWJ1dGlvbi4KCkluIG9yZGVyIHRvIGNvbXBpbGUgd2l0aCBQZXJsNCwgeW91J2xsIG5lZWQgdG8gbGluayB3aXRoIHRoZSB1cGVybC5vCmZpbGUgZm91bmQgaW4gdGhlIFBlcmw0IHNvdXJjZSBkaXJlY3RvcnkuICBZb3UgbWF5IHdhbnQgdG8gbW92ZSB0aGlzCmZpbGUgdG8gYSBtb3JlIGNvbnZlbmllbnQgbG9jYXRpb24uCgozLiAgUGVybDUKClRoaXMgaXMgYSBzb21ld2hhdCBleHBlcmltZW50YWwgaW1wbGVtZW50YXRpb24sIGJ1dCBpcyBhbG90IGxlc3MKYnVnZ3kgdGhhbiB0aGUgYWxwaGEgcmVsZWFzZS4gICAgIFNXSUcgb3BlcmF0ZXMgaW5kZXBlbmRlbnRseSBvZgp0aGUgWFMgbGFuZ3VhZ2UgYW5kIHhzdWJwcCBzdXBwbGllZCB3aXRoIFBlcmw1LiAgQ3VycmVudGx5IFNXSUcKcHJvZHVjZXMgdGhlIG5lY2Vzc2FyeSBDIGNvZGUgYW5kIC5wbSBmaWxlIG5lZWRlZCB0byBkeW5hbWljYWxseQpsb2FkIGEgbW9kdWxlIGludG8gUGVybDUuCgpUbyBzdXBwb3J0IFBlcmw1J3Mgbm90aW9uIG9mIG1vZHVsZXMgYW5kIHBhY2thZ2VzIChhcyB3aXRoIHhzdWJwcCksCnlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMgOgoKICAgICAgICAlIHdyYXAgLXBlcmw1IC1tb2R1bGUgTXlNb2R1bGUgLXBhY2thZ2UgTXlQYWNrYWdlIGV4YW1wbGUuaQoKTm90ZSA6IEluIG9yZGVyIGZvciBkeW5hbWljIGxvYWRpbmcgdG8gYmUgZWZmZWN0aXZlLCB5b3UgbmVlZCB0byBiZQpjYXJlZnVsIGFib3V0IG5hbWluZy4gICAgRm9yIGEgbW9kdWxlIG5hbWVkICJNeU1vZHVsZSIsIHlvdSdsbCBuZWVkIHRvCmNyZWF0ZSBhIHNoYXJlZCBvYmplY3QgZmlsZSBjYWxsZWQgIk15TW9kdWxlLnNvIiB1c2luZyBzb21ldGhpbmcgbGlrZQoKICAgICAgICAlIGxkIC1zaGFyZWQgbXlfb2JqLm8gLW8gTXlNb2R1bGUuc28KClRoZSB1c2Ugb2YgdGhlICVpbml0IGRpcmVjdGl2ZSBtdXN0IG1hdGNoIHRoZSBtb2R1bGUgbmFtZSBzaW5jZSBQZXJsNQpjYWxscyBhIGZ1bmN0aW9uICJib290X01vZHVsZU5hbWUiIGluIG9yZGVyIHRvIGluaXRpYWxpemUgdGhpbmdzLgpTZWUgdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSBmb3Igc29tZSBleGFtcGxlcyBvZiBob3cgdG8gZ2V0IHRoaW5ncwp0byB3b3JrLgoKNC4gIFB5dGhvbjEuMwoKVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZSBzdXBwb3J0aW5nIFB5dGhvbi4gICAgVGhlIFB5dGhvbiBwb3J0IGlzCmV4cGVyaW1lbnRhbCBhbmQgbWF5IGJlIHJld3JpdHRlbi4gICBWYXJpYWJsZSBsaW5rYWdlIGlzIGRvbmUgdGhyb3VnaApmdW5jdGlvbnMgd2hpY2ggaXMgc29ydCBvZiBhIGtsdWRnZS4gIEkgYWxzbyB0aGluayBpdCB3b3VsZCBiZSBuaWNlCnRvIGltcG9ydCBTV0lHIHBvaW50ZXJzIGludG8gUHl0aG9uIGFzIGEgbmV3IG9iamVjdCAoaW5zdGVhZCBvZiBzdHJpbmdzKS4KT2YgY291cnNlLCB0aGlzIG5lZWRzIGEgbGl0dGxlIG1vcmUgd29yay4KCjUuICBHdWlsZTMKCklmIHlvdSByZWFsbHkgd2FudCB0byBsaXZlIG9uIHRoZSBlZGdlLCBwaWNrIHVwIGEgY29weSBvZiBHdWlsZS1paWkgYW5kCnBsYXkgYXJvdW5kIHdpdGggdGhpcy4gICAgICBUaGlzIGlzIGhpZ2hseSBleHBlcmltZW50YWwtLS1lc3BlY2lhbGx5IHNpbmNlCkknbSBub3Qgc3VyZSB3aGF0IHRoZSBvZmZpY2lhbCBzdGF0ZSBvZiBHdWlsZSBpcyB0aGVzZSBkYXlzLiAgVGhpcwppbXBsZW1lbnRhdGlvbiBtYXkgY2hhbmdlIGF0IGFueSB0aW1lIHNob3VsZCBJIHN1ZGRlbmx5IGZpZ3VyZSBvdXQgYmV0dGVyCndheXMgdG8gZG8gdGhpbmdzLgoKNi4gIEV4dGVuZGluZyBTV0lHCgpTV0lHIGlzIHdyaXR0ZW4gaW4gQysrIGFsdGhvdWdoIEkgdGVuZCB0byB0aGluayBvZiB0aGUgY29kZSBhcyBtb3N0bHkKYmVpbmcgQU5TSSBDIHdpdGggYSBsaXR0bGUgaW5oZXJpdGFuY2UgdGhyb3duIGluLiAgIEVhY2ggdGFyZ2V0IGxhbmd1YWdlCmlzIGltcGxlbWVudGVkIGFzIGEgQysrIGNsYXNzIHRoYXQgY2FuIGJlIHBsdWdnZWQgaW50byB0aGUgc3lzdGVtLgpJZiB5b3Ugd2FudCB0byBhZGQgeW91ciBvd24gbW9kaWZpY2F0aW9ucywgc2VlIEFwcGVuZGl4IEMgb2YgdGhlIHVzZXIKbWFudWFsLiAgIFRoZW4gdGFrZSBhIGxvb2sgYXQgdGhlICJ1c2VyIiBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgc29tZQpjb2RlIGZvciBidWlsZGluZyB5b3VyIG93biBleHRlbmlvbnMuCgo3LiBUaGUgU1dJRyBsaWJyYXJ5CgpUaGUgU1dJRyBsaWJyYXJ5IGlzIHN0aWxsIGluY29tcGxldGUuICBTb21lIG9mIHRoZSBmaWxlcyBtZW50aW9uZWQgaW4KdGhlIHVzZXIgbWFudWFsIGFyZSB1bmF2YWlsYWJsZS4gICAgVGhlc2UgZmlsZXMgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZQp3aGVuIHRoZXkgYXJlIHJlYWR5LiAgIFN1YnNjcmliZSB0byB0aGUgU1dJRyBtYWlsaW5nIGxpc3QgZm9yIGFubm91bmNlbWVudHMKYW5kIHVwZGF0ZXMuCgo4LiBTV0lHIERvY3VtZW50YXRpb24KCkkgaGF2ZSBzb21ldGltZXMgZXhwZXJpZW5jZWQgcHJvYmxlbXMgdmlld2luZyB0aGUgU1dJRyBkb2N1bWVudGF0aW9uIGluCnNvbWUgcG9zdHNjcmlwdCB2aWV3ZXJzLiAgIEhvd2V2ZXIsIHRoZSBkb2N1bWVudGF0aW9uIHNlZW1zIHRvIHByaW50Cm5vcm1hbGx5LiAgICBJJ20gd29ya2luZyBvbiBtYWtpbmcgbXVjaCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvbmxpbmUsCmJ1dCB0aGlzIHRha2VzIHRpbWUuCgpWZXJzaW9uIDAuMSBBbHBoYSAoRmVicnVhcnkgOSwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiAgUnVuLXRpbWUgdHlwZS1jaGVja2luZyBvZiBTV0lHIHBvaW50ZXJzLiAgIFBvaW50ZXJzIGFyZSBub3cgcmVwcmVzZW50ZWQKICAgIGFzIHN0cmluZ3Mgd2l0aCBib3RoIG51bWVyaWMgYW5kIGVuY29kZWQgdHlwZSBpbmZvcm1hdGlvbi4gICAgVGhpcyBtYWtlcwogICAgaXQgYSBsaXR0bGUgaGFyZGVyIHRvIHNob290IHlvdXJzZWxmIGluIHRoZSBmb290IChhbmQgaXQgZWxpbWluYXRlcwogICAgc29tZSBzZWdtZW50YXRpb24gZmF1bHRzIGFuZCBvdGhlciBvZGRpdGllcykuCgoyLiAgUHl0aG9uIDEuMyBub3cgc3VwcG9ydGVkLgoKMy4gICNkZWZpbmUgYW5kIGVudW0gY2FuIGJlIHVzZWQgdG8gaW5zdGFsbCBjb25zdGFudHMuCgo0LiAgQ29tcGxldGVseSByZXdyb3RlIHRoZSAlaW5jbHVkZSBkaXJlY3RpdmUgYW5kIG1hZGUgaXQgYWxvdCBtb3JlIHBvd2VyZnVsLgoKNS4gIFJlc3RydWN0dXJlZCB0aGUgU1dJRyBsaWJyYXJ5IHRvIG1ha2UgaXQgd29yayBiZXR0ZXIuCgo2LiAgVmFyaW91cyBidWcgZml4ZXMgdG8gVGNsLCBQZXJsNCwgUGVybDUsIGFuZCBHdWlsZSBpbXBsZW1lbnRhdGlvbnMuCgo3LiAgQmV0dGVyIGltcGxlbWVudGF0aW9uIG9mICV0eXBlZGVmIGRpcmVjdGl2ZS4KCjguICBNYWRlIHNvbWUgY2hhbmdlcyB0byBTV0lHJ3MgY2xhc3Mgc3RydWN0dXJlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGV4cGFuZC4KICAgIFNXSUcgaXMgbm93IGJ1aWx0IGludG8gYSBsaWJyYXJ5IGZpbGUgdGhhdCB5b3UgY2FuIHVzZSB0byBtYWtlIHlvdXIKICAgIG93biBleHRlbmlvbnMuCgo5LiAgTWFkZSBleHRlbnNpdmUgY2hhbmdlcyB0byB0aGUgZG9jdW1lbnRhdGlvbi4KCjEwLiBNaW5vciBjaGFuZ2VzIHRvIHRoZSBTV0lHIHBhcnNlciB0byBtYWtlIGl0IHVzZSBsZXNzIG1lbW9yeS4KICAgIEFsc28gdG9vayBvdXQgc29tZSBleHRyYW5lb3VzIHJ1bGVzIHRoYXQgd2VyZSB1bmRvY3VtZW50ZWQgYW5kCiAgICBkaWRuJ3Qgd29yayBpbiB0aGUgZmlyc3QgcGxhY2UuCgoxMS4gVGhlIFNXSUcgbGlicmFyeSBmaWxlcyAidGNsc2giLCAid2lzaCIsICJleHBlY3QiLCBldGMuLi4gaW4gdGhlIGZpcnN0CiAgICByZWxlYXNlIGhhdmUgYmVlbiByZXN0cnVjdHVyZWQgYW5kIHJlbmFtZWQgdG8gInRjbHNoLmkiLCAid2lzaC5pIiwKICAgIGFuZCBzbyBvbi4K