CkB2ZXJiYXRpbQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBAZmlsZSAgICBzdF9yZWFkbWUudHh0CiogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKiBAYnJpZWYgICBUaGlzIGZpbGUgbGlzdHMgdGhlIG1haW4gbW9kaWZpY2F0aW9uIGRvbmUgYnkgU1RNaWNyb2VsZWN0cm9uaWNzIG9uCiogICAgICAgICAgRnJlZVJUT1MgZm9yIGludGVncmF0aW9uIHdpdGggU1RNMzJDdWJlIHNvbHV0aW9uLgoqICAgICAgICAgIEZvciBtb3JlIGRldGFpbHMgb24gRnJlZVJUT1MgaW1wbGVtZW50YXRpb24gb24gU1RNMzJDdWJlLCBwbGVhc2UgcmVmZQoqICAgICAgICAgIHRvIFVNMTcyMiAiRGV2ZWxvcGluZyBBcHBsaWNhdGlvbnMgb24gU1RNMzJDdWJlIHdpdGggRnJlZVJUT1MiCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQ29weXJpZ2h0IChjKSAyMDIyIFNUTWljcm9lbGVjdHJvbmljcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ciogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAoqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwoqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CioKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCiogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgoqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAoqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQoqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAoqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiogU09GVFdBUkUuCiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgQGVuZHZlcmJhdGltCgo9PT09PT09CgojIyMgMTgtQXVndXN0LTIwMjMgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICArIExJQ0VOU0UgdXBkYXRlCiAgICAgIC0gQWRkIGEgTElDRU5TRS5tZCBmaWxlIGF0IHRoZSByb290IG9mIHRoZSBkaXJlY3RvcnkKCiMjIyAxOS1NYXktMjAyMyAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogICsgRnJlZVJUT1M6IFVwZGF0ZSB0byBGcmVlUlRPUyB2MTAuNS4xCgogICsgQWRkIHBvcnRtYWNyb2NvbW1vbiBmaWxlczoKCiAgICAgIC0gR0NDL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyb2NvbW1vbi5oCiAgICAgIC0gR0NDL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydG1hY3JvY29tbW9uLmgKICAgICAgLSBHQ0MvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydG1hY3JvY29tbW9uLmgKICAgICAgLSBHQ0MvQVJNX0NNMzMvbm9uX3NlY3VyZS9wb3J0bWFjcm9jb21tb24uaAogICAgICAtIElBUi9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm9jb21tb24uaAogICAgICAtIElBUi9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnRtYWNyb2NvbW1vbi5oCiAgICAgIC0gSUFSL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyb2NvbW1vbi5oCiAgICAgIC0gSUFSL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydG1hY3JvY29tbW9uLmgKCiAgKyBEZWxldGUgQVJNX0NNN19NUFUgZmlsZXMgOgogICAgICAtIEdDQy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogICAgICAtIEdDQy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCiAgICAgIC0gR0NDL0FSTV9DTTdfTVBVL1JlYWRNZS50eHQKICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0YXNtLnMKICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAogICAgICAtIElBUi9BUk1fQ003X01QVS9SZWFkTWUudHh0CiAgICAgIC0gUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogICAgICAtIFJWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAogICAgICAtIFJWRFMvQVJNX0NNN19NUFUvUmVhZE1lLnR4dAoKICArIENNU0lTX1JUT1NfVjI6IHVwZGF0ZSBhZ2FpbnN0IHRoZSBsYXRlc3QgQ01TSVMtRnJlZVJUT1MgdjEwLjUuMSByZWxlYXNlCiAgICAgIC0gQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYwoKIyMjIDA1LUF1Z3VzdC0yMDIyICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBGcmVlUlRPUzogVXBkYXRlIHRvIEZyZWVSVE9TIHYxMC40LjYKCiAgKyBBZGQgQVJNX0NNN19NUFUgcG9ydCBmaWxlcyBmb3IgYWxsIGNvbXBpbGVyczoKICAgICAgLSBHQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAgICAgLSBHQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAogICAgICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogICAgICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRhc20ucwogICAgICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCiAgICAgIC0gUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogICAgICAtIFJWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAoKICArIENNU0lTX1JUT1NfVjI6IHVwZGF0ZSBhZ2FpbnN0IHRoZSBsYXRlc3QgQ01TSVMtRnJlZVJUT1MgdjEwLjQuNiByZWxlYXNlCiAgICAgIC0gQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYwogICAgICAtIENNU0lTX1JUT1NfVjIvZnJlZXJ0b3Nfb3MyLmgKCiAgKyBDTVNJU19SVE9TX1YyOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBmaWxlcyBhcyBjbXNpc19SVE9TMSBpcyBubyBtb3JlIHN1cHBvcnRlZAooYXBwbGljYXRpb25zIHNob3VsZCB1c2UgY21zaXNfb3MyLmggZmlsZSB1bmRlciBEcml2ZXJzL0NNU0lTL1JUT1MyL0luY2x1ZGUpCiAgICAgIC0gQ01TSVNfUlRPU19WMi9jbXNpc19vcy5oCiAgICAgIC0gQ01TSVNfUlRPU19WMi9jbXNpc19vczIuaAoKICArIENNU0lTX1JUT1MgVjEgOiBSZW1vdmVkIGFzIGl0J3Mgbm8gbW9yZSBzdXBwb3J0ZWQ6CiAgICAgIC0gQ01TSVNfUlRPUy9jbXNpc19vcy5jCiAgICAgIC0gQ01TSVNfUlRPUy9jbXNpc19vcy5oCgojIyMgMzEtQXVndXN0LTIwMjAgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICArIEJ1ZyBmaXggZm9yIEcwIGNvbXBpbGF0aW9uIGVycm9yIGR1ZSB0byBJUlFuX1R5cGUgbWlzbWF0Y2ggYmV0d2VlbiBHMCBhbmQgb3RoZXIgZmFtaWxpZXMKICAgICAgLSBTb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYwogICsgQnVnIGZpeCB3aGVuIHVzaW5nIHN5c3RpY2sgYXMgdGltZWJhc3NlIGZvciBIQUwKICAgICAgLSBTb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYwoKIyMjIDIwLUp1bHktMjAyMCAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogICsgRnJlZVJUT1M6IFVwZGF0ZSB0byBGcmVlUlRPUyB2MTAuMy4xCgogICsgQ01TSVNfUlRPU19WMjogdXBkYXRlIGFnYWluc3QgdGhlIGxhdGVzdCBDTVNJUy1GcmVlUlRPUyB2MTAuMy4wIHJlbGVhc2UKICAgICAgLSBDTVNJU19SVE9TX1YyL2Ntc2lzX29zMi5jCiAgICAgIC0gQ01TSVNfUlRPU19WMi9mcmVlcnRvc19tcG9vbC5oCiAgICAgIC0gQ01TSVNfUlRPU19WMi9mcmVlcnRvc19vczIuaAoKICArIEFkZCBUaWNrbGVzcyBJZGxlIHN1cHBvcnQgZm9yIENNMjMvQ00zMwogICAgICAtIEdDQy9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIEdDQy9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gR0NDL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIEdDQy9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAogICAgICAtIEdDQy9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIEdDQy9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gR0NDL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIEdDQy9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAogICAgICAtIElBUi9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIElBUi9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gSUFSL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIElBUi9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAogICAgICAtIElBUi9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIElBUi9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gSUFSL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIElBUi9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAoKICArICBGaXggTVBVIGhhcmRmYXVsdCBidWcgZm9yIENvcnRleC1NNCBNUFUKICAgICAgLSBHQ0NcQVJNX0NNNF9NUFVccG9ydC5jCiAgICAgIC0gSUFSXEFSTV9DTTRfTVBVXHBvcnQuYwogICAgICAtIFJWRFNcQVJNX0NNNF9NUFVccG9ydC5jCgogICsgIEFkZCBzdXBwb3J0IGZvciAxNiBNUFUgcmVnaW9ucyB0byBDb3J0ZXgtTTQgTVBVIHBvcnRzCiAgICAgIC0gR0NDL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCiAgICAgIC0gSUFSL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCiAgICAgIC0gUlZEUy9BUk1fQ000X01QVS9wb3J0bWFjcm8uaAoKICArIFVwZGF0ZSBBUk1fQ003X01QVSBzb3VyY2UgZmlsZXMgZm9yIGFsbCBjb21waWxlcnMKICAgICAgLSBHQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAgICAgLSBHQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAogICAgICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogICAgICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRhc20ucwogICAgICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCiAgICAgIC0gUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogICAgICAtIFJWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAoKIyMjIDE3LUphbnVhcnktMjAyMCAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogICsgRml4IGNvbXBpbGUgZXJyb3IgaW4gdGhlIEdDQyBDTTdfTVBVIHBvcnQgY2F1c2VkIGJ5IGEgZHVwbGljYXRlZCB2YXJpYWJsZSBkZWNsYXJhdGlvbgogICAgICAtIFNvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKCiMjIyAxMy1EZWNlbWJlci0yMDE5ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBSZW1vdmUgd2FybmluZ3MgdGhyb3duIGJ5IEVXQVJNIGZvciBDTTMzL0NNMjMgcG9ydHMKICAgICAgLSBJQVIvQVJNX0NNMjMvbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAogICAgICAtIElBUi9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAogICAgICAtIElBUi9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gSUFSL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyby5oCgojIyMgMTktSnVseS0yMDE5ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBGaXggcnVudGltZSBlcnJvciBpbiB0aGUgIElBUi9DTTRfTVBVIHBvcnQKICAgICAgIC0gSUFSL0FSTV9DTTRfTVBVL3BvcnQuYwoKIyMjIDEyLUp1bHktMjAxOSAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogICsgRnJlZVJUT1M6IFVwZGF0ZSBhZ2FpbnN0IHRoZSBGcmVlUlRPUyB2MTAuMi4xIHJlbGVhc2UKICAgIC0gc3VwcG9ydCBmb3IgdGhlIENNMzMgYW5kIENNMjMgY29yZXMKCiAgKyBDTVNJU19SVE9TX1YyOiB1cGRhdGUgYWdhaW5zdCB0aGUgbGF0ZXN0IENNU0lTLUZyZWVSVE9TIHYxMC4yLjAgcmVsZWFzZQoKICArIEFkZCBNUFUgc3VwcG9ydCBmb3IgdGhlIENNNy9yMHAxOgogICAgICAgLSBHQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAgICAgIC0gR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKICAgICAgIC0gSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCiAgICAgICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRhc20ucwogICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAogICAgICAgLSBSVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCiAgICAgICAtIFJWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAoKICArIGNtc2lzX29zLmM6IEZpeCBjb21waWxlIGVycm9ycyBieSB1c2luZyB0aGUgY29ycmVjdCBUaW1lckNhbGxiYWNrRnVuY3Rpb25fdCB0eXBlIGZvciB0aW1lciBjcmVhdGlvbgoKIyMjIDI5LU1hcnMtMjAxOSAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogICsgY21zaXNfb3MuYyA6IEZpeCBidWcgaW4gb3NQb29sQWxsb2MoKTogbWVtb3J5IGJsb2NrcyBjYW4ndCBiZSByZXVzZWQgYWZ0ZXIgYmVpbmcgZnJlZSdkCiAgKyBTb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vcywgU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MxLmMsIFNvdXJjZS9DTVNJU19SVE9TX1YyL2Ntc2lzX29zMi5jLCBTb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczIuaDogcmVzdG9yZSBvcmlnaW5hbCBBcGFjaGUgbGljZW5zZSB0ZXJtcwogICsgc3RfcmVhZG1lLnR4dDogdXBkYXRlIGxpY2Vuc2UgdGVybXMgdG8gQlNELTMtQ2xhdXNlCgoKIyMjIDEzLUF1Z3VzdC0yMDE4ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBBZGQgZW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtaXNzaW5nIGZ1bmN0aW9uIG9zVGhyZWFkR2V0U3RhY2tTaXplKCkKICAgIHRvIGF2b2lkIGxpbmsgZXJyb3JzIHdoZW4gdXNpbmcgQ01TSVMtUlRPUyBWMi4KCiAgKyBVcGRhdGUgdGhlIEZyZWVSVE9TQ29uZmlnX3RlbXBsYXRlLmggd2l0aCBzcGVjaWZpYyBkZWZpbmVzIGZvciB0aGUKICAgIENNU0lTLVJUT1MgVjIuCgogICsgUmVuYW1lIHRoZSAiUlRFX1JUT1NfRnJlZVJUT1NfWFhYWCIgbWFjcm9zIHRvICJVU0VfRnJlZVJUT1NfWFhYWCIgaW4KICAgIGNtc2lzX29zMi5jLgoKIyMjIDMwLUp1bHktMjAxOCAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogKyBVcGRhdGUgTGljZW5zZS50eHQgZmlsZSB0byBNSVQgbGljZW5zZSBpbnN0ZWFkIG9mIEdQTHYyCgojIyMgMjMtSnVseS0yMDE4ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiArIEZpeCBjb21waWxlciB3YXJuaW5ncyB0aHJvd24gYnkgSUFSIGNvbXBpbGVyIDguMjAKCiArIEFkZCBNUFUgc3VwcG9ydCBmb3IgdGhlIENNNy9yMHAxOgogIC0gR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCiAgLSBHQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAogIC0gSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCiAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0YXNtLnMKICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCiAgLSBSVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCiAgLSBSVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKCiMjIyAwOS1BcHJpbC0yMDE4ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgVXBkYXRlIHRoZSBGcmVlUlRPUyBhZ2FpbnN0IHRoZSBsYXRlc3QgcmVsZWFzZSAxMC4wLjEKICBtb3JlIGRldGFpbHMgYXJlIGF2YWlsYWJsZSBpbjogaHR0cHM6Ly93d3cuZnJlZXJ0b3Mub3JnL0hpc3RvcnkudHh0CgogICsgSW50ZWdyYXRlIHN1cHBvcnQgZm9yIHRpY2tsZXNzIG1vZGUgZm9yIEFSTV9DTTAgY29yZToKICAgIC0gR0NDL0FSTV9DTTAvcG9ydC5jCiAgICAtIEdDQy9BUk1fQ00wL3BvcnRtYWNyby5oCiAgICAtIElBUi9BUk1fQ00wL3BvcnQuYwogICAgLSBJQVIvQVJNX0NNMC9wb3J0bWFjcm8uaAogICAgLSBSVkRTL0FSTV9DTTAvcG9ydC5jCgogSW50ZWdyYXRlIENNU0lTLVJUT1N2MiB3cmFwcGVyIGJhc2VkIG9uOiBodHRwczovL2dpdGh1Yi5jb20vQVJNLXNvZnR3YXJlL0NNU0lTLUZyZWVSVE9TL3JlbGVhc2VzL3RhZy8xMC4wLjEKICArIEFkZCBuZXcgZmlsZXM6CiAgICAtIENNU0lTX1JUT1NfVjIvY21zaXNfb3MuaAogICAgLSBDTVNJU19SVE9TX1YyL2Ntc2lzX29zMS5jCiAgICAtIENNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmMKICAgIC0gQ01TSVNfUlRPU19WMi9jbXNpc19vczIuaAogICAgICAiY21zaXNfb3MxLmMiIGFuZCAiY21zaXNfb3MxLmgiIGNvbnRhaW5zIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YKICAgICAgIENNU0lTLVJUT1N2MSxpLmUgYXMgcmVsZWFzZWQgYnkgQVJNLCB1c2luZyB0aGUgQ01TSVMtUlRPU1YyIEFQSS4KCiAgKyBUaGUgU1QgY3VzdG9taXplZCBDTVNJUy1SVE9TdjEgaXMgbWFpbnRhaW5lZCB1bmRlcjoKICAgIC0gQ01TSVNfUlRPUy9jbXNpc19vcy5jCiAgICAtIENNU0lTX1JUT1MvY21zaXNfb3MuaAoKICArIFdoZW4gdXNpbmcgQ01TSVMtUlRPU3YyIEFQSXMsIHRoZSBmb2xsb3dpbmcgRnJlZVJUT1MgZGVmaW5lcyBhcmUgcmVxdWlyZWQ6CiAgICAtICNkZWZpbmUgY29uZmlnTUFYX1BSSU9SSVRJRVMgICAgICAgICAgICAgICAgICAgICA1NgogICAgLSAjZGVmaW5lIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gICAgICAgICAgMAogICAgLSAjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAgMAoKCiMjIyAxMC1BdWd1c3QtMjAxNyAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogIFVwZGF0ZSBGcmVlUlRPUyB0byBzdXBwb3J0IE1QVSBmZWF0dXJlIHdpdGggSUFSIGNvbXBpbGVyLgoKICArIEFkZCB0aGUgZm9sbG93aW5nIHBvcnRzOgogICAgLSBJQVIvQVJNX0NNNF9NUFUKICAgIC0gSUFSL0FSTV9DTTdfTVBVCiAgICAtIFJWRFMvQVJNX0NNN19NUFUKCgojIyMgMDMtTWFyY2gtMjAxNyAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogIFVwZGF0ZSBDTVNJUy1SVE9TIGRyaXZlcnMgdG8gc3VwcG9ydCBib3RoIENNU0lTIENvcmUgVjQueCBhbmQgVjUueAoKICBCdWcgZml4ZXM6CiAgKyBDTVNJUy1SVE9TOiBXcm9uZyByZXR1cm4gdmFsdWUgZm9yIG9zU2lnbmFsV2FpdCgpCiAgKyBDTVNJUy1SVE9TOiBOb3QgYWxsIHF1ZXVlIHNpemUgaXMgMCBpbml0aWFsaXplZCB3aXRoIG9zTWFpbENBbGxvYygpCgogIExpbWl0YXRpb246CiAgKyBDTVNJUy1SVE9TOiBvc1NpZ25hbFdBaXQoKSBmdW5jdGlvbiBpcyBub3QgZnVsbHkgY29tcGxpYW50IHdpdGggdGhlIHNwZWNpZmljYXRpb24KCgojIyMgMzAtU2VwdGVtYmVyLTIwMTYgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICBUaGUgcHVycG9zZSBvZiB0aGlzIHJlbGVhc2UgaXMgdG8gVXBncmFkZSB0byB1c2UgRnJlZVJUT1MgVjkuMC4wLCB0aGlzIHZlcnNpb24KICBpcyBhIGRyb3AtaW4gY29tcGF0aWJsZSByZXBsYWNlbWVudCBmb3IgRnJlZVJUT1MgVjguMi4zLgogIEZvciBtb3JlIGRldGFpbHMgcGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL0hpc3RvcnkudHh0CgogICsgQWRkIHN1cHBvcnQgdG8gdGlja2xlc3MgbW9kZSBmb3IgTVBVIHBvcnRzOgogICAgLSBHQ0MvQVJNX0NNM19NUFUvcG9ydC5jCiAgICAtIEdDQy9BUk1fQ000X01QVS9wb3J0LmMKICAgIC0gUlZEUy9BUk1fQ000X01QVS9wb3J0LmMKCiAgKyBVcGRhdGUgQ00wIHBvcnRzLCBhZGQgcG9zc2liaWxpdHkgdG8gdXNlIGEgdGltZWJhc2UgZGlmZmVyZW50IHRoYW4gU3lzdGljazoKICAgIC0gSUFSL0FSTV9DTTAvcG9ydC5jCiAgICAtIFJWRFMvQVJNX0NNMC9wb3J0LmMKICAgIC0gR0NDL0FSTV9DTTAvcG9ydC5jCgogICsgRml4IGNvbXBpbGF0aW9uIGVycm9yIGluIENNM19NUFUgYW5kIENNNF9NUFUgcG9ydHM6CiAgICAtIEdDQy9BUk1fQ00zX01QVS9wb3J0bWFjcm8uaAogICAgLSBHQ0MvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKICAgIC0gUlZEUy9BUk1fQ000X01QVS9wb3J0bWFjcm8uaAogICAgLSBBZGQgIlNvdXJjZVxwb3J0YWJsZVxDb21tb25cIiBkaXJlY3RvcnkKCiAgKyBjbXNpc19vcy5jCiAgICAtIEFkZCBzdXBwb3J0IG9mIFN0YXRpY2FsbHkgQWxsb2NhdGVkIFN5c3RlbXMgaW50cm9kdWNlZCB3aXRoIEZyZWVSVE9TIFY5LjAuMAogICAgLSBBZGQgbmV3IHdyYXBwZXJzIENNU0lTLVJUT1MgQVBJcwoKICAgICAgICAgRnJlZVJUT1MgQVBJcyAgICAgICB8ICAgICBDTVNJUy1SVE9TIEFQSXMgICAgICAgIHwgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIHV4UXVldWVNZXNzYWdlc1dhaXRpbmcoKSB8ICBvc01lc3NhZ2VXYWl0aW5nKCkgICAgICAgIHwgIFJldHVybiB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHN0b3JlZCBpbiBhIHF1ZXVlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgeFRhc2tBYm9ydERlbGF5KCkgICAgICAgIHwgIG9zQWJvcnREZWxheSgpICAgICAgICAgICAgfCAgRm9yY2UgYSB0aHJlYWQgdG8gZ2V0IG91dCB0aGUgYmxvY2tlZCBzdGF0ZSBpbW1lZGlhdGVseQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHV4U2VtYXBob3JlR2V0Q291bnQoKSAgICB8ICBvc1NlbWFwaG9yZUdldENvdW50KCkgICAgIHwgIFJldHVybiB0aGUgY3VycmVudCBjb3VudCBvZiBhIHNlbWFwaG9yZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHV4UXVldWVTcGFjZXNBdmFpbGFibGUoKSB8ICBvc01lc3NhZ2VBdmFpbGFibGVTcGFjZSgpIHwgIFJldHVybiB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIGEgbWVzc2FnZSBxdWV1ZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZRdWV1ZURlbGV0ZSgpICAgICAgICAgICB8ICBvc01lc3NhZ2VEZWxldGUoKSAgICAgICAgIHwgIERlbGV0ZSBhIG1lc3NhZ2UgUXVldWUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKIyMjIDIyLUphbnVhcnktMjAxNiAjIyMKPT09PT09PT09PT09PT09PT09PT09PT0KICBUaGUgcHVycG9zZSBvZiB0aGlzIHJlbGVhc2UgaXMgdG8gVXBncmFkZSB0byB1c2UgRnJlZVJUT1MgVjguMi4zLgogIEl0IGFsc28gcHJvdmlkZXMgZml4ZXMgZm9yIG1pbm9yIGlzc3Vlcy4KCiAgKyBjbXNpc19vcy5jCiAgICAtIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyAib3NTaWduYWxTZXQiIGFuZCAib3NTaWduYWxXYWl0IiBhcmUgbm93IGRlbGltaXRlZCBieQogICAgICAgICAjZGVmaW5lIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMuCiAgICAtIEZ1bmN0aW9uICJvc1RpbWVyU3RhcnQiIDogZml4IGZvciBhbiBhc3NlcnQgaXNzdWUgd2hlbiBjYWxsZWQgZnJvbSBhbiBJU1IuCiAgICAtIEZ1bmN0aW9uICJvc01haWxDcmVhdGUiICA6IGludGVybmFsIHZhcmlhYmxlcyBpbml0aWFsaXphdGlvbi4KICAgIC0gRnVuY3Rpb24gIm9zU2lnbmFsV2FpdCIgOiBzaWduYWxzIHZhbHVlIGlzIG5vdyBjb21wYXJlZCB2ZXJzdXMgaW50ZWdlciB6ZXJvIGZvciBlcnJvciBjaGVja2luZy4KCiAgKyBmcmVlUlRPUyBzb3VyY2VzCiAgICAtIEZyZWVSVE9TLmggZmlsZSA6IEFkZCBjb25maWd1cmF0aW9uIHNhbml0eSBjaGVjayBpbiBjYXNlIG9mIGNvbmZpZ1VTRV9SRUNVUlNJVkVfTVVURVhFUyAgc2V0CiAgICAgIGFuZCBjb25maWdVU0VfTVVURVhFUyAgbm90IHNldC4KCiAgKyBTVE1pY3JvZWxlY3Ryb25pY3MgbGljZW5zZSBzaW1wbGlmaWNhdGlvbnMsIHNlZSBsaWNlbnNlIGRpc2NsYWltZXIgd2l0aGluIHRoaXMgZmlsZSdzIGhlYWRlcgoKCiMjIyAyNy1NYXJjaC0yMDE1ICMjIwo9PT09PT09PT09PT09PT09PT09PT0KICBUaGUgcHVycG9zZSBvZiB0aGlzIHJlbGVhc2UgaXMgdG8gVXBncmFkZSB0byB1c2UgRnJlZVJUT1MgVjguMi4xLgoKICArIE1ham9yIGNoYW5nZSBvZiB0aGUgdmVyc2lvbiA4LjIuMSBpcyB0aGUgc3VwcG9ydCBvZiBDTTcgY29yZS4KICBGb3IgU1RNMzJGNzQ2eHgvU1RNMzJGNzU2eHggZGV2aWNlcywgbmVlZCB0byB1c2UgcG9ydCBmaWxlcyB1bmRlciBTb3VyY2UvUG9ydGFibGUvWFhYL0FSTV9DTTcvcjBwMSwKICB3aGVyZSBYWFggcmVmZXJzIHRvIHRoZSBjb21waWxlciB1c2VkLgoKICArIEl0IGFsc28gcHJvdmlkZXMgaW1wbGVtZW50YXRpb24gb2Ygb3NTaWduYWwgbWFuYWdlbWVudCBBUElzLCBvc1NpZ25hbFNldCgpIGFuZCBvc1NpZ25hbFdhaXQoKSwKICBmaXhlcyBvc01hc3NhZ2UgcXVldWUgc2l6ZSwgb3NNYWlsUURlZiBtYWNybyBhbmQgb3NEZWxheVVudGlsIHBhcmFtZXRlcnMuCgogICsgSW4gdGhpcyByZWxlYXNlIGFuIGFsaWdubWVudCBoYXMgYmVlbiBkb25lIGluIEFSTV9DTTQgYW5kIEFSTV9DTTMgcG9ydC5jIHZlcnN1cyBBUk1fQ00wIHBvcnQuYwogIHJlZ2FyZGluZyB0aGUgdXNlIG9mIG1hY3JvcyBjb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORyBhbmQgY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HLCB0aGVzZSB0b3cgbWFjcm9zCiAgYXJlIG5vdyB0YWtpbmcgYXMgcGFyYW1ldGVyIGFzIHBvaW50ZXIgdG8gVGlja1R5cGVfdC4KCiAgKyBjbXNpc19vcy5jCiAgICAtIEFkZCBpbXBsZW1lbnRhdGlvbiBvZiBvc1NpZ25hbFNldCgpIGFuZCBvc1NpZ25hbFdhaXQoKSBBUElzCiAgICAtIEZpeCBtYXNzYWdlIHF1ZXVlIHNpemUgaW4gb3NNZXNzYWdlQ3JlYXRlIEFQSQogICAgLSBvc0RlbGF5VW50aWw6IHBhcmFtZXRlciBQcmV2aW91c1dha2VUaW1lIGlzIG5vdyBwYXNzZWQgYXMgYSBwb2ludGVyLgogICAgLSBFbmFibGluZyBNYWlsIHF1ZXVlIG1hbmFnZW1lbnQgQVBJcyAodGVtcG9yYXJ5IHJlbW92ZWQgaW4gcHJldmlvdXMgdmVyc2lvbikuCiAgICAtIEZ1bmN0aW9uICJvc1RocmVhZEdldFByaW9yaXR5IiB1c2VzIG5vdyB1eFRhc2tQcmlvcml0eUdldEZyb21JU1IgaWYgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IGhhbmRsZXIsIGlmIG5vdCB1c2UgdXhUYXNrUHJpb3JpdHlHZXQuCgogICsgY21zaXNfb3MuaAogICAgLSBvc0ZlYXR1cmVfV2FpdCBpcyBkZWZpbmVkIHRvIDAgdG8gaW5kaWNhdGUgdGhhdCBvc1dhaXQgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZSAoYXMgc3BlY2lmaWVkIGJ5IGNtc2lzX29zIHRlbXBsYXRlIGJ5IEFSTSkKICAgIC0gRml4IGNvbXBpbGF0aW9uIGlzc3VlIHdpdGggb3NNYWlsUURlZiBtYWNyby4KICAgIC0gRW5hYmxpbmcgTWFpbCBxdWV1ZSBtYW5hZ2VtZW50IEFQSXMgKHRlbXBvcmFyeSByZW1vdmVkIGluIHByZXZpb3VzIHZlcnNpb24pCgogICsgZnJlZVJUT1Mgc291cmNlcwogICAgLSBBUk1fQ00zIHBvcnQuYyBhbmQgQVJNX0NNNCBwb3J0LmM6CiAgICAgIGZ1bmN0aW9uIHZQb3J0U3VwcHJlc3NUaWNrc0FuZFNsZWVwIDogY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcgYW5kIGNvbmZpZ1BPU1RfU0xFRVBfUFJPQ0VTU0lORyBhcmUgbm93IHRha2luZwogICAgICBhcyBwYXJhbWV0ZXIgYXMgcG9pbnRlciB0byBUaWNrVHlwZV90LgogICAgICBUaGUgcHVycG9zZSBvZiB0aGlzIGNoYW5nZSBpcyB0byBhbGlnbiB0aGUgQ00zIGFuZCBDTTQgaW1wbGVtZW50YXRpb24gd2l0aCBDTTAgb25lLgoKICArIE5vdGUKICAgIC0gb3NTaWduYWxTZXQgcmV0dXJucyBhbiBpbnQzMl90IHZhbHVlIHdoaWNoIGlzIGEgYSBzdGF0dXMgKG9zT0sgb3Igb3NFcnJvcikKICAgICAgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgc2lnbmFsIHZhbHVlIGFzIHNwZWNpZmllZCBpbiBjbXNpc19vcyB0ZW1wbGF0ZSBieSBBUk0uCiAgICAgIFRoaXMgaXMgbWFpbmx5IGR1ZSB0byBmcmVlUlRPUyBpbXBsZW1lbnRhdGlvbiwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGFsaWduZWQgKHdpdGggdGhlIGNtc2lzIG9zIHRlbXBsYXRlIGJ5IEFSTSkgYXMgc29vbiBhcyB0aGUgZnJlZVJUT1MgbmV4dCB2ZXJzaW9uIHdpbGwgYWxsb3cgaXQuCgogICAgLSBvc1RocmVhZERlZigpIG1hY3JvIGlzIGRlZmluZWQgaW4gdGhlIGZyZWVSVE9TIGNtc2lzX29zLmggd3JhcHBlciBhcyBmb2xsb3cgOgogICAgICAgIG9zVGhyZWFkRGVmKG5hbWUsIHRocmVhZCwgcHJpb3JpdHksIGluc3RhbmNlcywgc3RhY2tzeikKICAgICAgdGhlIG1hY3JvIG9zVGhyZWFkRGVmKCkgYXMgZGVmaW5lZCBpbiBBUk0gY21zaXNfb3MuaCBpcyBkZWZpbmVkIHdpdGggNCBwYXJhbWV0ZXJzIDoKICAgICAgbmFtZSA6IG5hbWUgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KICAgICAgcHJpb3JpdHkgOiBpbml0aWFsIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24uCiAgICAgIGluc3RhbmNlcyA6IG51bWJlciBvZiBwb3NzaWJsZSB0aHJlYWQgaW5zdGFuY2VzLgogICAgICBzdGFja3N6IDogc3RhY2sgc2l6ZSAoaW4gYnl0ZXMpIHJlcXVpcmVtZW50cyBmb3IgdGhlIHRocmVhZCBmdW5jdGlvbi4KCiAgICAtIG9zVGhyZWFkRGVmIGFzIGRlZmluZWQgaW4gdGhlIEFSTSB0ZW1wbGF0ZSBmaWxlIGNtc2lzX29zLmggYXNzdW1lcyB0aGF0IHRoZSB0aHJlYWQgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgdGhyZWFkIGZ1bmN0aW9uIG5hbWUuCiAgICAgIHdoZXJlIHRoZSBmcmVlUlRPUyBpbXBsZW1lbnRhdGlvbiBnaXZlcyBzZXBhcmF0ZSBwYXJhbWV0ZXJzIGZvciB0aGUgdGhyZWFkIG5hbWUgYW5kIHRoZSB0aHJlYWQgZnVuY3Rpb24gbmFtZS4KCiAgICAgIGNhcmUgbXVzdCBiZSB0YWtlbiB3aGVuIHBvcnRpbmcgYW4gYXBwbGljYXRpb24gZnJvbS90byBhbm90aGVyIE9TIHRvL2Zyb20gZnJlZVJUT1MgY21zaXNfb3MgcmVnYXJkaW5nIHRoaXMgbWFjcm8uCgogICAgICAgIHRoZSBtYWNybyBvc1RocmVhZERlZigpIGFzIGRlZmluZWQgaW4gQVJNIGNtc2lzX29zLmggdGVtcGxhdGUgaXMgZGVmaW5lZCB3aXRoIDQgcGFyYW1ldGVycyA6CiAgICAgICAgICAgbmFtZSA6IG5hbWUgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KICAgICAgICAgICBwcmlvcml0eSA6IGluaXRpYWwgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KICAgICAgICAgICBpbnN0YW5jZXMgOiBudW1iZXIgb2YgcG9zc2libGUgdGhyZWFkIGluc3RhbmNlcy4KICAgICAgICAgICBzdGFja3N6IDogc3RhY2sgc2l6ZSAoaW4gYnl0ZXMpIHJlcXVpcmVtZW50cyBmb3IgdGhlIHRocmVhZCBmdW5jdGlvbi4KCiAgICAgICAgdGhlIG1hY3JvIG9zVGhyZWFkRGVmKCkgYXMgZGVmaW5lZCBpbiBmcmVlUlRPUyBjbXNpc19vcy5oIGlzIGRlZmluZWQgd2l0aCA1IHBhcmFtZXRlcnMgOgogICAgICAgICAgIG5hbWUgOiBuYW1lIG9mIHRoZSB0aHJlYWQgKHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgdHJhY2UpLgogICAgICAgICAgIHRocmVhZCA6IG5hbWUgb2YgdGhlIHRocmVhZCBmdW5jdGlvbgogICAgICAgICAgIHByaW9yaXR5IDogaW5pdGlhbCBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uLgogICAgICAgICAgIGluc3RhbmNlcyA6IG51bWJlciBvZiBwb3NzaWJsZSB0aHJlYWQgaW5zdGFuY2VzLgogICAgICAgICAgIHN0YWNrc3ogOiBzdGFjayBzaXplIChpbiBieXRlcykgcmVxdWlyZW1lbnRzIGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uLgoKCiMjIyAyNS1EZWNlbWJlci0yMDE0ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT0KICBUaGUgcHVycG9zZSBvZiB0aGlzIHJlbGVhc2UgaXMgdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIGVycm9ycyBhbmQgd2FybmluZy4gSXQgYWxzbyByZWludHJvZHVjZXMKICB0aGUgZnVuY3Rpb24gb3NUaHJlYWRJc1N1c3BlbmRlZCgpIHdoaWNoIGhhcyBiZWVuIHJlbW92ZWQgaW4gdGhlIHZlcnNpb24gVjEuMi4wLgoKICArIGNtc2lzX29zLmMKICAgICAgLSBvc1RocmVhZEdldFByaW9yaXR5KCkgYW5kIG1ha2VDbXNpc1ByaW9yaXR5KCk6IHJlcGxhY2UgSU5DTFVERV92VGFza1ByaW9yaXR5R2V0IGJ5IHRoZSBjb3JyZWN0CiAgICAgICAgIGZyZWVSVE9TIGNvbnN0YW50IHV4VGFza1ByaW9yaXR5R2V0LgogICAgICAgICBUaGUgdmVyc2lvbiAxLjIuMiBpcyB1c2luZyBhIHdyb25nIGNvbnN0YW50IElOQ0xVREVfdlRhc2tQcmlvcml0eUdldCwgd2hpbGUgdGhlIGNvcnJlY3QgZnJlZVJUT1MKICAgICAgICAgY29uc3RhbnQgaXMgdXhUYXNrUHJpb3JpdHlHZXQuCiAgICAgICAgIFRoaXMgZml4IGVuc3VyZSBhIHNhZmUgdXNlIG9mIG9zVGhyZWFkR2V0UHJpb3JpdHkoKSBmdW5jdGlvbi4KCiAgICAgIC0gb3NUaHJlYWRJc1N1c3BlbmRlZCgpOiB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgaW4gdmVyc2lvbiBWMS4yLjAsIGl0IGlzIG5vdyBhdmFpbGFibGUgZ2Fpbi4KICAgICAgICAgVXNlciBjYW4gZWl0aGVyIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgVGhyZWFkIGlzIHN1c3BlbmRlZCBlaXRoZXIgdXNlIGZ1bmN0aW9uIG9zVGhyZWFkR2V0U3RhdGUsCiAgICAgICAgIHdoaWNoIGlzIG1vcmUgZ2VuZXJpYywgdG8gY2hlY2sgdGhlIGV4YWN0IHN0YXRlIG9mIGEgdGhyZWFkLgoKICAgICAgLSBvc1RocmVhZExpc3QoKTogdGhpcyBmdW5jdGlvbiBpcyBub3cgdGFraW5nIGFzIGFyZ3VtZW50IGEgcG9pbnRlciB0byB1aW50OF90IGluc3RlYWQgb2YgYSBwb2ludGVyIHRvIGludDhfdC4KICAgICAgICAgVGhlIGNoYW5nZSBpcyBtYWRlIHRvIHJlbW92ZSBhIGNvbXBpbGF0aW9uIHdhcm5pbmcuCgogICAgICAtIG9zUmVjdXJzaXZlTXV0ZXhDcmVhdGUoKTogdGhlIHByb3RvdHlwZSBoYXMgYmVlbiBjaGFuZ2VkIHRvIG9zTXV0ZXhJZCBvc1JlY3Vyc2l2ZU11dGV4Q3JlYXRlIChjb25zdCBvc011dGV4RGVmX3QgKm11dGV4X2RlZikKICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIG1hZGUgdG8gbWFrZSBvc1JlY3Vyc2l2ZU11dGV4Q3JlYXRlKCkgY29tcGF0aWJsZSB3aXRoIGZ1bmN0aW9uIE11dGV4Q3JlYXRlKCkuCiAgICAgICAgICBJdCBhbHNvIGFsbG93IHRoZSBiZXR0ZXIgdXNlIG9mIHRoZSBmdW5jdGlvbiBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBtYWNybyBvc011dGV4LCBub3RlIHRoYXQgb3NNdXRleCByZXR1cm4gYQogICAgICAgICAgImNvbnN0IG9zTXV0ZXhEZWZfdCAqbXV0ZXhfZGVmIi4KICAgICAgICAgIGV4YW1wbGUgOiBvc011dGV4MUlkID0gb3NSZWN1cnNpdmVNdXRleENyZWF0ZSAob3NNdXRleChNdXRleDEpKTsKCiAgICAgIC0gRml4IGltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBvc1NlbWFwaG9yZVdhaXQoKSwgb3NNdXRleFJlbGVhc2UoKSBhbmQgb3NNdXRleFdhaXQoKSBieSB1c2luZyB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgZnJlZVJUT1Mgk0Zyb21JU1KUIEFQSXMgd2hlbiBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQuCgogICAgICAtIEZpeCBjb21waWxhdGlvbiB3YXJuaW5nIHdoZW4gdGhlIGNvbnN0YW50IElOQ0xVREVfZVRhc2tHZXRTdGF0ZSBpcyBub3QgZGVmaW5lZAoKICArIGNtc2lzX29zLmgKICAgICAgLSBvc1RocmVhZElzU3VzcGVuZGVkKCk6IGFkZCBmdW5jdGlvbiBwcm90b3R5cGUuCiAgICAgIC0gb3NUaHJlYWRMaXN0KCk6IGZ1bmN0aW9uIHByb3RvdHlwZSBtb2RpZmllZCBhcyBkZXNjcmliZWQgaW4gY21zaXNfb3MuYyBzZWN0aW9uLgogICAgICAtIG9zUmVjdXJzaXZlTXV0ZXhDcmVhdGUoKTogZnVuY3Rpb24gbW9kaWZpZWQgYXMgZGVzY3JpYmVkIGluIGNtc2lzX29zLmMgc2VjdGlvbi4KCiAgKyBJbXBvcnRhbnQgbm90ZToKICAgIE1haWwgUXVldWUgTWFuYWdlbWVudCBGdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBjbXNpc19vcyB2ZXJzaW9uLCB3aWxsIGJlIGFkZGVkIGluIHRoZSBuZXh0IHJlbGVhc2UuCgoKIyMjIDA0LURlY2VtYmVyLTIwMTQgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PQogICsgY21zaXNfb3MuYywgb3NTZW1hcGhvcmVDcmVhdGUoKTogdXNlIHZTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKSBpbnN0ZWFkIG9mIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKSwKICAgIHRvIGtlZXAgY29tcGF0aWJpbGl0eSB3aXRoIGFwcGxpY2F0aW9uIGNvZGUgZGV2ZWxvcGVkIG9uIEZyZWVSVE9TIFY3LjYuMC4KCgojIyMgMDctTm92ZW1iZXItMjAxNCAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBjbXNpc19vcy5oOiBtb2RpZnkgdGhlIG9zVGhyZWFkU3RhdGUgZW51bSB0byBmaXggd2FybmluZyBnZW5lcmF0ZWQgYnkgQVJNQ0MgY29tcGlsZXIKICArIHRhc2suYzogYWRkIHByZXByb2Nlc3NvciBjb21waWxhdGlvbiBjb25kaXRpb24gZm9yIHBydlRhc2tJc1Rhc2tTdXNwZW5kZWQoKSBmdW5jdGlvbgogICAgICAgICAgICAoaXQncyBidWlsZCBvbmx5IHdoZW4gSU5DTFVERV92VGFza1N1c3BlbmQgb3B0aW9uIGlzIGVuYWJsZWQgaW4gRnJlZVJUT1NDb25maWcuaCBmaWxlKQoKCiMjIyAwNC1Ob3ZlbWJlci0yMDE0ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT0KICArIFVwZ3JhZGUgdG8gdXNlIEZyZWVSVE9TIFY4LjEuMiBhbmQgQ01TSVMtUlRPUyBWMS4wMi4KICArIGNtc2lzX29zLmMKICAgICAgLSBBbG1vc3Qgb2YgQ01TSVMtUlRPUyBBUElzIGFyZSBpbXBsZW1lbnRlZCBmb3IgRnJlZVJUT1MKICAgICAgLSBBZGRpdGlvbmFsIHdyYXBwZXIgQVBJcyBjcmVhdGVkIGZvciBGcmVlUlRPUwoKICArIEltcG9ydGFudCBub3RlOgogICAgV2hlbiB1cGdyYWRpbmcgZXhpc3RpbmcgYXBwbGljYXRpb24gY29kZSB0byB1c2UgdGhpcyBsYXN0IHZlcnNpb24sIHRoZSBmb2xsb3dpbmcKICAgIHVwZGF0ZSBzaG91bGQgYmUgY29uc2lkZXJlZDoKICAgICAgLSBvc1RocmVhZElzU3VzcGVuZGVkKCkgaXMgbm8gbG9uZ2VyIHB1YmxpYyBBUEkgaW4gRnJlZVJUT1MgYW5kIGl0IHNob3VsZAogICAgICAgIGJlIHJlcGxhY2VkIGJ5IHRoZSB3cmFwcGluZyBvZiBlVGFza0dldFN0YXRlKCkKICAgICAgLSBvc0tlcm5lbFN0YXJ0KCkgQVBJIGNoYW5nZWQsIG11c3QgYmUgdXBkYXRlZAogICAgICAtIHVwZGF0ZSBGcmVlUlRPU0NvbmZpZy5oIGZpbGUsIHRha2luZyBGcmVlUlRPU0NvbmZpZ190ZW1wbGF0ZS5oIGZpbGUgYXMgcmVmZXJlbmNlCgoKIyMjIDEzLUp1bmUtMjAxNCAjIyMKPT09PT09PT09PT09PT09PT09PT0KICArIEZyZWVSVE9TQ29uZmlnX3RlbXBsYXRlLmg6IGFkZCB0aGlzIGRlZmluaXRpb24gI2RlZmluZSBJTkNMVURFX3hUYXNrR2V0U2NoZWR1bGVyU3RhdGUgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZW5hYmxlIHRoZSB1c2Ugb2YgeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSgpIEFQSSBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNvZGUuCgoKIyMjIDMwLUFwcmlsLTIwMTQgIyMjCj09PT09PT09PT09PT09PT09PT09PQogICsgY21zaXNfb3MuYzogYWRkIHByZXByb2Nlc3NvciBjb21waWxhdGlvbiBjb25kaXRpb24gd2hlbiBjYWxsaW5nIHNvbWUgRnJlZVJUT1MgQVBJcywgdG8gYXZvaWQgbGluawogICAgICAgICAgICAgICAgZXJyb3JzIHdpdGggTURLLUFSTSB3aGVuIHNvbWUgRnJlZVJUT1MgZmVhdHVyZXMgYXJlIG5vdCBlbmFibGVkIGluIEZyZWVSVE9TQ29uZmlnLmgKCgojIyMgMjItQXByaWwtMjAxNCAjIyMKPT09PT09PT09PT09PT09PT09PT09CiAgKyBBZGQgVGlja2xlcyBtb2RlIGZvciBDTTAgcG9ydCAoSUFSLCBHQ0MsIFJWRFMpLgoKCiMjIyAxOC1GZWJydWFyeS0yMDE0ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT0KICAgKyBGcmVlUlRPUyBWNy42LjAgY3VzdG9taXplZCB2ZXJzaW9uIGZvciBTVE0zMkN1YmUgc29sdXRpb24uCgoKICogPGgzPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gzPgogKi8K