Q2hhbmdlTG9nIGZvciBQQ1JFCi0tLS0tLS0tLS0tLS0tLS0tLQoKVmVyc2lvbiA4LjIxIDEyLURlYy0yMDExCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gIFVwZGF0aW5nIHRoZSBKSVQgY29tcGlsZXIuCgoyLiAgSklUIGNvbXBpbGVyIG5vdyBzdXBwb3J0cyBPUF9OQ1JFRiwgT1BfUlJFRiBhbmQgT1BfTlJSRUYuIE5ldyB0ZXN0IGNhc2VzCiAgICBhcmUgYWRkZWQgYXMgd2VsbC4KCjMuICBGaXggY2FjaGUtZmx1c2ggaXNzdWUgb24gUG93ZXJQQyAoSXQgaXMgc3RpbGwgYW4gZXhwZXJpbWVudGFsIEpJVCBwb3J0KS4KICAgIFBDUkVfRVhUUkFfVEFCTEVTIGlzIG5vdCBzdXBvcnRlZCBieSBKSVQsIGFuZCBzaG91bGQgYmUgY2hlY2tlZCBiZWZvcmUKICAgIGNhbGxpbmcgX3BjcmVfaml0X2V4ZWMuIFNvbWUgZXh0cmEgY29tbWVudHMgYXJlIGFkZGVkLgoKNC4gICgqTUFSSykgc2V0dGluZ3MgaW5zaWRlIGF0b21pYyBncm91cHMgdGhhdCBkbyBub3QgY29udGFpbiBhbnkgY2FwdHVyaW5nCiAgICBwYXJlbnRoZXNlcywgZm9yIGV4YW1wbGUsICg/PmEoKjptKSksIHdlcmUgbm90IGJlaW5nIHBhc3NlZCBvdXQuIFRoaXMgYnVnCiAgICB3YXMgaW50cm9kdWNlZCBieSBjaGFuZ2UgMTggZm9yIDguMjAuCgo1LiAgU3VwcG9ydGluZyBvZiBceCwgXFUgYW5kIFx1IGluIEphdmFTY3JpcHQgY29tcGF0aWJpbGl0eSBtb2RlIGJhc2VkIG9uIHRoZQogICAgRUNNQS0yNjIgc3RhbmRhcmQuCgo2LiAgTG9va2JlaGluZHMgc3VjaCBhcyAoPzw9YXsyfWIpIHRoYXQgY29udGFpbmVkIGEgZml4ZWQgcmVwZXRpdGlvbiB3ZXJlCiAgICBlcnJvbmVvdXNseSBiZWluZyByZWplY3RlZCBhcyAibm90IGZpeGVkIGxlbmd0aCIgaWYgUENSRV9DQVNFTEVTUyB3YXMgc2V0LgogICAgVGhpcyBidWcgd2FzIHByb2JhYmx5IGludHJvZHVjZWQgYnkgY2hhbmdlIDkgb2YgOC4xMy4KCjcuICBXaGlsZSBmaXhpbmcgNiBhYm92ZSwgSSBub3RpY2VkIHRoYXQgYSBudW1iZXIgb2Ygb3RoZXIgaXRlbXMgd2VyZSBiZWluZwogICAgaW5jb3JyZWN0bHkgcmVqZWN0ZWQgYXMgIm5vdCBmaXhlZCBsZW5ndGgiLiBUaGlzIGFyb3NlIHBhcnRseSBiZWNhdXNlIG5ld2VyCiAgICBvcGNvZGVzIGhhZCBub3QgYmVlbiBhZGRlZCB0byB0aGUgZml4ZWQtbGVuZ3RoIGNoZWNraW5nIGNvZGUuIEkgaGF2ZSAoYSkKICAgIGNvcnJlY3RlZCB0aGUgYnVnIGFuZCBhZGRlZCB0ZXN0cyBmb3IgdGhlc2UgaXRlbXMsIGFuZCAoYikgYXJyYW5nZWQgZm9yIGFuCiAgICBlcnJvciB0byBvY2N1ciBpZiBhbiB1bmtub3duIG9wY29kZSBpcyBlbmNvdW50ZXJlZCB3aGlsZSBjaGVja2luZyBmb3IgZml4ZWQKICAgIGxlbmd0aCBpbnN0ZWFkIG9mIGp1c3QgYXNzdW1pbmcgIm5vdCBmaXhlZCBsZW5ndGgiLiBUaGUgaXRlbXMgdGhhdCB3ZXJlCiAgICByZWplY3RlZCB3ZXJlOiAoKkFDQ0VQVCksICgqQ09NTUlUKSwgKCpGQUlMKSwgKCpNQVJLKSwgKCpQUlVORSksICgqU0tJUCksCiAgICAoKlRIRU4pLCBcaCwgXEgsIFx2LCBcViwgYW5kIHNpbmdsZSBjaGFyYWN0ZXIgbmVnYXRpdmUgY2xhc3NlcyB3aXRoIGZpeGVkCiAgICByZXBldGl0aW9ucywgZS5nLiBbXmFdezN9LCB3aXRoIGFuZCB3aXRob3V0IFBDUkVfQ0FTRUxFU1MuCgo4LiAgQSBwb3NzZXNzaXZlbHkgcmVwZWF0ZWQgY29uZGl0aW9uYWwgc3VicGF0dGVybiBzdWNoIGFzICg/KD89YyljfGQpKysgd2FzCiAgICBiZWluZyBpbmNvcnJlY3RseSBjb21waWxlZCBhbmQgd291bGQgaGF2ZSBnaXZlbiB1bnByZWRpY2F0YmxlIHJlc3VsdHMuCgo5LiAgQSBwb3NzZXNzaXZlbHkgcmVwZWF0ZWQgc3VicGF0dGVybiB3aXRoIG1pbmltdW0gcmVwZWF0IGNvdW50IGdyZWF0ZXIgdGhhbgogICAgb25lIGJlaGF2ZWQgaW5jb3JyZWN0bHkuIEZvciBleGFtcGxlLCAoQSl7Mix9KyBiZWhhdmVkIGFzIGlmIGl0IHdhcwogICAgKEEpKEEpKysgd2hpY2ggbWVhbnQgdGhhdCwgYWZ0ZXIgYSBzdWJzZXF1ZW50IG1pc21hdGNoLCBiYWNrdHJhY2tpbmcgaW50bwogICAgdGhlIGZpcnN0IChBKSBjb3VsZCBvY2N1ciB3aGVuIGl0IHNob3VsZCBub3QuCgoxMC4gQWRkIGEgY2FzdCBhbmQgcmVtb3ZlIGEgcmVkdW5kYW50IHRlc3QgZnJvbSB0aGUgY29kZS4KCjExLiBKSVQgc2hvdWxkIHVzZSBwY3JlX21hbGxvYy9wY3JlX2ZyZWUgZm9yIGFsbG9jYXRpb24uCgoxMi4gVXBkYXRlZCBwY3JlLWNvbmZpZyBzbyB0aGF0IGl0IG5vIGxvbmdlciBzaG93cyAtTC91c3IvbGliLCB3aGljaCBzZWVtcwogICAgYmVzdCBwcmFjdGljZSBub3dhZGF5cywgYW5kIGhlbHBzIHdpdGggY3Jvc3MtY29tcGlsaW5nLiAoSWYgdGhlIGV4ZWNfcHJlZml4CiAgICBpcyBhbnl0aGluZyBvdGhlciB0aGFuIC91c3IsIC1MIGlzIHN0aWxsIHNob3duKS4KCjEzLiBJbiBub24tVVRGLTggbW9kZSwgXEMgaXMgbm93IHN1cHBvcnRlZCBpbiBsb29rYmVoaW5kcyBhbmQgREZBIG1hdGNoaW5nLgoKMTQuIFBlcmwgZG9lcyBub3Qgc3VwcG9ydCBcTiB3aXRob3V0IGEgZm9sbG93aW5nIG5hbWUgaW4gYSBbXSBjbGFzczsgUENSRSBub3cKICAgIGFsc28gZ2l2ZXMgYW4gZXJyb3IuCgoxNS4gSWYgYSBmb3J3YXJkIHJlZmVyZW5jZSB3YXMgcmVwZWF0ZWQgd2l0aCBhbiB1cHBlciBsaW1pdCBvZiBhcm91bmQgMjAwMCwKICAgIGl0IGNhdXNlZCB0aGUgZXJyb3IgImludGVybmFsIGVycm9yOiBvdmVycmFuIGNvbXBpbGluZyB3b3Jrc3BhY2UiLiBUaGUKICAgIG1heGltdW0gbnVtYmVyIG9mIGZvcndhcmQgcmVmZXJlbmNlcyAoaW5jbHVkaW5nIHJlcGVhdHMpIHdhcyBsaW1pdGVkIGJ5IHRoZQogICAgaW50ZXJuYWwgd29ya3NwYWNlLCBhbmQgZGVwZW5kZW50IG9uIHRoZSBMSU5LX1NJWkUuIFRoZSBjb2RlIGhhcyBiZWVuCiAgICByZXdyaXR0ZW4gc28gdGhhdCB0aGUgd29ya3NwYWNlIGV4cGFuZHMgKHZpYSBwY3JlX21hbGxvYykgaWYgbmVjZXNzYXJ5LCBhbmQKICAgIHRoZSBkZWZhdWx0IGRlcGVuZHMgb24gTElOS19TSVpFLiBUaGVyZSBpcyBhIG5ldyB1cHBlciBsaW1pdCAoZm9yIHNhZmV0eSkKICAgIG9mIGFyb3VuZCAyMDAsMDAwIGZvcndhcmQgcmVmZXJlbmNlcy4gV2hpbGUgZG9pbmcgdGhpcywgSSBhbHNvIHNwZWVkZWQgdXAKICAgIHRoZSBmaWxsaW5nIGluIG9mIHJlcGVhdGVkIGZvcndhcmQgcmVmZXJlbmNlcy4KCjE2LiBBIHJlcGVhdGVkIGZvcndhcmQgcmVmZXJlbmNlIGluIGEgcGF0dGVybiBzdWNoIGFzIChhKSg/Mil7Mn0oLikgd2FzCiAgICBpbmNvcnJlY3RseSBleHBlY3RpbmcgdGhlIHN1YmplY3QgdG8gY29udGFpbiBhbm90aGVyICJhIiBhZnRlciB0aGUgc3RhcnQuCgoxNy4gV2hlbiAoKlNLSVA6bmFtZSkgaXMgYWN0aXZhdGVkIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nICgqTUFSSzpuYW1lKSBlYXJsaWVyCiAgICBpbiB0aGUgbWF0Y2gsIHRoZSBTS0lQIHNob3VsZCBiZSBpZ25vcmVkLiBUaGlzIHdhcyBub3QgaGFwcGVuaW5nOyBpbnN0ZWFkCiAgICB0aGUgU0tJUCB3YXMgYmVpbmcgdHJlYXRlZCBhcyBOT01BVENILiBGb3IgcGF0dGVybnMgc3VjaCBhcwogICAgL0EoKk1BUks6QSlBKygqU0tJUDpCKVp8QUFDLyB0aGlzIG1lYW50IHRoYXQgdGhlIEFBQyBicmFuY2ggd2FzIG5ldmVyCiAgICB0ZXN0ZWQuCgoxOC4gVGhlIGJlaGF2aW91ciBvZiAoKk1BUkspLCAoKlBSVU5FKSwgYW5kICgqVEhFTikgaGFzIGJlZW4gcmV3b3JrZWQgYW5kIGlzCiAgICBub3cgbXVjaCBtb3JlIGNvbXBhdGlibGUgd2l0aCBQZXJsLCBpbiBwYXJ0aWN1bGFyIGluIGNhc2VzIHdoZXJlIHRoZSByZXN1bHQKICAgIGlzIGEgbm9uLW1hdGNoIGZvciBhIG5vbi1hbmNob3JlZCBwYXR0ZXJuLiBGb3IgZXhhbXBsZSwgaWYKICAgIC9iKCo6bSlmfGEoKjpuKXcvIGlzIG1hdGNoZWQgYWdhaW5zdCAiYWJjIiwgdGhlIG5vbi1tYXRjaCByZXR1cm5zIHRoZSBuYW1lCiAgICAibSIsIHdoZXJlIHByZXZpb3VzbHkgaXQgZGlkIG5vdCByZXR1cm4gYSBuYW1lLiBBIHNpZGUgZWZmZWN0IG9mIHRoaXMKICAgIGNoYW5nZSBpcyB0aGF0IGZvciBwYXJ0aWFsIG1hdGNoZXMsIHRoZSBsYXN0IGVuY291bnRlcmVkIG1hcmsgbmFtZSBpcwogICAgcmV0dXJuZWQsIGFzIGZvciBub24gbWF0Y2hlcy4gQSBudW1iZXIgb2YgdGVzdHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgbm90CiAgICBQZXJsLWNvbXBhdGlibGUgaGF2ZSBiZWVuIG1vdmVkIGludG8gdGhlIFBlcmwtY29tcGF0aWJsZSB0ZXN0IGZpbGVzLiBUaGUKICAgIHJlZmFjdG9yaW5nIGhhcyBoYWQgdGhlIHBsZWFzaW5nIHNpZGUgZWZmZWN0IG9mIHJlbW92aW5nIG9uZSBhcmd1bWVudCBmcm9tCiAgICB0aGUgbWF0Y2goKSBmdW5jdGlvbiwgdGh1cyByZWR1Y2luZyBpdHMgc3RhY2sgcmVxdWlyZW1lbnRzLgoKMTkuIElmIHRoZSAvUysgb3B0aW9uIHdhcyB1c2VkIGluIHBjcmV0ZXN0IHRvIHN0dWR5IGEgcGF0dGVybiB1c2luZyBKSVQsCiAgICBzdWJzZXF1ZW50IHVzZXMgb2YgL1MgKHdpdGhvdXQgKykgaW5jb3JyZWN0bHkgYmVoYXZlZCBsaWtlIC9TKy4KCjIxLiBSZXRyaWV2ZSBleGVjdXRhYmxlIGNvZGUgc2l6ZSBzdXBwb3J0IGZvciB0aGUgSklUIGNvbXBpbGVyIGFuZCBmaXhpbmcKICAgIHNvbWUgd2FybmluZ3MuCgoyMi4gQSBjYXNlbGVzcyBtYXRjaCBvZiBhIFVURi04IGNoYXJhY3RlciB3aG9zZSBvdGhlciBjYXNlIHVzZXMgZmV3ZXIgYnl0ZXMgZGlkCiAgICBub3Qgd29yayB3aGVuIHRoZSBzaG9ydGVyIGNoYXJhY3RlciBhcHBlYXJlZCByaWdodCBhdCB0aGUgZW5kIG9mIHRoZQogICAgc3ViamVjdCBzdHJpbmcuCgoyMy4gQWRkZWQgc29tZSAoaW50KSBjYXN0cyB0byBub24tSklUIG1vZHVsZXMgdG8gcmVkdWNlIHdhcm5pbmdzIG9uIDY0LWJpdAogICAgc3lzdGVtcy4KCjI0LiBBZGRlZCBQQ1JFX0lORk9fSklUU0laRSB0byBwYXNzIG9uIHRoZSB2YWx1ZSBmcm9tICgyMSkgYWJvdmUsIGFuZCBhbHNvCiAgICBvdXRwdXQgaXQgd2hlbiB0aGUgL00gb3B0aW9uIGlzIHVzZWQgaW4gcGNyZXRlc3QuCgoyNS4gVGhlIENoZWNrTWFuIHNjcmlwdCB3YXMgbm90IGJlaW5nIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24uIEFsc28sIGFkZGVkCiAgICBhbiBleHBsaWNpdCAicGVybCIgdG8gcnVuIFBlcmwgc2NyaXB0cyBmcm9tIHRoZSBQcmVwYXJlUmVsZWFzZSBzY3JpcHQKICAgIGJlY2F1c2UgdGhpcyBpcyByZXBvcnRlZGx5IG5lZWRlZCBpbiBXaW5kb3dzLgoKMjYuIElmIHN0dWR5IGRhdGEgd2FzIGJlaW5nIHNhdmUgaW4gYSBmaWxlIGFuZCBzdHVkeWluZyBoYWQgbm90IGZvdW5kIGEgc2V0IG9mCiAgICAic3RhcnRzIHdpdGgiIGJ5dGVzIGZvciB0aGUgcGF0dGVybiwgdGhlIGRhdGEgd3JpdHRlbiB0byB0aGUgZmlsZSAodGhvdWdoCiAgICBuZXZlciB1c2VkKSB3YXMgdGFrZW4gZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeSBhbmQgc28gY2F1c2VkIHZhbGdyaW5kIHRvCiAgICBjb21wbGFpbi4KCjI3LiBVcGRhdGVkIFJ1blRlc3QuYmF0IGFzIHByb3ZpZGVkIGJ5IFNoZXJpIFBpZXJjZS4KCjI4LiBGaXhlZCBhIHBvc3NpYmxlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJ1ZyBpbiBwY3JlX2ppdF9jb21waWxlLmMuCgoyOS4gQ29tcHV0YXRpb24gb2YgbWVtb3J5IHVzYWdlIGZvciB0aGUgdGFibGUgb2YgY2FwdHVyaW5nIGdyb3VwIG5hbWVzIHdhcwogICAgZ2l2aW5nIGFuIHVubmVjZXNzYXJpbHkgbGFyZ2UgdmFsdWUuCgoKVmVyc2lvbiA4LjIwIDIxLU9jdC0yMDExCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gIENoYW5nZSAzNyBvZiA4LjEzIGJyb2tlIHBhdHRlcm5zIGxpa2UgWzphXS4uLltiOl0gYmVjYXVzZSBpdCB0aG91Z2h0IGl0IGhhZAogICAgYSBQT1NJWCBjbGFzcy4gQWZ0ZXIgZnVydGhlciBleHBlcmltZW50cyB3aXRoIFBlcmwsIHdoaWNoIGNvbnZpbmNlZCBtZSB0aGF0CiAgICBQZXJsIGhhcyBidWdzIGFuZCBjb25mdXNpb25zLCBhIGNsb3Npbmcgc3F1YXJlIGJyYWNrZXQgaXMgbm8gbG9uZ2VyIGFsbG93ZWQKICAgIGluIGEgUE9TSVggbmFtZS4gVGhpcyBidWcgYWxzbyBhZmZlY3RlZCBwYXR0ZXJucyB3aXRoIGNsYXNzZXMgdGhhdCBzdGFydGVkCiAgICB3aXRoIGZ1bGwgc3RvcHMuCgoyLiAgSWYgYSBwYXR0ZXJuIHN1Y2ggYXMgLyhhKWJ8YWMvIGlzIG1hdGNoZWQgYWdhaW5zdCAiYWMiLCB0aGVyZSBpcyBubwogICAgY2FwdHVyZWQgc3Vic3RyaW5nLCBidXQgd2hpbGUgY2hlY2tpbmcgdGhlIGZhaWxpbmcgZmlyc3QgYWx0ZXJuYXRpdmUsCiAgICBzdWJzdHJpbmcgMSBpcyB0ZW1wb3JhcmlseSBjYXB0dXJlZC4gSWYgdGhlIG91dHB1dCB2ZWN0b3Igc3VwcGxpZWQgdG8KICAgIHBjcmVfZXhlYygpIHdhcyBub3QgYmlnIGVub3VnaCBmb3IgdGhpcyBjYXB0dXJlLCB0aGUgeWllbGQgb2YgdGhlIGZ1bmN0aW9uCiAgICB3YXMgc3RpbGwgemVybyAoImluc3VmZmljaWVudCBzcGFjZSBmb3IgY2FwdHVyZWQgc3Vic3RyaW5ncyIpLiBUaGlzIGNhbm5vdAogICAgYmUgdG90YWxseSBmaXhlZCB3aXRob3V0IGFkZGluZyBhbm90aGVyIHN0YWNrIHZhcmlhYmxlLCB3aGljaCBzZWVtcyBhIGxvdAogICAgb2YgZXhwZW5zZSBmb3IgYSBlZGdlIGNhc2UuIEhvd2V2ZXIsIEkgaGF2ZSBpbXByb3ZlZCB0aGUgc2l0dWF0aW9uIGluIGNhc2VzCiAgICBzdWNoIGFzIC8oYSkoYil4fGFiYy8gbWF0Y2hlZCBhZ2FpbnN0ICJhYmMiLCB3aGVyZSB0aGUgcmV0dXJuIGNvZGUKICAgIGluZGljYXRlcyB0aGF0IGZld2VyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBvdmVjdG9yIGhhdmUKICAgIGJlZW4gc2V0LgoKMy4gIFJlbGF0ZWQgdG8gKDIpIGFib3ZlOiB3aGVuIHRoZXJlIGFyZSBtb3JlIGJhY2sgcmVmZXJlbmNlcyBpbiBhIHBhdHRlcm4gdGhhbgogICAgc2xvdHMgaW4gdGhlIG91dHB1dCB2ZWN0b3IsIHBjcmVfZXhlYygpIHVzZXMgdGVtcG9yYXJ5IG1lbW9yeSBkdXJpbmcKICAgIG1hdGNoaW5nLCBhbmQgY29waWVzIGluIHRoZSBjYXB0dXJlcyBhcyBmYXIgYXMgcG9zc2libGUgYWZ0ZXJ3YXJkcy4gSXQgd2FzCiAgICB1c2luZyB0aGUgZW50aXJlIG91dHB1dCB2ZWN0b3IsIGJ1dCB0aGlzIGNvbmZsaWN0cyB3aXRoIHRoZSBzcGVjaWZpY2F0aW9uCiAgICB0aGF0IG9ubHkgMi8zIGlzIHVzZWQgZm9yIHBhc3NpbmcgYmFjayBjYXB0dXJlZCBzdWJzdHJpbmdzLiBOb3cgaXQgdXNlcwogICAgb25seSB0aGUgZmlyc3QgMi8zLCBmb3IgY29tcGF0aWJpbGl0eS4gVGhpcyBpcywgb2YgY291cnNlLCBhbm90aGVyIGVkZ2UKICAgIGNhc2UuCgo0LiAgWm9sdGFuIEhlcmN6ZWcncyBqdXN0LWluLXRpbWUgY29tcGlsZXIgc3VwcG9ydCBoYXMgYmVlbiBpbnRlZ3JhdGVkIGludG8gdGhlCiAgICBtYWluIGNvZGUgYmFzZSwgYW5kIGNhbiBiZSB1c2VkIGJ5IGJ1aWxkaW5nIHdpdGggLS1lbmFibGUtaml0LiBXaGVuIHRoaXMgaXMKICAgIGRvbmUsIHBjcmVncmVwIGF1dG9tYXRpY2FsbHkgdXNlcyBpdCB1bmxlc3MgLS1kaXNhYmxlLXBjcmVncmVwLWppdCBvciB0aGUKICAgIHJ1bnRpbWUgLS1uby1qaXQgb3B0aW9uIGlzIGdpdmVuLgoKNS4gIFdoZW4gdGhlIG51bWJlciBvZiBtYXRjaGVzIGluIGEgcGNyZV9kZmFfZXhlYygpIHJ1biBleGFjdGx5IGZpbGxlZCB0aGUKICAgIG92ZWN0b3IsIHRoZSByZXR1cm4gZnJvbSB0aGUgZnVuY3Rpb24gd2FzIHplcm8sIGltcGx5aW5nIHRoYXQgdGhlcmUgd2VyZQogICAgb3RoZXIgbWF0Y2hlcyB0aGF0IGRpZCBub3QgZml0LiBUaGUgY29ycmVjdCAiZXhhY3RseSBmdWxsIiB2YWx1ZSBpcyBub3cKICAgIHJldHVybmVkLgoKNi4gIElmIGEgc3VicGF0dGVybiB0aGF0IHdhcyBjYWxsZWQgcmVjdXJzaXZlbHkgb3IgYXMgYSBzdWJyb3V0aW5lIGNvbnRhaW5lZAogICAgKCpQUlVORSkgb3IgYW55IG90aGVyIGNvbnRyb2wgdGhhdCBjYXVzZWQgaXQgdG8gZ2l2ZSBhIG5vbi1zdGFuZGFyZCByZXR1cm4sCiAgICBpbnZhbGlkIGVycm9ycyBzdWNoIGFzICJFcnJvciAtMjYgKG5lc3RlZCByZWN1cnNpb24gYXQgdGhlIHNhbWUgc3ViamVjdAogICAgcG9zaXRpb24pIiBvciBldmVuIGluZmluaXRlIGxvb3BzIGNvdWxkIG9jY3VyLgoKNy4gIElmIGEgcGF0dGVybiBzdWNoIGFzIC9hKCpTS0lQKWN8YigqQUNDRVBUKXwvIHdhcyBzdHVkaWVkLCBpdCBzdG9wcGVkCiAgICBjb21wdXRpbmcgdGhlIG1pbmltdW0gbGVuZ3RoIG9uIHJlYWNoaW5nICpBQ0NFUFQsIGFuZCBzbyBlbmRlZCB1cCB3aXRoIHRoZQogICAgd3JvbmcgdmFsdWUgb2YgMSByYXRoZXIgdGhhbiAwLiBGdXJ0aGVyIGludmVzdGlnYXRpb24gaW5kaWNhdGVzIHRoYXQKICAgIGNvbXB1dGluZyBhIG1pbmltdW0gc3ViamVjdCBsZW5ndGggaW4gdGhlIHByZXNlbmNlIG9mICpBQ0NFUFQgaXMgZGlmZmljdWx0CiAgICAodGhpbmsgYmFjayByZWZlcmVuY2VzLCBzdWJyb3V0aW5lIGNhbGxzKSwgYW5kIHNvIEkgaGF2ZSBjaGFuZ2VkIHRoZSBjb2RlCiAgICBzbyB0aGF0IG5vIG1pbmltdW0gaXMgcmVnaXN0ZXJlZCBmb3IgYSBwYXR0ZXJuIHRoYXQgY29udGFpbnMgKkFDQ0VQVC4KCjguICBJZiAoKlRIRU4pIHdhcyBwcmVzZW50IGluIHRoZSBmaXJzdCAodHJ1ZSkgYnJhbmNoIG9mIGEgY29uZGl0aW9uYWwgZ3JvdXAsCiAgICBpdCB3YXMgbm90IGhhbmRsZWQgYXMgaW50ZW5kZWQuIFtCdXQgc2VlIDE2IGJlbG93Ll0KCjkuICBSZXBsYWNlZCBSdW5UZXN0LmJhdCBhbmQgQ01ha2VMaXN0cy50eHQgd2l0aCBpbXByb3ZlZCB2ZXJzaW9ucyBwcm92aWRlZCBieQogICAgU2hlcmkgUGllcmNlLgoKMTAuIEEgcGF0aG9sb2dpY2FsIHBhdHRlcm4gc3VjaCBhcyAvKCpBQ0NFUFQpYS8gd2FzIG1pc2NvbXBpbGVkLCB0aGlua2luZyB0aGF0CiAgICB0aGUgZmlyc3QgYnl0ZSBpbiBhIG1hdGNoIG11c3QgYmUgImEiLgoKMTEuIENoYW5nZSAxNyBmb3IgOC4xMyBpbmNyZWFzZWQgdGhlIHJlY3Vyc2lvbiBkZXB0aCBmb3IgcGF0dGVybnMgbGlrZQogICAgL2EoPzouKSo/YS8gZHJhc3RpY2FsbHkuIEkndmUgaW1wcm92ZWQgdGhpbmdzIGJ5IHJlbWVtYmVyaW5nIHdoZXRoZXIgYQogICAgcGF0dGVybiBjb250YWlucyBhbnkgaW5zdGFuY2VzIG9mICgqVEhFTikuIElmIGl0IGRvZXMgbm90LCB0aGUgb2xkCiAgICBvcHRpbWl6YXRpb25zIGFyZSByZXN0b3JlZC4gSXQgd291bGQgYmUgbmljZSB0byBkbyB0aGlzIG9uIGEgcGVyLWdyb3VwCiAgICBiYXNpcywgYnV0IGF0IHRoZSBtb21lbnQgdGhhdCBpcyBub3QgZmVhc2libGUuCgoxMi4gSW4gc29tZSBlbnZpcm9ubWVudHMsIHRoZSBvdXRwdXQgb2YgcGNyZXRlc3QgLUMgaXMgQ1JMRiB0ZXJtaW5hdGVkLiBUaGlzCiAgICBicm9rZSBSdW5UZXN0J3MgY29kZSB0aGF0IGNoZWNrcyBmb3IgdGhlIGxpbmsgc2l6ZS4gQSBzaW5nbGUgd2hpdGUgc3BhY2UKICAgIGNoYXJhY3RlciBhZnRlciB0aGUgdmFsdWUgaXMgbm93IGFsbG93ZWQgZm9yLgoKMTMuIFJ1blRlc3Qgbm93IGNoZWNrcyBmb3IgdGhlICJmciIgbG9jYWxlIGFzIHdlbGwgYXMgZm9yICJmcl9GUiIgYW5kICJmcmVuY2giLgogICAgRm9yICJmciIsIGl0IHVzZXMgdGhlIFdpbmRvd3Mtc3BlY2lmaWMgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KCjE0LiBJZiAoKlRIRU4pIGFwcGVhcmVkIGluIGEgZ3JvdXAgdGhhdCB3YXMgY2FsbGVkIHJlY3Vyc2l2ZWx5IG9yIGFzIGEKICAgIHN1YnJvdXRpbmUsIGl0IGRpZCBub3Qgd29yayBhcyBpbnRlbmRlZC4gW0J1dCBzZWUgbmV4dCBpdGVtLl0KCjE1LiBDb25zaWRlciB0aGUgcGF0dGVybiAvQSAoQigqVEhFTilDKSB8IEQvIHdoZXJlIEEsIEIsIEMsIGFuZCBEIGFyZSBjb21wbGV4CiAgICBwYXR0ZXJuIGZyYWdtZW50cyAoYnV0IG5vdCBjb250YWluaW5nIGFueSB8IGNoYXJhY3RlcnMpLiBJZiBBIGFuZCBCIGFyZQogICAgbWF0Y2hlZCwgYnV0IHRoZXJlIGlzIGEgZmFpbHVyZSBpbiBDIHNvIHRoYXQgaXQgYmFja3RyYWNrcyB0byAoKlRIRU4pLCBQQ1JFCiAgICB3YXMgYmVoYXZpbmcgZGlmZmVyZW50bHkgdG8gUGVybC4gUENSRSBiYWNrdHJhY2tlZCBpbnRvIEEsIGJ1dCBQZXJsIGdvZXMgdG8KICAgIEQuIEluIG90aGVyIHdvcmRzLCBQZXJsIGNvbnNpZGVycyBwYXJlbnRoZXNlcyB0aGF0IGRvIG5vdCBjb250YWluIGFueSB8CiAgICBjaGFyYWN0ZXJzIHRvIGJlIHBhcnQgb2YgYSBzdXJyb3VuZGluZyBhbHRlcm5hdGl2ZSwgd2hlcmVhcyBQQ1JFIHdhcwogICAgdHJlYWRpbmcgKEIoKlRIRU4pQykgdGhlIHNhbWUgYXMgKEIoKlRIRU4pQ3woKkZBSUwpKSAtLSB3aGljaCBQZXJsIGhhbmRsZXMKICAgIGRpZmZlcmVudGx5LiBQQ1JFIG5vdyBiZWhhdmVzIGluIHRoZSBzYW1lIHdheSBhcyBQZXJsLCBleGNlcHQgaW4gdGhlIGNhc2UKICAgIG9mIHN1YnJvdXRpbmUvcmVjdXJzaW9uIGNhbGxzIHN1Y2ggYXMgKD8xKSB3aGljaCBoYXZlIGluIGFueSBjYXNlIGFsd2F5cwogICAgYmVlbiBkaWZmZXJlbnQgKGJ1dCBQQ1JFIGhhZCB0aGVtIGZpcnN0IDotKS4KCjE2LiBSZWxhdGVkIHRvIDE1IGFib3ZlOiBQZXJsIGRvZXMgbm90IHRyZWF0IHRoZSB8IGluIGEgY29uZGl0aW9uYWwgZ3JvdXAgYXMKICAgIGNyZWF0aW5nIGFsdGVybmF0aXZlcy4gU3VjaCBhIGdyb3VwIGlzIHRyZWF0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGFuCiAgICBvcmRpbmFyeSBncm91cCB3aXRob3V0IGFueSB8IGNoYXJhY3RlcnMgd2hlbiBwcm9jZXNzaW5nICgqVEhFTikuIFBDUkUgaGFzCiAgICBiZWVuIGNoYW5nZWQgdG8gbWF0Y2ggUGVybCdzIGJlaGF2aW91ci4KCjE3LiBJZiBhIHVzZXIgaGFkIHNldCBQQ1JFR1JFUF9DT0xPKFUpUiB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiAxOjMxLCB0aGUKICAgIFJ1bkdyZXBUZXN0IHNjcmlwdCBmYWlsZWQuCgoxOC4gQ2hhbmdlIDIyIGZvciB2ZXJzaW9uIDEzIGNhdXNlZCBhdG9taWMgZ3JvdXBzIHRvIHVzZSBtb3JlIHN0YWNrLiBUaGlzIGlzCiAgICBpbmV2aXRhYmxlIGZvciBncm91cHMgdGhhdCBjb250YWluIGNhcHR1cmVzLCBidXQgaXQgY2FuIGxlYWQgdG8gYSBsb3Qgb2YKICAgIHN0YWNrIHVzZSBpbiBsYXJnZSBwYXR0ZXJucy4gVGhlIG9sZCBiZWhhdmlvdXIgaGFzIGJlZW4gcmVzdG9yZWQgZm9yIGF0b21pYwogICAgZ3JvdXBzIHRoYXQgZG8gbm90IGNvbnRhaW4gYW55IGNhcHR1cmluZyBwYXJlbnRoZXNlcy4KCjE5LiBJZiB0aGUgUENSRV9OT19TVEFSVF9PUFRJTUlaRSBvcHRpb24gd2FzIHNldCBmb3IgcGNyZV9jb21waWxlKCksIGl0IGRpZCBub3QKICAgIHN1cHByZXNzIHRoZSBjaGVjayBmb3IgYSBtaW5pbXVtIHN1YmplY3QgbGVuZ3RoIGF0IHJ1biB0aW1lLiAoSWYgaXQgd2FzCiAgICBnaXZlbiB0byBwY3JlX2V4ZWMoKSBvciBwY3JlX2RmYV9leGVjKCkgaXQgZGlkIHdvcmsuKQoKMjAuIEZpeGVkIGFuIEFTQ0lJLWRlcGVuZGVudCBpbmZlbGljaXR5IGluIHBjcmV0ZXN0IHRoYXQgd291bGQgaGF2ZSBtYWRlIGl0CiAgICBmYWlsIHRvIHdvcmsgd2hlbiBkZWNvZGluZyBoZXggY2hhcmFjdGVycyBpbiBkYXRhIHN0cmluZ3MgaW4gRUJDRElDCiAgICBlbnZpcm9ubWVudHMuCgoyMS4gSXQgYXBwZWFycyB0aGF0IGluIGF0IGxlYXN0IG9uZSBNYWMgT1MgZW52aXJvbm1lbnQsIHRoZSBpc3hkaWdpdCgpIGZ1bmN0aW9uCiAgICBpcyBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvIHRoYXQgZXZhbHVhdGVzIHRvIGl0cyBhcmd1bWVudCBtb3JlIHRoYW4gb25jZSwKICAgIGNvbnRyYXZlbmluZyB0aGUgQyA5MCBTdGFuZGFyZCAoSSBoYXZlbid0IGNoZWNrZWQgYSBsYXRlciBzdGFuZGFyZCkuIFRoZXJlCiAgICB3YXMgYW4gaW5zdGFuY2UgaW4gcGNyZXRlc3Qgd2hpY2ggY2F1c2VkIGl0IHRvIGdvIHdyb25nIHdoZW4gcHJvY2Vzc2luZwogICAgXHh7Li4ufSBlc2NhcGVzIGluIHN1YmplY3Qgc3RyaW5ncy4gVGhlIGhhcyBiZWVuIHJld3JpdHRlbiB0byBhdm9pZCB1c2luZwogICAgdGhpbmdzIGxpa2UgcCsrIGluIHRoZSBhcmd1bWVudCBvZiBpc3hkaWdpdCgpLgoKClZlcnNpb24gOC4xMyAxNi1BdWctMjAxMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuICBUaGUgVW5pY29kZSBkYXRhIHRhYmxlcyBoYXZlIGJlZW4gdXBkYXRlZCB0byBVbmljb2RlIDYuMC4wLgoKMi4gIFR3byBtaW5vciB0eXBvcyBpbiBwY3JlX2ludGVybmFsLmggaGF2ZSBiZWVuIGZpeGVkLgoKMy4gIEFkZGVkICNpbmNsdWRlIDxzdHJpbmcuaD4gdG8gcGNyZV9zY2FubmVyX3VuaXR0ZXN0LmNjLCBwY3JlY3BwLmNjLCBhbmQKICAgIHBjcmVjcHBfdW5pdHRlc3QuY2MuIFRoZXkgYXJlIG5lZWRlZCBmb3Igc3RyY21wKCksIG1lbXNldCgpLCBhbmQgc3RyY2hyKCkKICAgIGluIHNvbWUgZW52aXJvbm1lbnRzIChlLmcuIFNvbGFyaXMgMTAvU1BBUkMgdXNpbmcgU3VuIFN0dWRpbyAxMlUyKS4KCjQuICBUaGVyZSB3ZXJlIGEgbnVtYmVyIG9mIHJlbGF0ZWQgYnVncyBpbiB0aGUgY29kZSBmb3IgbWF0Y2hpbmcgYmFja3JlZmVuY2VzCiAgICBjYXNlbGVzc2x5IGluIFVURi04IG1vZGUgd2hlbiBjb2RlcyBmb3IgdGhlIGNoYXJhY3RlcnMgY29uY2VybmVkIHdlcmUKICAgIGRpZmZlcmVudCBudW1iZXJzIG9mIGJ5dGVzLiBGb3IgZXhhbXBsZSwgVSswMjNBIGFuZCBVKzJDNjUgYXJlIGFuIHVwcGVyCiAgICBhbmQgbG93ZXIgY2FzZSBwYWlyLCB1c2luZyAyIGFuZCAzIGJ5dGVzLCByZXNwZWN0aXZlbHkuIFRoZSBtYWluIGJ1Z3Mgd2VyZToKICAgIChhKSBBIHJlZmVyZW5jZSB0byAzIGNvcGllcyBvZiBhIDItYnl0ZSBjb2RlIG1hdGNoZWQgb25seSAyIG9mIGEgMy1ieXRlCiAgICBjb2RlLiAoYikgQSByZWZlcmVuY2UgdG8gMiBjb3BpZXMgb2YgYSAzLWJ5dGUgY29kZSB3b3VsZCBub3QgbWF0Y2ggMiBvZiBhCiAgICAyLWJ5dGUgY29kZSBhdCB0aGUgZW5kIG9mIHRoZSBzdWJqZWN0IChpdCB0aG91Z2h0IHRoZXJlIHdhc24ndCBlbm91Z2ggZGF0YQogICAgbGVmdCkuCgo1LiAgQ29tcHJlaGVuc2l2ZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHdlbnQgd3JvbmcgaXMgbm93IHJldHVybmVkIGJ5CiAgICBwY3JlX2V4ZWMoKSBhbmQgcGNyZV9kZmFfZXhlYygpIHdoZW4gdGhlIFVURi04IHN0cmluZyBjaGVjayBmYWlscywgYXMgbG9uZwogICAgYXMgdGhlIG91dHB1dCB2ZWN0b3IgaGFzIGF0IGxlYXN0IDIgZWxlbWVudHMuIFRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mCiAgICB0aGUgZmFpbGluZyBjaGFyYWN0ZXIgYW5kIGEgcmVhc29uIGNvZGUgYXJlIHBsYWNlZCBpbiB0aGUgdmVjdG9yLgoKNi4gIFdoZW4gdGhlIFVURi04IHN0cmluZyBjaGVjayBmYWlscyBmb3IgcGNyZV9jb21waWxlKCksIHRoZSBvZmZzZXQgdGhhdCBpcwogICAgbm93IHJldHVybmVkIGlzIGZvciB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZmFpbGluZyBjaGFyYWN0ZXIsIGluc3RlYWQgb2YgdGhlCiAgICBsYXN0IGJ5dGUgaW5zcGVjdGVkLiBUaGlzIGlzIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UsIGJ1dCBJIGhvcGUgaXQgaXMgc21hbGwKICAgIGVub3VnaCBub3QgdG8gYmUgYSBwcm9ibGVtLiBJdCBtYWtlcyB0aGUgcmV0dXJuZWQgb2Zmc2V0IGNvbnNpc3RlbnQgd2l0aAogICAgcGNyZV9leGVjKCkgYW5kIHBjcmVfZGZhX2V4ZWMoKS4KCjcuICBwY3JldGVzdCBub3cgZ2l2ZXMgYSB0ZXh0IHBocmFzZSBhcyB3ZWxsIGFzIHRoZSBlcnJvciBudW1iZXIgd2hlbgogICAgcGNyZV9leGVjKCkgb3IgcGNyZV9kZmFfZXhlYygpIGZhaWxzOyBpZiB0aGUgZXJyb3IgaXMgYSBVVEYtOCBjaGVjawogICAgZmFpbHVyZSwgdGhlIG9mZnNldCBhbmQgcmVhc29uIGNvZGUgYXJlIG91dHB1dC4KCjguICBXaGVuIFxSIHdhcyB1c2VkIHdpdGggYSBtYXhpbWl6aW5nIHF1YW50aWZpZXIgaXQgZmFpbGVkIHRvIHNraXAgYmFja3dhcmRzCiAgICBvdmVyIGEgXHJcbiBwYWlyIGlmIHRoZSBzdWJzZXF1ZW50IG1hdGNoIGZhaWxlZC4gSW5zdGVhZCwgaXQganVzdCBza2lwcGVkCiAgICBiYWNrIG92ZXIgYSBzaW5nbGUgY2hhcmFjdGVyIChcbikuIFRoaXMgc2VlbXMgd3JvbmcgKGJlY2F1c2UgaXQgdHJlYXRlZCB0aGUKICAgIHR3byBjaGFyYWN0ZXJzIGFzIGEgc2luZ2xlIGVudGl0eSB3aGVuIGdvaW5nIGZvcndhcmRzKSwgY29uZmxpY3RzIHdpdGggdGhlCiAgICBkb2N1bWVudGF0aW9uIHRoYXQgXFIgaXMgZXF1aXZhbGVudCB0byAoPz5cclxufFxufC4uLmV0YyksIGFuZCBtYWtlcyB0aGUKICAgIGJlaGF2aW91ciBvZiBcUiogZGlmZmVyZW50IHRvIChcUikqLCB3aGljaCBhbHNvIHNlZW1zIHdyb25nLiBUaGUgYmVoYXZpb3VyCiAgICBoYXMgYmVlbiBjaGFuZ2VkLgoKOS4gIFNvbWUgaW50ZXJuYWwgcmVmYWN0b3JpbmcgaGFzIGNoYW5nZWQgdGhlIHByb2Nlc3Npbmcgc28gdGhhdCB0aGUgaGFuZGxpbmcKICAgIG9mIHRoZSBQQ1JFX0NBU0VMRVNTIGFuZCBQQ1JFX01VTFRJTElORSBvcHRpb25zIGlzIGRvbmUgZW50aXJlbHkgYXQgY29tcGlsZQogICAgdGltZSAodGhlIFBDUkVfRE9UQUxMIG9wdGlvbiB3YXMgY2hhbmdlZCB0aGlzIHdheSBzb21lIHRpbWUgYWdvOiB2ZXJzaW9uCiAgICA3LjcgY2hhbmdlIDE2KS4gVGhpcyBoYXMgbWFkZSBpdCBwb3NzaWJsZSB0byBhYm9saXNoIHRoZSBPUF9PUFQgb3AgY29kZSwKICAgIHdoaWNoIHdhcyBhbHdheXMgYSBiaXQgb2YgYSBmdWRnZS4gSXQgYWxzbyBtZWFucyB0aGF0IHRoZXJlIGlzIG9uZSBsZXNzCiAgICBhcmd1bWVudCBmb3IgdGhlIG1hdGNoKCkgZnVuY3Rpb24sIHdoaWNoIHJlZHVjZXMgaXRzIHN0YWNrIHJlcXVpcmVtZW50cwogICAgc2xpZ2h0bHkuIFRoaXMgY2hhbmdlIGFsc28gZml4ZXMgYW4gaW5jb21wYXRpYmlsaXR5IHdpdGggUGVybDogdGhlIHBhdHRlcm4KICAgICg/aTooW15iXSkpKD8xKSBzaG91bGQgbm90IG1hdGNoICJhYiIsIGJ1dCBwcmV2aW91c2x5IFBDUkUgZ2F2ZSBhIG1hdGNoLgoKMTAuIE1vcmUgaW50ZXJuYWwgcmVmYWN0b3JpbmcgaGFzIGRyYXN0aWNhbGx5IHJlZHVjZWQgdGhlIG51bWJlciBvZiByZWN1cnNpdmUKICAgIGNhbGxzIHRvIG1hdGNoKCkgZm9yIHBvc3Nlc3NpdmVseSByZXBlYXRlZCBncm91cHMgc3VjaCBhcyAoYWJjKSsrIHdoZW4KICAgIHVzaW5nIHBjcmVfZXhlYygpLgoKMTEuIFdoaWxlIGltcGxlbWVudGluZyAxMCwgYSBudW1iZXIgb2YgYnVncyBpbiB0aGUgaGFuZGxpbmcgb2YgZ3JvdXBzIHdlcmUKICAgIGRpc2NvdmVyZWQgYW5kIGZpeGVkOgoKICAgICg/PD0oYSkrKSB3YXMgbm90IGRpYWdub3NlZCBhcyBpbnZhbGlkIChub24tZml4ZWQtbGVuZ3RoIGxvb2tiZWhpbmQpLgogICAgKGF8KSooPzEpIGdhdmUgYSBjb21waWxlLXRpbWUgaW50ZXJuYWwgZXJyb3IuCiAgICAoKGF8KSspKyAgZGlkIG5vdCBub3RpY2UgdGhhdCB0aGUgb3V0ZXIgZ3JvdXAgY291bGQgbWF0Y2ggYW4gZW1wdHkgc3RyaW5nLgogICAgKF5hfF4pKyAgIHdhcyBub3QgbWFya2VkIGFzIGFuY2hvcmVkLgogICAgKC4qYXwuKikrIHdhcyBub3QgbWFya2VkIGFzIG1hdGNoaW5nIGF0IHN0YXJ0IG9yIGFmdGVyIGEgbmV3bGluZS4KCjEyLiBZZXQgbW9yZSBpbnRlcm5hbCByZWZhY3RvcmluZyBoYXMgcmVtb3ZlZCBhbm90aGVyIGFyZ3VtZW50IGZyb20gdGhlIG1hdGNoKCkKICAgIGZ1bmN0aW9uLiBTcGVjaWFsIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gYXJlIG5vdyBpbmRpY2F0ZWQgYnkgc2V0dGluZyBhCiAgICB2YWx1ZSBpbiBhIHZhcmlhYmxlIGluIHRoZSAibWF0Y2ggZGF0YSIgZGF0YSBibG9jay4KCjEzLiBCZSBtb3JlIGV4cGxpY2l0IGluIHBjcmVfc3R1ZHkoKSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gImRlZmF1bHQiIGZvcgogICAgb3Bjb2RlcyB0aGF0IG1lYW4gdGhlcmUgaXMgbm8gc3RhcnRpbmcgY2hhcmFjdGVyOyB0aGlzIG1lYW5zIHRoYXQgd2hlbiBuZXcKICAgIG9uZXMgYXJlIGFkZGVkIGFuZCBhY2NpZGVudGFsbHkgbGVmdCBvdXQgb2YgcGNyZV9zdHVkeSgpLCB0ZXN0aW5nIHNob3VsZAogICAgcGljayB0aGVtIHVwLgoKMTQuIFRoZSAtcyBvcHRpb24gb2YgcGNyZXRlc3QgaGFzIGJlZW4gZG9jdW1lbnRlZCBmb3IgYWdlcyBhcyBiZWluZyBhbiBvbGQKICAgIHN5bm9ueW0gb2YgLW0gKHNob3cgbWVtb3J5IHVzYWdlKS4gSSBoYXZlIGNoYW5nZWQgaXQgdG8gbWVhbiAiZm9yY2Ugc3R1ZHkKICAgIGZvciBldmVyeSByZWdleCIsIHRoYXQgaXMsIGFzc3VtZSAvUyBmb3IgZXZlcnkgcmVnZXguIFRoaXMgaXMgc2ltaWxhciB0byAtaQogICAgYW5kIC1kIGV0Yy4gSXQncyBzbGlnaHRseSBpbmNvbXBhdGlibGUsIGJ1dCBJJ20gaG9waW5nIG5vYm9keSBpcyBzdGlsbAogICAgdXNpbmcgaXQuIEl0IG1ha2VzIGl0IGVhc2llciB0byBydW4gY29sbGVjdGlvbnMgb2YgdGVzdHMgd2l0aCBhbmQgd2l0aG91dAogICAgc3R1ZHkgZW5hYmxlZCwgYW5kIHRoZXJlYnkgdGVzdCBwY3JlX3N0dWR5KCkgbW9yZSBlYXNpbHkuIEFsbCB0aGUgc3RhbmRhcmQKICAgIHRlc3RzIGFyZSBub3cgcnVuIHdpdGggYW5kIHdpdGhvdXQgLXMgKGJ1dCBzb21lIHBhdHRlcm5zIGNhbiBiZSBtYXJrZWQgYXMKICAgICJuZXZlciBzdHVkeSIgLSBzZWUgMjAgYmVsb3cpLgoKMTUuIFdoZW4gKCpBQ0NFUFQpIHdhcyB1c2VkIGluIGEgc3VicGF0dGVybiB0aGF0IHdhcyBjYWxsZWQgcmVjdXJzaXZlbHksIHRoZQogICAgcmVzdG9yYXRpb24gb2YgdGhlIGNhcHR1cmluZyBkYXRhIHRvIHRoZSBvdXRlciB2YWx1ZXMgd2FzIG5vdCBoYXBwZW5pbmcKICAgIGNvcnJlY3RseS4KCjE2LiBJZiBhIHJlY3Vyc2l2ZWx5IGNhbGxlZCBzdWJwYXR0ZXJuIGVuZGVkIHdpdGggKCpBQ0NFUFQpIGFuZCBtYXRjaGVkIGFuCiAgICBlbXB0eSBzdHJpbmcsIGFuZCBQQ1JFX05PVEVNUFRZIHdhcyBzZXQsIHBjcmVfZXhlYygpIHRob3VnaHQgdGhlIHdob2xlCiAgICBwYXR0ZXJuIGhhZCBtYXRjaGVkIGFuIGVtcHR5IHN0cmluZywgYW5kIHNvIGluY29ycmVjdGx5IHJldHVybmVkIGEgbm8KICAgIG1hdGNoLgoKMTcuIFRoZXJlIHdhcyBvcHRpbWl6aW5nIGNvZGUgZm9yIHRoZSBsYXN0IGJyYW5jaCBvZiBub24tY2FwdHVyaW5nIHBhcmVudGhlc2VzLAogICAgYW5kIGFsc28gZm9yIHRoZSBvYmV5ZWQgYnJhbmNoIG9mIGEgY29uZGl0aW9uYWwgc3ViZXhwcmVzc2lvbiwgd2hpY2ggdXNlZAogICAgdGFpbCByZWN1cnNpb24gdG8gY3V0IGRvd24gb24gc3RhY2sgdXNhZ2UuIFVuZm9ydHVuYXRlbHksIG5vdyB0aGF0IHRoZXJlIGlzCiAgICB0aGUgcG9zc2liaWxpdHkgb2YgKCpUSEVOKSBvY2N1cnJpbmcgaW4gdGhlc2UgYnJhbmNoZXMsIHRhaWwgcmVjdXJzaW9uIGlzCiAgICBubyBsb25nZXIgcG9zc2libGUgYmVjYXVzZSB0aGUgcmV0dXJuIGhhcyB0byBiZSBjaGVja2VkIGZvciAoKlRIRU4pLiBUaGVzZQogICAgdHdvIG9wdGltaXphdGlvbnMgaGF2ZSB0aGVyZWZvcmUgYmVlbiByZW1vdmVkLiBbQnV0IHNlZSA4LjIwLzExIGFib3ZlLl0KCjE4LiBJZiBhIHBhdHRlcm4gY29udGFpbmluZyBcUiB3YXMgc3R1ZGllZCwgaXQgd2FzIGFzc3VtZWQgdGhhdCBcUiBhbHdheXMKICAgIG1hdGNoZWQgdHdvIGJ5dGVzLCB0aHVzIGNhdXNpbmcgdGhlIG1pbmltdW0gc3ViamVjdCBsZW5ndGggdG8gYmUKICAgIGluY29ycmVjdGx5IGNvbXB1dGVkIGJlY2F1c2UgXFIgY2FuIGFsc28gbWF0Y2gganVzdCBvbmUgYnl0ZS4KCjE5LiBJZiBhIHBhdHRlcm4gY29udGFpbmluZyAoKkFDQ0VQVCkgd2FzIHN0dWRpZWQsIHRoZSBtaW5pbXVtIHN1YmplY3QgbGVuZ3RoCiAgICB3YXMgaW5jb3JyZWN0bHkgY29tcHV0ZWQuCgoyMC4gSWYgL1MgaXMgcHJlc2VudCB0d2ljZSBvbiBhIHRlc3QgcGF0dGVybiBpbiBwY3JldGVzdCBpbnB1dCwgaXQgbm93CiAgICAqZGlzYWJsZXMqIHN0dWR5aW5nLCB0aGVyZWJ5IG92ZXJyaWRpbmcgdGhlIHVzZSBvZiAtcyBvbiB0aGUgY29tbWFuZCBsaW5lCiAgICAoc2VlIDE0IGFib3ZlKS4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIG9uZSBvciB0d28gdGVzdHMgdG8ga2VlcCB0aGUgb3V0cHV0CiAgICBpZGVudGljYWwgaW4gYm90aCBjYXNlcy4KCjIxLiBXaGVuICgqQUNDRVBUKSB3YXMgdXNlZCBpbiBhbiBhc3NlcnRpb24gdGhhdCBtYXRjaGVkIGFuIGVtcHR5IHN0cmluZyBhbmQKICAgIFBDUkVfTk9URU1QVFkgd2FzIHNldCwgUENSRSBhcHBsaWVkIHRoZSBub24tZW1wdHkgdGVzdCB0byB0aGUgYXNzZXJ0aW9uLgoKMjIuIFdoZW4gYW4gYXRvbWljIGdyb3VwIHRoYXQgY29udGFpbmVkIGEgY2FwdHVyaW5nIHBhcmVudGhlc2lzIHdhcwogICAgc3VjY2Vzc2Z1bGx5IG1hdGNoZWQsIGJ1dCB0aGUgYnJhbmNoIGluIHdoaWNoIGl0IGFwcGVhcmVkIGZhaWxlZCwgdGhlCiAgICBjYXB0dXJpbmcgd2FzIG5vdCBiZWluZyBmb3Jnb3R0ZW4gaWYgYSBoaWdoZXIgbnVtYmVyZWQgZ3JvdXAgd2FzIGxhdGVyCiAgICBjYXB0dXJlZC4gRm9yIGV4YW1wbGUsIC8oPz4oYSkpYnwoYSljLyB3aGVuIG1hdGNoaW5nICJhYyIgc2V0IGNhcHR1cmluZwogICAgZ3JvdXAgMSB0byAiYSIsIHdoZW4gaW4gZmFjdCBpdCBzaG91bGQgYmUgdW5zZXQuIFRoaXMgYXBwbGllZCB0byBtdWx0aS0KICAgIGJyYW5jaGVkIGNhcHR1cmluZyBhbmQgbm9uLWNhcHR1cmluZyBncm91cHMsIHJlcGVhdGVkIG9yIG5vdCwgYW5kIGFsc28gdG8KICAgIHBvc2l0aXZlIGFzc2VydGlvbnMgKGNhcHR1cmluZyBpbiBuZWdhdGl2ZSBhc3NlcnRpb25zIGRvZXMgbm90IGhhcHBlbgogICAgaW4gUENSRSkgYW5kIGFsc28gdG8gbmVzdGVkIGF0b21pYyBncm91cHMuCgoyMy4gQWRkIHRoZSArKyBxdWFsaWZpZXIgZmVhdHVyZSB0byBwY3JldGVzdCwgdG8gc2hvdyB0aGUgcmVtYWluZGVyIG9mIHRoZQogICAgc3ViamVjdCBhZnRlciBhIGNhcHR1cmVkIHN1YnN0cmluZywgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdGVsbCB3aGljaCBvZiBhCiAgICBudW1iZXIgb2YgaWRlbnRpY2FsIHN1YnN0cmluZ3MgaGFzIGJlZW4gY2FwdHVyZWQuCgoyNC4gVGhlIHdheSBhdG9taWMgZ3JvdXBzIGFyZSBwcm9jZXNzZWQgYnkgcGNyZV9leGVjKCkgaGFzIGJlZW4gY2hhbmdlZCBzbyB0aGF0CiAgICBpZiB0aGV5IGFyZSByZXBlYXRlZCwgYmFja3RyYWNraW5nIG9uZSByZXBldGl0aW9uIG5vdyByZXNldHMgY2FwdHVyZWQKICAgIHZhbHVlcyBjb3JyZWN0bHkuIEZvciBleGFtcGxlLCBpZiAoKD8+KGErKWIpK2FhYmFiKSBpcyBtYXRjaGVkIGFnYWluc3QKICAgICJhYWFhYmFhYWJhYWJhYiIgdGhlIHZhbHVlIG9mIGNhcHR1cmVkIGdyb3VwIDIgaXMgbm93IGNvcnJlY3RseSByZWNvcmRlZCBhcwogICAgImFhYSIuIFByZXZpb3VzbHksIGl0IHdvdWxkIGhhdmUgYmVlbiAiYSIuIEFzIHBhcnQgb2YgdGhpcyBjb2RlCiAgICByZWZhY3RvcmluZywgdGhlIHdheSByZWN1cnNpdmUgY2FsbHMgYXJlIGhhbmRsZWQgaGFzIGFsc28gYmVlbiBjaGFuZ2VkLgoKMjUuIElmIGFuIGFzc2VydGlvbiBjb25kaXRpb24gY2FwdHVyZWQgYW55IHN1YnN0cmluZ3MsIHRoZXkgd2VyZSBub3QgcGFzc2VkCiAgICBiYWNrIHVubGVzcyBzb21lIG90aGVyIGNhcHR1cmluZyBoYXBwZW5lZCBsYXRlci4gRm9yIGV4YW1wbGUsIGlmCiAgICAoPyg/PShhKSlhKSB3YXMgbWF0Y2hlZCBhZ2FpbnN0ICJhIiwgbm8gY2FwdHVyaW5nIHdhcyByZXR1cm5lZC4KCjI2LiBXaGVuIHN0dWR5aW5nIGEgcGF0dGVybiB0aGF0IGNvbnRhaW5lZCBzdWJyb3V0aW5lIGNhbGxzIG9yIGFzc2VydGlvbnMsCiAgICB0aGUgY29kZSBmb3IgZmluZGluZyB0aGUgbWluaW11bSBsZW5ndGggb2YgYSBwb3NzaWJsZSBtYXRjaCB3YXMgaGFuZGxpbmcKICAgIGRpcmVjdCByZWN1cnNpb25zIHN1Y2ggYXMgKHh4eCg/MSl8eXl5KSBidXQgbm90IG11dHVhbCByZWN1cnNpb25zICh3aGVyZQogICAgZ3JvdXAgMSBjYWxsZWQgZ3JvdXAgMiB3aGlsZSBzaW11bHRhbmVvdXNseSBhIHNlcGFyYXRlIGdyb3VwIDIgY2FsbGVkIGdyb3VwCiAgICAxKS4gQSBzdGFjayBvdmVyZmxvdyBvY2N1cnJlZCBpbiB0aGlzIGNhc2UuIEkgaGF2ZSBmaXhlZCB0aGlzIGJ5IGxpbWl0aW5nCiAgICB0aGUgcmVjdXJzaW9uIGRlcHRoIHRvIDEwLgoKMjcuIFVwZGF0ZWQgUnVuVGVzdC5iYXQgaW4gdGhlIGRpc3RyaWJ1dGlvbiB0byB0aGUgdmVyc2lvbiBzdXBwbGllZCBieSBUb20KICAgIEZvcnRtYW5uLiBUaGlzIHN1cHBvcnRzIGV4cGxpY2l0IHRlc3QgbnVtYmVycyBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgaGFzCiAgICBhcmd1bWVudCB2YWxpZGF0aW9uIGFuZCBlcnJvciByZXBvcnRpbmcuCgoyOC4gQW4gaW5zdGFuY2Ugb2YgXFggd2l0aCBhbiB1bmxpbWl0ZWQgcmVwZWF0IGNvdWxkIGZhaWwgaWYgYXQgYW55IHBvaW50IHRoZQogICAgZmlyc3QgY2hhcmFjdGVyIGl0IGxvb2tlZCBhdCB3YXMgYSBtYXJrIGNoYXJhY3Rlci4KCjI5LiBTb21lIG1pbm9yIGNvZGUgcmVmYWN0b3JpbmcgY29uY2VybmluZyBVbmljb2RlIHByb3BlcnRpZXMgYW5kIHNjcmlwdHMKICAgIHNob3VsZCByZWR1Y2UgdGhlIHN0YWNrIHJlcXVpcmVtZW50IG9mIG1hdGNoKCkgc2xpZ2h0bHkuCgozMC4gQWRkZWQgdGhlICc9JyBvcHRpb24gdG8gcGNyZXRlc3QgdG8gY2hlY2sgdGhlIHNldHRpbmcgb2YgdW51c2VkIGNhcHR1cmluZwogICAgc2xvdHMgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiwgd2hpY2ggYXJlIGRvY3VtZW50ZWQgYXMgYmVpbmcgLTEsIGJ1dCBhcmUKICAgIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuIGNvdW50LgoKMzEuIElmIFxrIHdhcyBub3QgZm9sbG93ZWQgYnkgYSBicmFjZWQsIGFuZ2xlLWJyYWNrZXRlZCwgb3IgcXVvdGVkIG5hbWUsIFBDUkUKICAgIGNvbXBpbGVkIHNvbWV0aGluZyByYW5kb20uIE5vdyBpdCBnaXZlcyBhIGNvbXBpbGUtdGltZSBlcnJvciAoYXMgZG9lcwogICAgUGVybCkuCgozMi4gQSAqTUFSSyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgYSBwb3NpdGl2ZSBhc3NlcnRpb24gaXMgbm93CiAgICByZWNvcmRlZCBhbmQgcGFzc2VkIGJhY2sgKGNvbXBhdGlibGUgd2l0aCBQZXJsKS4KCjMzLiBJZiAtLW9ubHktbWF0Y2hpbmcgb3IgLS1jb2xvdXIgd2FzIHNldCBvbiBhIHBjcmVncmVwIGNhbGwgd2hvc2UgcGF0dGVybgogICAgaGFkIGFsdGVybmF0aXZlIGFuY2hvcmVkIGJyYW5jaGVzLCB0aGUgc2VhcmNoIGZvciBhIHNlY29uZCBtYXRjaCBpbiBhIGxpbmUKICAgIHdhcyBkb25lIGFzIGlmIGF0IHRoZSBsaW5lIHN0YXJ0LiBUaHVzLCBmb3IgZXhhbXBsZSwgL14wMXxeMDIvIGluY29ycmVjdGx5CiAgICBtYXRjaGVkIHRoZSBsaW5lICIwMTAyIiB0d2ljZS4gVGhlIHNhbWUgYnVnIGFmZmVjdGVkIHBhdHRlcm5zIHRoYXQgc3RhcnRlZAogICAgd2l0aCBhIGJhY2t3YXJkcyBhc3NlcnRpb24uIEZvciBleGFtcGxlIC9cYjAxfFxiMDIvIGFsc28gbWF0Y2hlZCAiMDEwMiIKICAgIHR3aWNlLgoKMzQuIFByZXZpb3VzbHksIFBDUkUgZGlkIG5vdCBhbGxvdyBxdWFudGlmaWNhdGlvbiBvZiBhc3NlcnRpb25zLiBIb3dldmVyLCBQZXJsCiAgICBkb2VzLCBhbmQgYmVjYXVzZSBvZiBjYXB0dXJpbmcgZWZmZWN0cywgcXVhbnRpZnlpbmcgcGFyZW50aGVzaXplZAogICAgYXNzZXJ0aW9ucyBtYXkgYXQgdGltZXMgYmUgdXNlZnVsLiBRdWFudGlmaWVycyBhcmUgbm93IGFsbG93ZWQgZm9yCiAgICBwYXJlbnRoZXNpemVkIGFzc2VydGlvbnMuCgozNS4gQSBtaW5vciBjb2RlIHRpZHkgaW4gcGNyZV9jb21waWxlKCkgd2hlbiBjaGVja2luZyBvcHRpb25zIGZvciBcUiB1c2FnZS4KCjM2LiBcZyB3YXMgYmVpbmcgY2hlY2tlZCBmb3IgZmFuY3kgdGhpbmdzIGluIGEgY2hhcmFjdGVyIGNsYXNzLCB3aGVuIGl0IHNob3VsZAogICAganVzdCBiZSBhIGxpdGVyYWwgImciLgoKMzcuIFBDUkUgd2FzIHJlamVjdGluZyBbOmFbOmRpZ2l0Ol1dIHdoZXJlYXMgUGVybCB3YXMgbm90LiBJdCBzZWVtcyB0aGF0IHRoZQogICAgYXBwZWFyYW5jZSBvZiBhIG5lc3RlZCBQT1NJWCBjbGFzcyBzdXBlcnNlZGVzIGFuIGFwcGFyZW50IGV4dGVybmFsIGNsYXNzLgogICAgRm9yIGV4YW1wbGUsIFs6YVs6ZGlnaXQ6XWI6XSBtYXRjaGVzICJhIiwgImIiLCAiOiIsIG9yIGEgZGlnaXQuIEFsc28sCiAgICB1bmVzY2FwZWQgc3F1YXJlIGJyYWNrZXRzIG1heSBhbHNvIGFwcGVhciBhcyBwYXJ0IG9mIGNsYXNzIG5hbWVzLiBGb3IKICAgIGV4YW1wbGUsIFs6YVs6YWJjXWI6XSBnaXZlcyB1bmtub3duIGNsYXNzICJbOmFiY11iOl0iLiBQQ1JFIG5vdyBiZWhhdmVzCiAgICBtb3JlIGxpa2UgUGVybC4gKEJ1dCBzZWUgOC4yMC8xIGFib3ZlLikKCjM4LiBQQ1JFIHdhcyBnaXZpbmcgYW4gZXJyb3IgZm9yIFxOIHdpdGggYSBicmFjZWQgcXVhbnRpZmllciBzdWNoIGFzIHsxLH0gKHRoaXMKICAgIHdhcyBiZWNhdXNlIGl0IHRob3VnaHQgaXQgd2FzIFxOe25hbWV9LCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkKS4KCjM5LiBBZGQgbWluaXggdG8gT1MgbGlzdCBub3Qgc3VwcG9ydGluZyB0aGUgLVMgb3B0aW9uIGluIHBjcmV0ZXN0LgoKNDAuIFBDUkUgdHJpZXMgdG8gZGV0ZWN0IGNhc2VzIG9mIGluZmluaXRlIHJlY3Vyc2lvbiBhdCBjb21waWxlIHRpbWUsIGJ1dCBpdAogICAgY2Fubm90IGFuYWx5emUgcGF0dGVybnMgaW4gc3VmZmljaWVudCBkZXRhaWwgdG8gY2F0Y2ggbXV0dWFsIHJlY3Vyc2lvbnMKICAgIHN1Y2ggYXMgKCg/MSkpKCg/MikpLiBUaGVyZSBpcyBub3cgYSBydW50aW1lIHRlc3QgdGhhdCBnaXZlcyBhbiBlcnJvciBpZiBhCiAgICBzdWJncm91cCBpcyBjYWxsZWQgcmVjdXJzaXZlbHkgYXMgYSBzdWJwYXR0ZXJuIGZvciBhIHNlY29uZCB0aW1lIGF0IHRoZQogICAgc2FtZSBwb3NpdGlvbiBpbiB0aGUgc3ViamVjdCBzdHJpbmcuIEluIHByZXZpb3VzIHJlbGVhc2VzIHRoaXMgbWlnaHQgaGF2ZQogICAgYmVlbiBjYXVnaHQgYnkgdGhlIHJlY3Vyc2lvbiBsaW1pdCwgb3IgaXQgbWlnaHQgaGF2ZSBydW4gb3V0IG9mIHN0YWNrLgoKNDEuIEEgcGF0dGVybiBzdWNoIGFzIC8oPyhSKWErfCg/UiliKS8gaXMgcXVpdGUgc2FmZSwgYXMgdGhlIHJlY3Vyc2lvbiBjYW4KICAgIGhhcHBlbiBvbmx5IG9uY2UuIFBDUkUgd2FzLCBob3dldmVyIGluY29ycmVjdGx5IGdpdmluZyBhIGNvbXBpbGUgdGltZSBlcnJvcgogICAgInJlY3Vyc2l2ZSBjYWxsIGNvdWxkIGxvb3AgaW5kZWZpbml0ZWx5IiBiZWNhdXNlIGl0IGNhbm5vdCBhbmFseXplIHRoZQogICAgcGF0dGVybiBpbiBzdWZmaWNpZW50IGRldGFpbC4gVGhlIGNvbXBpbGUgdGltZSB0ZXN0IG5vIGxvbmdlciBoYXBwZW5zIHdoZW4KICAgIFBDUkUgaXMgY29tcGlsaW5nIGEgY29uZGl0aW9uYWwgc3VicGF0dGVybiwgYnV0IGFjdHVhbCBydW5hd2F5IGxvb3BzIGFyZQogICAgbm93IGNhdWdodCBhdCBydW50aW1lIChzZWUgNDAgYWJvdmUpLgoKNDIuIEl0IHNlZW1zIHRoYXQgUGVybCBhbGxvd3MgYW55IGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBhIGNsb3NpbmcgcGFyZW50aGVzaXMKICAgIHRvIGJlIHBhcnQgb2YgdGhlIE5BTUUgaW4gKCpNQVJLOk5BTUUpIGFuZCBvdGhlciBiYWNrdHJhY2tpbmcgdmVyYnMuIFBDUkUKICAgIGhhcyBiZWVuIGNoYW5nZWQgdG8gYmUgdGhlIHNhbWUuCgo0My4gVXBkYXRlZCBjb25maWd1cmUuYWMgdG8gcHV0IGluIG1vcmUgcXVvdGluZyByb3VuZCBBQ19MQU5HX1BST0dSQU0gZXRjLiBzbwogICAgYXMgbm90IHRvIGdldCB3YXJuaW5ncyB3aGVuIGF1dG9nZW4uc2ggaXMgY2FsbGVkLiBBbHNvIGNoYW5nZWQKICAgIEFDX1BST0dfTElCVE9PTCAoZGVwcmVjYXRlZCkgdG8gTFRfSU5JVCAodGhlIGN1cnJlbnQgbWFjcm8pLgoKNDQuIFRvIGhlbHAgcGVvcGxlIHdobyB1c2UgcGNyZWdyZXAgdG8gc2NhbiBmaWxlcyBjb250YWluaW5nIGV4Y2VlZGluZ2x5IGxvbmcKICAgIGxpbmVzLCB0aGUgZm9sbG93aW5nIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGU6CgogICAgKGEpIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBidWZmZXIgc2l6ZSBwYXJhbWV0ZXIgaGFzIGJlZW4gaW5jcmVhc2VkIGZyb20KICAgICAgICA4SyB0byAyMEsuIChUaGUgYWN0dWFsIGJ1ZmZlciB1c2VkIGlzIHRocmVlIHRpbWVzIHRoaXMgc2l6ZS4pCgogICAgKGIpIFRoZSBkZWZhdWx0IGNhbiBiZSBjaGFuZ2VkIGJ5IC4vY29uZmlndXJlIC0td2l0aC1wY3JlZ3JlcC1idWZzaXplIHdoZW4KICAgICAgICBQQ1JFIGlzIGJ1aWx0LgoKICAgIChjKSBBIC0tYnVmZmVyLXNpemU9biBvcHRpb24gaGFzIGJlZW4gYWRkZWQgdG8gcGNyZWdyZXAsIHRvIGFsbG93IHRoZSBzaXplCiAgICAgICAgdG8gYmUgc2V0IGF0IHJ1biB0aW1lLgoKICAgIChkKSBOdW1lcmljYWwgdmFsdWVzIGluIHBjcmVncmVwIG9wdGlvbnMgY2FuIGJlIGZvbGxvd2VkIGJ5IEsgb3IgTSwgZm9yCiAgICAgICAgZXhhbXBsZSAtLWJ1ZmZlci1zaXplPTUwSy4KCiAgICAoZSkgSWYgYSBsaW5lIGJlaW5nIHNjYW5uZWQgb3ZlcmZsb3dzIHBjcmVncmVwJ3MgYnVmZmVyLCBhbiBlcnJvciBpcyBub3cKICAgICAgICBnaXZlbiBhbmQgdGhlIHJldHVybiBjb2RlIGlzIHNldCB0byAyLgoKNDUuIEFkZCBhIHBvaW50ZXIgdG8gdGhlIGxhdGVzdCBtYXJrIHRvIHRoZSBjYWxsb3V0IGRhdGEgYmxvY2suCgo0Ni4gVGhlIHBhdHRlcm4gLy4oKkYpLywgd2hlbiBhcHBsaWVkIHRvICJhYmMiIHdpdGggUENSRV9QQVJUSUFMX0hBUkQsIGdhdmUgYQogICAgcGFydGlhbCBtYXRjaCBvZiBhbiBlbXB0eSBzdHJpbmcgaW5zdGVhZCBvZiBubyBtYXRjaC4gVGhpcyB3YXMgc3BlY2lmaWMgdG8KICAgIHRoZSB1c2Ugb2YgIi4iLgoKNDcuIFRoZSBwYXR0ZXJuIC9mLiovOHMsIHdoZW4gYXBwbGllZCB0byAiZm9yIiB3aXRoIFBDUkVfUEFSVElBTF9IQVJELCBnYXZlIGEKICAgIGNvbXBsZXRlIG1hdGNoIGluc3RlYWQgb2YgYSBwYXJ0aWFsIG1hdGNoLiBUaGlzIGJ1ZyB3YXMgZGVwZW5kZW50IG9uIGJvdGgKICAgIHRoZSBQQ1JFX1VURjggYW5kIFBDUkVfRE9UQUxMIG9wdGlvbnMgYmVpbmcgc2V0LgoKNDguIEZvciBhIHBhdHRlcm4gc3VjaCBhcyAvXGJhYmN8XGJkZWYvIHBjcmVfc3R1ZHkoKSB3YXMgZmFpbGluZyB0byBzZXQgdXAgdGhlCiAgICBzdGFydGluZyBieXRlIHNldCwgYmVjYXVzZSBcYiB3YXMgbm90IGJlaW5nIGlnbm9yZWQuCgoKVmVyc2lvbiA4LjEyIDE1LUphbi0yMDExCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gIEZpeGVkIHNvbWUgdHlwb3MgaW4gdGhlIG1hcmt1cCBvZiB0aGUgbWFuIHBhZ2VzLCBhbmQgd3JvdGUgYSBzY3JpcHQgdGhhdAogICAgY2hlY2tzIGZvciBzdWNoIHRoaW5ncyBhcyBwYXJ0IG9mIHRoZSBkb2N1bWVudGF0aW9uIGJ1aWxkaW5nIHByb2Nlc3MuCgoyLiAgT24gYSBiaWctZW5kaWFuIDY0LWJpdCBzeXN0ZW0sIHBjcmVncmVwIGRpZCBub3QgY29ycmVjdGx5IHByb2Nlc3MgdGhlCiAgICAtLW1hdGNoLWxpbWl0IGFuZCAtLXJlY3Vyc2lvbi1saW1pdCBvcHRpb25zIChhZGRlZCBmb3IgOC4xMSkuIEluCiAgICBwYXJ0aWN1bGFyLCB0aGlzIG1hZGUgb25lIG9mIHRoZSBzdGFuZGFyZCB0ZXN0cyBmYWlsLiAoVGhlIGludGVnZXIgdmFsdWUKICAgIHdlbnQgaW50byB0aGUgd3JvbmcgaGFsZiBvZiBhIGxvbmcgaW50LikKCjMuICBJZiB0aGUgLS1jb2xvdXIgb3B0aW9uIHdhcyBnaXZlbiB0byBwY3JlZ3JlcCB3aXRoIC12IChpbnZlcnQgbWF0Y2gpLCBpdAogICAgZGlkIHN0cmFuZ2UgdGhpbmdzLCBlaXRoZXIgcHJvZHVjaW5nIGNyYXp5IG91dHB1dCwgb3IgY3Jhc2hpbmcuIEl0IHNob3VsZCwKICAgIG9mIGNvdXJzZSwgaWdub3JlIGEgcmVxdWVzdCBmb3IgY29sb3VyIHdoZW4gcmVwb3J0aW5nIGxpbmVzIHRoYXQgZG8gbm90CiAgICBtYXRjaC4KCjQuICBBbm90aGVyIHBjcmVncmVwIGJ1ZyBjYXVzZWQgc2ltaWxhciBwcm9ibGVtcyBpZiAtLWNvbG91ciB3YXMgc3BlY2lmaWVkIHdpdGgKICAgIC1NIChtdWx0aWxpbmUpIGFuZCB0aGUgcGF0dGVybiBtYXRjaCBmaW5pc2hlZCB3aXRoIGEgbGluZSBlbmRpbmcuCgo1LiAgSW4gcGNyZWdyZXAsIHdoZW4gYSBwYXR0ZXJuIHRoYXQgZW5kZWQgd2l0aCBhIGxpdGVyYWwgbmV3bGluZSBzZXF1ZW5jZSB3YXMKICAgIG1hdGNoZWQgaW4gbXVsdGlsaW5lIG1vZGUsIHRoZSBmb2xsb3dpbmcgbGluZSB3YXMgc2hvd24gYXMgcGFydCBvZiB0aGUKICAgIG1hdGNoLiBUaGlzIHNlZW1zIHdyb25nLCBzbyBJIGhhdmUgY2hhbmdlZCBpdC4KCjYuICBBbm90aGVyIHBjcmVncmVwIGJ1ZyBpbiBtdWx0aWxpbmUgbW9kZSwgd2hlbiAtLWNvbG91ciB3YXMgc3BlY2lmaWVkLCBjYXVzZWQKICAgIHRoZSBjaGVjayBmb3IgZnVydGhlciBtYXRjaGVzIGluIHRoZSBzYW1lIGxpbmUgKHNvIHRoZXkgY291bGQgYmUgY29sb3VyZWQpCiAgICB0byBvdmVycnVuIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZS4gSWYgYW5vdGhlciBtYXRjaCB3YXMgZm91bmQsIGl0IHdhcwogICAgaW5jb3JyZWN0bHkgc2hvd24gKGFuZCB0aGVuIHNob3duIGFnYWluIHdoZW4gZm91bmQgaW4gdGhlIG5leHQgbGluZSkuCgo3LiAgSWYgcGNyZWdyZXAgd2FzIGNvbXBpbGVkIHVuZGVyIFdpbmRvd3MsIHRoZXJlIHdhcyBhIHJlZmVyZW5jZSB0byB0aGUKICAgIGZ1bmN0aW9uIHBjcmVncmVwX2V4aXQoKSBiZWZvcmUgaXQgd2FzIGRlZmluZWQuIEkgYW0gYXNzdW1pbmcgdGhpcyB3YXMKICAgIHRoZSBjYXVzZSBvZiB0aGUgImVycm9yIEMyMzcxOiAncGNyZWdyZXBfZXhpdCcgOiByZWRlZmluaXRpb247IiB0aGF0IHdhcwogICAgcmVwb3J0ZWQgYnkgYSB1c2VyLiBJJ3ZlIG1vdmVkIHRoZSBkZWZpbml0aW9uIGFib3ZlIHRoZSByZWZlcmVuY2UuCgoKVmVyc2lvbiA4LjExIDEwLURlYy0yMDEwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gICgqVEhFTikgd2FzIG5vdCB3b3JraW5nIHByb3Blcmx5IGlmIHRoZXJlIHdlcmUgdW50cmllZCBhbHRlcm5hdGl2ZXMgcHJpb3IKICAgIHRvIGl0IGluIHRoZSBjdXJyZW50IGJyYW5jaC4gRm9yIGV4YW1wbGUsIGluICgoYXxiKSgqVEhFTikoKkYpfGMuLikgaXQKICAgIGJhY2t0cmFja2VkIHRvIHRyeSBmb3IgImIiIGluc3RlYWQgb2YgbW92aW5nIHRvIHRoZSBuZXh0IGFsdGVybmF0aXZlIGJyYW5jaAogICAgYXQgdGhlIHNhbWUgbGV2ZWwgKGluIHRoaXMgY2FzZSwgdG8gbG9vayBmb3IgImMiKS4gVGhlIFBlcmwgZG9jdW1lbnRhdGlvbgogICAgaXMgY2xlYXIgdGhhdCB3aGVuICgqVEhFTikgaXMgYmFja3RyYWNrZWQgb250bywgaXQgZ29lcyB0byB0aGUgIm5leHQKICAgIGFsdGVybmF0aXZlIGluIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIGdyb3VwIi4KCjIuICAoKkNPTU1JVCkgd2FzIG5vdCBvdmVycmlkaW5nICgqVEhFTiksIGFzIGl0IGRvZXMgaW4gUGVybC4gSW4gYSBwYXR0ZXJuCiAgICBzdWNoIGFzICAgKEEoKkNPTU1JVClCKCpUSEVOKUN8RCkgIGFueSBmYWlsdXJlIGFmdGVyIG1hdGNoaW5nIEEgc2hvdWxkCiAgICByZXN1bHQgaW4gb3ZlcmFsbCBmYWlsdXJlLiBTaW1pbGFybHksICgqQ09NTUlUKSBub3cgb3ZlcnJpZGVzICgqUFJVTkUpIGFuZAogICAgKCpTS0lQKSwgKCpTS0lQKSBvdmVycmlkZXMgKCpQUlVORSkgYW5kICgqVEhFTiksIGFuZCAoKlBSVU5FKSBvdmVycmlkZXMKICAgICgqVEhFTikuCgozLiAgSWYgXHMgYXBwZWFyZWQgaW4gYSBjaGFyYWN0ZXIgY2xhc3MsIGl0IHJlbW92ZWQgdGhlIFZUIGNoYXJhY3RlciBmcm9tCiAgICB0aGUgY2xhc3MsIGV2ZW4gaWYgaXQgaGFkIGJlZW4gaW5jbHVkZWQgYnkgc29tZSBwcmV2aW91cyBpdGVtLCBmb3IgZXhhbXBsZQogICAgaW4gW1x4MDAtXHhmZlxzXS4gKFRoaXMgd2FzIGEgYnVnIHJlbGF0ZWQgdG8gdGhlIGZhY3QgdGhhdCBWVCBpcyBub3QgcGFydAogICAgb2YgXHMsIGJ1dCBpcyBwYXJ0IG9mIHRoZSBQT1NJWCAic3BhY2UiIGNsYXNzLikKCjQuICBBIHBhcnRpYWwgbWF0Y2ggbmV2ZXIgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgKGJlY2F1c2UgeW91IGNhbiBhbHdheXMKICAgIG1hdGNoIGFuIGVtcHR5IHN0cmluZyBhdCB0aGUgZW5kIG9mIHRoZSBzdWJqZWN0KTsgaG93ZXZlciB0aGUgY2hlY2tpbmcgZm9yCiAgICBhbiBlbXB0eSBzdHJpbmcgd2FzIHN0YXJ0aW5nIGF0IHRoZSAic3RhcnQgb2YgbWF0Y2giIHBvaW50LiBUaGlzIGhhcyBiZWVuCiAgICBjaGFuZ2VkIHRvIHRoZSAiZWFybGllc3QgaW5zcGVjdGVkIGNoYXJhY3RlciIgcG9pbnQsIGJlY2F1c2UgdGhlIHJldHVybmVkCiAgICBkYXRhIGZvciBhIHBhcnRpYWwgbWF0Y2ggc3RhcnRzIGF0IHRoaXMgY2hhcmFjdGVyLiBUaGlzIG1lYW5zIHRoYXQsIGZvcgogICAgZXhhbXBsZSwgLyg/PD1hYmMpZGVmLyBnaXZlcyBhIHBhcnRpYWwgbWF0Y2ggZm9yIHRoZSBzdWJqZWN0ICJhYmMiCiAgICAocHJldmlvdXNseSBpdCBnYXZlICJubyBtYXRjaCIpLgoKNS4gIENoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIHdheSBQQ1JFX1BBUlRJQUxfSEFSRCBhZmZlY3RzIHRoZSBtYXRjaGluZwogICAgb2YgJCwgXHosIFxaLCBcYiwgYW5kIFxCLiBJZiB0aGUgbWF0Y2ggcG9pbnQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLAogICAgcHJldmlvdXNseSBhIGZ1bGwgbWF0Y2ggd291bGQgYmUgZ2l2ZW4uIEhvd2V2ZXIsIHNldHRpbmcgUENSRV9QQVJUSUFMX0hBUkQKICAgIGhhcyBhbiBpbXBsaWNhdGlvbiB0aGF0IHRoZSBnaXZlbiBzdHJpbmcgaXMgaW5jb21wbGV0ZSAoYmVjYXVzZSBhIHBhcnRpYWwKICAgIG1hdGNoIGlzIHByZWZlcnJlZCBvdmVyIGEgZnVsbCBtYXRjaCkuIEZvciB0aGlzIHJlYXNvbiwgdGhlc2UgaXRlbXMgbm93CiAgICBnaXZlIGEgcGFydGlhbCBtYXRjaCBpbiB0aGlzIHNpdHVhdGlvbi4gW0FzaWRlOiBwcmV2aW91c2x5LCB0aGUgb25lIGNhc2UKICAgIC90XGIvIG1hdGNoZWQgYWdhaW5zdCAiY2F0IiB3aXRoIFBDUkVfUEFSVElBTF9IQVJEIHNldCBkaWQgcmV0dXJuIGEgcGFydGlhbAogICAgbWF0Y2ggcmF0aGVyIHRoYW4gYSBmdWxsIG1hdGNoLCB3aGljaCB3YXMgd3JvbmcgYnkgdGhlIG9sZCBydWxlcywgYnV0IGlzCiAgICBub3cgY29ycmVjdC5dCgo2LiAgVGhlcmUgd2FzIGEgYnVnIGluIHRoZSBoYW5kbGluZyBvZiAjLWludHJvZHVjZWQgY29tbWVudHMsIHJlY29nbml6ZWQgd2hlbgogICAgUENSRV9FWFRFTkRFRCBpcyBzZXQsIHdoZW4gUENSRV9ORVdMSU5FX0FOWSBhbmQgUENSRV9VVEY4IHdlcmUgYWxzbyBzZXQuCiAgICBJZiBhIFVURi04IG11bHRpLWJ5dGUgY2hhcmFjdGVyIGluY2x1ZGVkIHRoZSBieXRlIDB4ODUgKGUuZy4gK1UwNDQ1LCB3aG9zZQogICAgVVRGLTggZW5jb2RpbmcgaXMgMHhkMSwweDg1KSwgdGhpcyB3YXMgbWlzaW50ZXJwcmV0ZWQgYXMgYSBuZXdsaW5lIHdoZW4KICAgIHNjYW5uaW5nIGZvciB0aGUgZW5kIG9mIHRoZSBjb21tZW50LiAoKkNoYXJhY3RlciogMHg4NSBpcyBhbiAiYW55IiBuZXdsaW5lLAogICAgYnV0ICpieXRlKiAweDg1IGlzIG5vdCwgaW4gVVRGLTggbW9kZSkuIFRoaXMgYnVnIHdhcyBwcmVzZW50IGluIHNldmVyYWwKICAgIHBsYWNlcyBpbiBwY3JlX2NvbXBpbGUoKS4KCjcuICBSZWxhdGVkIHRvICg2KSBhYm92ZSwgd2hlbiBwY3JlX2NvbXBpbGUoKSB3YXMgc2tpcHBpbmcgIy1pbnRyb2R1Y2VkCiAgICBjb21tZW50cyB3aGVuIGxvb2tpbmcgYWhlYWQgZm9yIG5hbWVkIGZvcndhcmQgcmVmZXJlbmNlcyB0byBzdWJwYXR0ZXJucywKICAgIHRoZSBvbmx5IG5ld2xpbmUgc2VxdWVuY2UgaXQgcmVjb2duaXplZCB3YXMgTkwuIEl0IG5vdyBoYW5kbGVzIG5ld2xpbmVzCiAgICBhY2NvcmRpbmcgdG8gdGhlIHNldCBuZXdsaW5lIGNvbnZlbnRpb24uCgo4LiAgU3VuT1M0IGRvZXNuJ3QgaGF2ZSBzdHJlcnJvcigpIG9yIHN0cnRvdWwoKTsgcGNyZWdyZXAgZGVhbHQgd2l0aCB0aGUKICAgIGZvcm1lciwgYnV0IHVzZWQgc3RydG91bCgpLCB3aGVyZWFzIHBjcmV0ZXN0IGF2b2lkZWQgc3RydG91bCgpIGJ1dCBkaWQgbm90CiAgICBjYXRlciBmb3IgYSBsYWNrIG9mIHN0cmVycm9yKCkuIFRoZXNlIG92ZXJzaWdodHMgaGF2ZSBiZWVuIGZpeGVkLgoKOS4gIEFkZGVkIC0tbWF0Y2gtbGltaXQgYW5kIC0tcmVjdXJzaW9uLWxpbWl0IHRvIHBjcmVncmVwLgoKMTAuIEFkZGVkIHR3byBjYXN0cyBuZWVkZWQgdG8gYnVpbGQgd2l0aCBWaXN1YWwgU3R1ZGlvIHdoZW4gTk9fUkVDVVJTRSBpcyBzZXQuCgoxMS4gV2hlbiB0aGUgLW8gb3B0aW9uIHdhcyB1c2VkLCBwY3JlZ3JlcCB3YXMgc2V0dGluZyBhIHJldHVybiBjb2RlIG9mIDEsIGV2ZW4KICAgIHdoZW4gbWF0Y2hlcyB3ZXJlIGZvdW5kLCBhbmQgLS1saW5lLWJ1ZmZlcmVkIHdhcyBub3QgYmVpbmcgaG9ub3VyZWQuCgoxMi4gQWRkZWQgYW4gb3B0aW9uYWwgcGFyZW50aGVzZXMgbnVtYmVyIHRvIHRoZSAtbyBhbmQgLS1vbmx5LW1hdGNoaW5nIG9wdGlvbnMKICAgIG9mIHBjcmVncmVwLgoKMTMuIEltaXRhdGluZyBQZXJsJ3MgL2cgYWN0aW9uIGZvciBtdWx0aXBsZSBtYXRjaGVzIGlzIHRyaWNreSB3aGVuIHRoZSBwYXR0ZXJuCiAgICBjYW4gbWF0Y2ggYW4gZW1wdHkgc3RyaW5nLiBUaGUgY29kZSB0byBkbyBpdCBpbiBwY3JldGVzdCBhbmQgcGNyZWRlbW8KICAgIG5lZWRlZCBmaXhpbmc6CgogICAgKGEpIFdoZW4gdGhlIG5ld2xpbmUgY29udmVudGlvbiB3YXMgImNybGYiLCBwY3JldGVzdCBnb3QgaXQgd3JvbmcsIHNraXBwaW5nCiAgICAgICAgb25seSBvbmUgYnl0ZSBhZnRlciBhbiBlbXB0eSBzdHJpbmcgbWF0Y2gganVzdCBiZWZvcmUgQ1JMRiAodGhpcyBjYXNlCiAgICAgICAganVzdCBnb3QgZm9yZ290dGVuOyAiYW55IiBhbmQgImFueWNybGYiIHdlcmUgT0spLgoKICAgIChiKSBUaGUgcGNyZXRlc3QgY29kZSBhbHNvIGhhZCBhIGJ1ZywgY2F1c2luZyBpdCB0byBsb29wIGZvcmV2ZXIgaW4gVVRGLTgKICAgICAgICBtb2RlIHdoZW4gYW4gZW1wdHkgc3RyaW5nIG1hdGNoIHByZWNlZGVkIGFuIEFTQ0lJIGNoYXJhY3RlciBmb2xsb3dlZCBieQogICAgICAgIGEgbm9uLUFTQ0lJIGNoYXJhY3Rlci4gKFRoZSBjb2RlIGZvciBhZHZhbmNpbmcgYnkgb25lIGNoYXJhY3RlciByYXRoZXIKICAgICAgICB0aGFuIG9uZSBieXRlIHdhcyBub25zZW5zZS4pCgogICAgKGMpIFRoZSBwY3JlZGVtby5jIHNhbXBsZSBwcm9ncmFtIGRpZCBub3QgaGF2ZSBhbnkgY29kZSBhdCBhbGwgdG8gaGFuZGxlCiAgICAgICAgdGhlIGNhc2VzIHdoZW4gQ1JMRiBpcyBhIHZhbGlkIG5ld2xpbmUgc2VxdWVuY2UuCgoxNC4gTmVpdGhlciBwY3JlX2V4ZWMoKSBub3IgcGNyZV9kZmFfZXhlYygpIHdhcyBjaGVja2luZyB0aGF0IHRoZSB2YWx1ZSBnaXZlbgogICAgYXMgYSBzdGFydGluZyBvZmZzZXQgd2FzIHdpdGhpbiB0aGUgc3ViamVjdCBzdHJpbmcuIFRoZXJlIGlzIG5vdyBhIG5ldwogICAgZXJyb3IsIFBDUkVfRVJST1JfQkFET0ZGU0VULCB3aGljaCBpcyByZXR1cm5lZCBpZiB0aGUgc3RhcnRpbmcgb2Zmc2V0IGlzCiAgICBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiBJbiBvcmRlciB0byB0ZXN0IHRoaXMsCiAgICBwY3JldGVzdCBpcyBleHRlbmRlZCB0byBhbGxvdyB0aGUgc2V0dGluZyBvZiBuZWdhdGl2ZSBzdGFydGluZyBvZmZzZXRzLgoKMTUuIEluIGJvdGggcGNyZV9leGVjKCkgYW5kIHBjcmVfZGZhX2V4ZWMoKSB0aGUgY29kZSBmb3IgY2hlY2tpbmcgdGhhdCB0aGUKICAgIHN0YXJ0aW5nIG9mZnNldCBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiBhIFVURi04IGNoYXJhY3RlciB3YXMKICAgIHVubmVjZXNzYXJpbHkgY2x1bXN5LiBJIHRpZGllZCBpdCB1cC4KCjE2LiBBZGRlZCBQQ1JFX0VSUk9SX1NIT1JUVVRGOCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYQogICAgYmFkIFVURi04IHNlcXVlbmNlIGFuZCBvbmUgdGhhdCBpcyBpbmNvbXBsZXRlIHdoZW4gdXNpbmcgUENSRV9QQVJUSUFMX0hBUkQuCgoxNy4gTm9ib2R5IGhhZCByZXBvcnRlZCB0aGF0IHRoZSAtLWluY2x1ZGVfZGlyIG9wdGlvbiwgd2hpY2ggd2FzIGFkZGVkIGluCiAgICByZWxlYXNlIDcuNyBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCAtLWluY2x1ZGUtZGlyIChoeXBoZW4sIG5vdCB1bmRlcnNjb3JlKQogICAgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBHTlUgZ3JlcC4gSSBoYXZlIGNoYW5nZWQgaXQgdG8gLS1pbmNsdWRlLWRpciwgYnV0CiAgICBsZWZ0IC0taW5jbHVkZV9kaXIgYXMgYW4gdW5kb2N1bWVudGVkIHN5bm9ueW0sIGFuZCB0aGUgc2FtZSBmb3IKICAgIC0tZXhjbHVkZS1kaXIsIHRob3VnaCB0aGF0IGlzIG5vdCBhdmFpbGFibGUgaW4gR05VIGdyZXAsIGF0IGxlYXN0IGFzIG9mCiAgICByZWxlYXNlIDIuNS40LgoKMTguIEF0IGEgdXNlcidzIHN1Z2dlc3Rpb24sIHRoZSBtYWNyb3MgR0VUQ0hBUiBhbmQgZnJpZW5kcyAod2hpY2ggcGljayB1cCBVVEYtOAogICAgY2hhcmFjdGVycyBmcm9tIGEgc3RyaW5nIG9mIGJ5dGVzKSBoYXZlIGJlZW4gcmVkZWZpbmVkIHNvIGFzIG5vdCB0byB1c2UKICAgIGxvb3BzLCBpbiBvcmRlciB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGluIHNvbWUgZW52aXJvbm1lbnRzLiBBdCB0aGUgc2FtZQogICAgdGltZSwgSSBhYnN0cmFjdGVkIHNvbWUgb2YgdGhlIGNvbW1vbiBjb2RlIGludG8gYXV4aWxpYXJ5IG1hY3JvcyB0byBzYXZlCiAgICByZXBldGl0aW9uICh0aGlzIHNob3VsZCBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBjb2RlKS4KCjE5LiBJZiBcYyB3YXMgZm9sbG93ZWQgYnkgYSBtdWx0aWJ5dGUgVVRGLTggY2hhcmFjdGVyLCBiYWQgdGhpbmdzIGhhcHBlbmVkLiBBCiAgICBjb21waWxlLXRpbWUgZXJyb3IgaXMgbm93IGdpdmVuIGlmIFxjIGlzIG5vdCBmb2xsb3dlZCBieSBhbiBBU0NJSQogICAgY2hhcmFjdGVyLCB0aGF0IGlzLCBhIGJ5dGUgbGVzcyB0aGFuIDEyOC4gKEluIEVCQ0RJQyBtb2RlLCB0aGUgY29kZSBpcwogICAgZGlmZmVyZW50LCBhbmQgYW55IGJ5dGUgdmFsdWUgaXMgYWxsb3dlZC4pCgoyMC4gUmVjb2duaXplICgqTk9fU1RBUlRfT1BUKSBhdCB0aGUgc3RhcnQgb2YgYSBwYXR0ZXJuIHRvIHNldCB0aGUgUENSRV9OT18KICAgIFNUQVJUX09QVElNSVpFIG9wdGlvbiwgd2hpY2ggaXMgbm93IGFsbG93ZWQgYXQgY29tcGlsZSB0aW1lIC0gYnV0IGp1c3QKICAgIHBhc3NlZCB0aHJvdWdoIHRvIHBjcmVfZXhlYygpIG9yIHBjcmVfZGZhX2V4ZWMoKS4gVGhpcyBtYWtlcyBpdCBhdmFpbGFibGUKICAgIHRvIHBjcmVncmVwIGFuZCBvdGhlciBhcHBsaWNhdGlvbnMgdGhhdCBoYXZlIG5vIGRpcmVjdCBhY2Nlc3MgdG8gUENSRQogICAgb3B0aW9ucy4gVGhlIG5ldyAvWSBvcHRpb24gaW4gcGNyZXRlc3Qgc2V0cyB0aGlzIG9wdGlvbiB3aGVuIGNhbGxpbmcKICAgIHBjcmVfY29tcGlsZSgpLgoKMjEuIENoYW5nZSAxOCBvZiByZWxlYXNlIDguMDEgYnJva2UgdGhlIHVzZSBvZiBuYW1lZCBzdWJwYXR0ZXJucyBmb3IgcmVjdXJzaXZlCiAgICBiYWNrIHJlZmVyZW5jZXMuIEdyb3VwcyBjb250YWluaW5nIHJlY3Vyc2l2ZSBiYWNrIHJlZmVyZW5jZXMgd2VyZSBmb3JjZWQgdG8KICAgIGJlIGF0b21pYyBieSB0aGF0IGNoYW5nZSwgYnV0IGluIHRoZSBjYXNlIG9mIG5hbWVkIGdyb3VwcywgdGhlIGFtb3VudCBvZgogICAgbWVtb3J5IHJlcXVpcmVkIHdhcyBpbmNvcnJlY3RseSBjb21wdXRlZCwgbGVhZGluZyB0byAiRmFpbGVkOiBpbnRlcm5hbAogICAgZXJyb3I6IGNvZGUgb3ZlcmZsb3ciLiBUaGlzIGhhcyBiZWVuIGZpeGVkLgoKMjIuIFNvbWUgcGF0Y2hlcyB0byBwY3JlX3N0cmluZ3BpZWNlLmgsIHBjcmVfc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MsIGFuZAogICAgcGNyZXRlc3QuYywgdG8gYXZvaWQgYnVpbGQgcHJvYmxlbXMgaW4gc29tZSBCb3JsYW5kIGVudmlyb25tZW50cy4KCgpWZXJzaW9uIDguMTAgMjUtSnVuLTIwMTAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiAgQWRkZWQgc3VwcG9ydCBmb3IgKCpNQVJLOkFSRykgYW5kIGZvciBBUkcgYWRkaXRpb25zIHRvIFBSVU5FLCBTS0lQLCBhbmQKICAgIFRIRU4uCgoyLiAgKCpBQ0NFUFQpIHdhcyBub3Qgd29ya2luZyB3aGVuIGluc2lkZSBhbiBhdG9taWMgZ3JvdXAuCgozLiAgSW5zaWRlIGEgY2hhcmFjdGVyIGNsYXNzLCBcQiBpcyB0cmVhdGVkIGFzIGEgbGl0ZXJhbCBieSBkZWZhdWx0LCBidXQKICAgIGZhdWx0ZWQgaWYgUENSRV9FWFRSQSBpcyBzZXQuIFRoaXMgbWltaWNzIFBlcmwncyBiZWhhdmlvdXIgKHRoZSAtdyBvcHRpb24KICAgIGNhdXNlcyB0aGUgZXJyb3IpLiBUaGUgY29kZSBpcyB1bmNoYW5nZWQsIGJ1dCBJIHRpZGllZCB0aGUgZG9jdW1lbnRhdGlvbi4KCjQuICBJbnNpZGUgYSBjaGFyYWN0ZXIgY2xhc3MsIFBDUkUgYWx3YXlzIHRyZWF0ZWQgXFIgYW5kIFxYIGFzIGxpdGVyYWxzLAogICAgd2hlcmVhcyBQZXJsIGZhdWx0cyB0aGVtIGlmIGl0cyAtdyBvcHRpb24gaXMgc2V0LiBJIGhhdmUgY2hhbmdlZCBQQ1JFIHNvCiAgICB0aGF0IGl0IGZhdWx0cyB0aGVtIHdoZW4gUENSRV9FWFRSQSBpcyBzZXQuCgo1LiAgQWRkZWQgc3VwcG9ydCBmb3IgXE4sIHdoaWNoIGFsd2F5cyBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgb3RoZXIgdGhhbgogICAgbmV3bGluZS4gKEl0IGlzIHRoZSBzYW1lIGFzICIuIiB3aGVuIFBDUkVfRE9UQUxMIGlzIG5vdCBzZXQuKQoKNi4gIFdoZW4gY29tcGlsaW5nIHBjcmVncmVwIHdpdGggbmV3ZXIgdmVyc2lvbnMgb2YgZ2NjIHdoaWNoIG1heSBoYXZlCiAgICBGT1JUSUZZX1NPVVJDRSBzZXQsIHNldmVyYWwgd2FybmluZ3MgImlnbm9yaW5nIHJldHVybiB2YWx1ZSBvZiAnZndyaXRlJywKICAgIGRlY2xhcmVkIHdpdGggYXR0cmlidXRlIHdhcm5fdW51c2VkX3Jlc3VsdCIgd2VyZSBnaXZlbi4gSnVzdCBjYXN0aW5nIHRoZQogICAgcmVzdWx0IHRvICh2b2lkKSBkb2VzIG5vdCBzdG9wIHRoZSB3YXJuaW5nczsgYSBtb3JlIGVsYWJvcmF0ZSBmdWRnZSBpcwogICAgbmVlZGVkLiBJJ3ZlIHVzZWQgYSBtYWNybyB0byBpbXBsZW1lbnQgdGhpcy4KCjcuICBNaW5vciBjaGFuZ2UgdG8gcGNyZXRlc3QuYyB0byBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcuCgo4LiAgQWRkZWQgZm91ciBhcnRpZmljYWwgVW5pY29kZSBwcm9wZXJ0aWVzIHRvIGhlbHAgd2l0aCBhbiBvcHRpb24gdG8gbWFrZQogICAgXHMgZXRjIHVzZSBwcm9wZXJ0aWVzIChzZWUgbmV4dCBpdGVtKS4gVGhlIG5ldyBwcm9wZXJ0aWVzIGFyZTogWGFuCiAgICAoYWxwaGFudW1lcmljKSwgWHNwIChQZXJsIHNwYWNlKSwgWHBzIChQT1NJWCBzcGFjZSksIGFuZCBYd2QgKHdvcmQpLgoKOS4gIEFkZGVkIFBDUkVfVUNQIHRvIG1ha2UgXGIsIFxkLCBccywgXHcsIGFuZCBjZXJ0YWluIFBPU0lYIGNoYXJhY3RlciBjbGFzc2VzCiAgICB1c2UgVW5pY29kZSBwcm9wZXJ0aWVzLiAoKlVDUCkgYXQgdGhlIHN0YXJ0IG9mIGEgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBzZXQKICAgIHRoaXMgb3B0aW9uLiBNb2RpZmllZCBwY3JldGVzdCB0byBhZGQgL1cgdG8gdGVzdCB0aGlzIGZhY2lsaXR5LiBBZGRlZAogICAgUkVHX1VDUCB0byBtYWtlIGl0IGF2YWlsYWJsZSB2aWEgdGhlIFBPU0lYIGludGVyZmFjZS4KCjEwLiBBZGRlZCAtLWxpbmUtYnVmZmVyZWQgdG8gcGNyZWdyZXAuCgoxMS4gSW4gVVRGLTggbW9kZSwgaWYgYSBwYXR0ZXJuIHRoYXQgd2FzIGNvbXBpbGVkIHdpdGggUENSRV9DQVNFTEVTUyB3YXMKICAgIHN0dWRpZWQsIGFuZCB0aGUgbWF0Y2ggc3RhcnRlZCB3aXRoIGEgbGV0dGVyIHdpdGggYSBjb2RlIHBvaW50IGdyZWF0ZXIgdGhhbgogICAgMTI3IHdob3NlIGZpcnN0IGJ5dGUgd2FzIGRpZmZlcmVudCB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgb3RoZXIgY2FzZSBvZgogICAgdGhlIGxldHRlciwgdGhlIG90aGVyIGNhc2Ugb2YgdGhpcyBzdGFydGluZyBsZXR0ZXIgd2FzIG5vdCByZWNvZ25pemVkCiAgICAoIzk3NikuCgoxMi4gSWYgYSBwYXR0ZXJuIHRoYXQgd2FzIHN0dWRpZWQgc3RhcnRlZCB3aXRoIGEgcmVwZWF0ZWQgVW5pY29kZSBwcm9wZXJ0eQogICAgdGVzdCwgZm9yIGV4YW1wbGUsIFxwe05kfSssIHRoZXJlIHdhcyB0aGUgdGhlb3JldGljYWwgcG9zc2liaWxpdHkgb2YKICAgIHNldHRpbmcgdXAgYW4gaW5jb3JyZWN0IGJpdG1hcCBvZiBzdGFydGluZyBieXRlcywgYnV0IGZvcnR1bmF0ZWx5IGl0IGNvdWxkCiAgICBub3QgaGF2ZSBhY3R1YWxseSBoYXBwZW5lZCBpbiBwcmFjdGljZSB1bnRpbCBjaGFuZ2UgOCBhYm92ZSB3YXMgbWFkZSAoaXQKICAgIGFkZGVkIHByb3BlcnR5IHR5cGVzIHRoYXQgbWF0Y2hlZCBjaGFyYWN0ZXItbWF0Y2hpbmcgb3Bjb2RlcykuCgoxMy4gcGNyZV9zdHVkeSgpIG5vdyByZWNvZ25pemVzIFxoLCBcdiwgYW5kIFxSIHdoZW4gY29uc3RydWN0aW5nIGEgYml0IG1hcCBvZgogICAgcG9zc2libGUgc3RhcnRpbmcgYnl0ZXMgZm9yIG5vbi1hbmNob3JlZCBwYXR0ZXJucy4KCjE0LiBFeHRlbmRlZCB0aGUgImF1dG8tcG9zc2Vzc2lmeSIgZmVhdHVyZSBvZiBwY3JlX2NvbXBpbGUoKS4gSXQgbm93IHJlY29nbml6ZXMKICAgIFxSLCBhbmQgYWxzbyBhIG51bWJlciBvZiBjYXNlcyB0aGF0IGludm9sdmUgVW5pY29kZSBwcm9wZXJ0aWVzLCBib3RoCiAgICBleHBsaWNpdCBhbmQgaW1wbGljaXQgd2hlbiBQQ1JFX1VDUCBpcyBzZXQuCgoxNS4gSWYgYSByZXBlYXRlZCBVbmljb2RlIHByb3BlcnR5IG1hdGNoIChlLmcuIFxwe0x1fSopIHdhcyB1c2VkIHdpdGggbm9uLVVURi04CiAgICBpbnB1dCwgaXQgY291bGQgY3Jhc2ggb3IgZ2l2ZSB3cm9uZyByZXN1bHRzIGlmIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZXMKICAgIGdyZWF0ZXIgdGhhbiAweGMwIHdlcmUgcHJlc2VudCBpbiB0aGUgc3ViamVjdCBzdHJpbmcuIChEZXRhaWw6IGl0IGFzc3VtZWQKICAgIFVURi04IGlucHV0IHdoZW4gcHJvY2Vzc2luZyB0aGVzZSBpdGVtcy4pCgoxNi4gQWRkZWQgYSBsb3Qgb2YgKGludCkgY2FzdHMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MgaW4gc3lzdGVtcyB3aGVyZQogICAgc2l6ZV90IGlzIDY0LWJpdCAoIzk5MSkuCgoxNy4gQWRkZWQgYSBjaGVjayBmb3IgcnVubmluZyBvdXQgb2YgbWVtb3J5IHdoZW4gUENSRSBpcyBjb21waWxlZCB3aXRoCiAgICAtLWRpc2FibGUtc3RhY2stZm9yLXJlY3Vyc2lvbiAoIzk5MCkuCgoxOC4gSWYgdGhlIGxhc3QgZGF0YSBsaW5lIGluIGEgZmlsZSBmb3IgcGNyZXRlc3QgZG9lcyBub3QgaGF2ZSBhIG5ld2xpbmUgb24KICAgIHRoZSBlbmQsIGEgbmV3bGluZSB3YXMgbWlzc2luZyBpbiB0aGUgb3V0cHV0LgoKMTkuIFRoZSBkZWZhdWx0IHBjcmVfY2hhcnRhYmxlcy5jIGZpbGUgcmVjb2duaXplcyBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMgKHZhbHVlcwogICAgbGVzcyB0aGFuIDEyOCkgaW4gaXRzIHZhcmlvdXMgYml0bWFwcy4gSG93ZXZlciwgdGhlcmUgaXMgYSBmYWNpbGl0eSBmb3IKICAgIGdlbmVyYXRpbmcgdGFibGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUgd2hlbiBQQ1JFIGlzIGNvbXBpbGVkLiBJdAogICAgdHVybnMgb3V0IHRoYXQgaW4gc29tZSBlbnZpcm9ubWVudHMsIDB4ODUgYW5kIDB4YTAsIHdoaWNoIGFyZSBVbmljb2RlIHNwYWNlCiAgICBjaGFyYWN0ZXJzLCBhcmUgcmVjb2duaXplZCBieSBpc3NwYWNlKCkgYW5kIHRoZXJlZm9yZSB3ZXJlIGdldHRpbmcgc2V0IGluCiAgICB0aGVzZSB0YWJsZXMsIGFuZCBpbmRlZWQgdGhlc2UgdGFibGVzIHNlZW0gdG8gYXBwcm94aW1hdGUgdG8gSVNPIDg4NTkuIFRoaXMKICAgIGNhdXNlZCBhIHByb2JsZW0gaW4gVVRGLTggbW9kZSB3aGVuIHBjcmVfc3R1ZHkoKSB3YXMgdXNlZCB0byBjcmVhdGUgYSBsaXN0CiAgICBvZiBieXRlcyB0aGF0IGNhbiBzdGFydCBhIG1hdGNoLiBGb3IgXHMsIGl0IHdhcyBpbmNsdWRpbmcgMHg4NSBhbmQgMHhhMCwKICAgIHdoaWNoIG9mIGNvdXJzZSBjYW5ub3Qgc3RhcnQgVVRGLTggY2hhcmFjdGVycy4gSSBoYXZlIGNoYW5nZWQgdGhlIGNvZGUgc28KICAgIHRoYXQgb25seSByZWFsIEFTQ0lJIGNoYXJhY3RlcnMgKGxlc3MgdGhhbiAxMjgpIGFuZCB0aGUgY29ycmVjdCBzdGFydGluZwogICAgYnl0ZXMgZm9yIFVURi04IGVuY29kaW5ncyBhcmUgc2V0IGZvciBjaGFyYWN0ZXJzIGdyZWF0ZXIgdGhhbiAxMjcgd2hlbiBpbgogICAgVVRGLTggbW9kZS4gKFdoZW4gUENSRV9VQ1AgaXMgc2V0IC0gc2VlIDkgYWJvdmUgLSB0aGUgY29kZSBpcyBkaWZmZXJlbnQKICAgIGFsdG9nZXRoZXIuKQoKMjAuIEFkZGVkIHRoZSAvVCBvcHRpb24gdG8gcGNyZXRlc3Qgc28gYXMgdG8gYmUgYWJsZSB0byBydW4gdGVzdHMgd2l0aCBub24tCiAgICBzdGFuZGFyZCBjaGFyYWN0ZXIgdGFibGVzLCB0aHVzIG1ha2luZyBpdCBwb3NzaWJsZSB0byBpbmNsdWRlIHRoZSB0ZXN0cwogICAgdXNlZCBmb3IgMTkgYWJvdmUgaW4gdGhlIHN0YW5kYXJkIHNldCBvZiB0ZXN0cy4KCjIxLiBBIHBhdHRlcm4gc3VjaCBhcyAoPyZ0KSg/IygpKD8oREVGSU5FKSg/PHQ+YSkpIHdoaWNoIGhhcyBhIGZvcndhcmQKICAgIHJlZmVyZW5jZSB0byBhIHN1YnBhdHRlcm4gdGhlIG90aGVyIHNpZGUgb2YgYSBjb21tZW50IHRoYXQgY29udGFpbnMgYW4KICAgIG9wZW5pbmcgcGFyZW50aGVzaXMgY2F1c2VkIGVpdGhlciBhbiBpbnRlcm5hbCBjb21waWxpbmcgZXJyb3IsIG9yIGEKICAgIHJlZmVyZW5jZSB0byB0aGUgd3Jvbmcgc3VicGF0dGVybi4KCgpWZXJzaW9uIDguMDIgMTktTWFyLTIwMTAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiAgVGhlIFVuaWNvZGUgZGF0YSB0YWJsZXMgaGF2ZSBiZWVuIHVwZGF0ZWQgdG8gVW5pY29kZSA1LjIuMC4KCjIuICBBZGRlZCB0aGUgb3B0aW9uIC0tbGlicy1jcHAgdG8gcGNyZS1jb25maWcsIGJ1dCBvbmx5IHdoZW4gQysrIHN1cHBvcnQgaXMKICAgIGNvbmZpZ3VyZWQuCgozLiAgVXBkYXRlZCB0aGUgbGljZW5zaW5nIHRlcm1zIGluIHRoZSBwY3JlZ2V4cC5wYXMgZmlsZSwgYXMgYWdyZWVkIHdpdGggdGhlCiAgICBvcmlnaW5hbCBhdXRob3Igb2YgdGhhdCBmaWxlLCBmb2xsb3dpbmcgYSBxdWVyeSBhYm91dCBpdHMgc3RhdHVzLgoKNC4gIE9uIHN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSBzdGRpbnQuaCAoZS5nLiBTb2xhcmlzKSwgY2hlY2sgZm9yIGFuZCBpbmNsdWRlCiAgICBpbnR0eXBlcy5oIGluc3RlYWQuIFRoaXMgZml4ZXMgYSBidWcgdGhhdCB3YXMgaW50cm9kdWNlZCBieSBjaGFuZ2UgOC4wMS84LgoKNS4gIEEgcGF0dGVybiBzdWNoIGFzICg/JnQpKisoPyhERUZJTkUpKD88dD4uKSkgd2hpY2ggaGFzIGEgcG9zc2Vzc2l2ZQogICAgcXVhbnRpZmllciBhcHBsaWVkIHRvIGEgZm9yd2FyZC1yZWZlcmVuY2luZyBzdWJyb3V0aW5lIGNhbGwsIGNvdWxkIGNvbXBpbGUKICAgIGluY29ycmVjdCBjb2RlIG9yIGdpdmUgdGhlIGVycm9yICJpbnRlcm5hbCBlcnJvcjogcHJldmlvdXNseS1jaGVja2VkCiAgICByZWZlcmVuY2VkIHN1YnBhdHRlcm4gbm90IGZvdW5kIi4KCjYuICBCb3RoIE1TIFZpc3VhbCBTdHVkaW8gYW5kIFN5bWJpYW4gT1MgaGF2ZSBwcm9ibGVtcyB3aXRoIGluaXRpYWxpemluZwogICAgdmFyaWFibGVzIHRvIHBvaW50IHRvIGV4dGVybmFsIGZ1bmN0aW9ucy4gRm9yIHRoZXNlIHN5c3RlbXMsIHRoZXJlZm9yZSwKICAgIHBjcmVfbWFsbG9jIGV0Yy4gYXJlIG5vdyBpbml0aWFsaXplZCB0byBsb2NhbCBmdW5jdGlvbnMgdGhhdCBjYWxsIHRoZQogICAgcmVsZXZhbnQgZ2xvYmFsIGZ1bmN0aW9ucy4KCjcuICBUaGVyZSB3ZXJlIHR3byBlbnRyaWVzIG1pc3NpbmcgaW4gdGhlIHZlY3RvcnMgY2FsbGVkIGNvcHRhYmxlIGFuZCBwb3B0YWJsZQogICAgaW4gcGNyZV9kZmFfZXhlYy5jLiBUaGlzIGNvdWxkIGxlYWQgdG8gbWVtb3J5IGFjY2Vzc2VzIG91dHNpemUgdGhlIHZlY3RvcnMuCiAgICBJJ3ZlIGZpeGVkIHRoZSBkYXRhLCBhbmQgYWRkZWQgYSBrbHVkZ3kgd2F5IG9mIHRlc3RpbmcgYXQgY29tcGlsZSB0aW1lIHRoYXQKICAgIHRoZSBsZW5ndGhzIGFyZSBjb3JyZWN0IChlcXVhbCB0byB0aGUgbnVtYmVyIG9mIG9wY29kZXMpLgoKOC4gIEZvbGxvd2luZyBvbiBmcm9tIDcsIEkgYWRkZWQgYSBzaW1pbGFyIGtsdWRnZSB0byBjaGVjayB0aGUgbGVuZ3RoIG9mIHRoZQogICAgZWludCB2ZWN0b3IgaW4gcGNyZXBvc2l4LmMuCgo5LiAgRXJyb3IgdGV4dHMgZm9yIHBjcmVfY29tcGlsZSgpIGFyZSBoZWxkIGFzIG9uZSBsb25nIHN0cmluZyB0byBhdm9pZCB0b28KICAgIG11Y2ggcmVsb2NhdGlvbiBhdCBsb2FkIHRpbWUuIFRvIGZpbmQgYSB0ZXh0LCB0aGUgc3RyaW5nIGlzIHNlYXJjaGVkLAogICAgY291bnRpbmcgemVyb3MuIFRoZXJlIHdhcyBubyBjaGVjayBmb3IgcnVubmluZyBvZmYgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLAogICAgd2hpY2ggY291bGQgaGFwcGVuIGlmIGEgbmV3IGVycm9yIG51bWJlciB3YXMgYWRkZWQgd2l0aG91dCB1cGRhdGluZyB0aGUKICAgIHN0cmluZy4KCjEwLiBcSyBnYXZlIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGl0IGFwcGVhcmVkIGluIGEgbG9va2JlaGluZCBhc3NlcnNpb24uCgoxMS4gXEsgd2FzIG5vdCB3b3JraW5nIGlmIGl0IGFwcGVhcmVkIGluIGFuIGF0b21pYyBncm91cCBvciBpbiBhIGdyb3VwIHRoYXQKICAgIHdhcyBjYWxsZWQgYXMgYSAic3Vicm91dGluZSIsIG9yIGluIGFuIGFzc2VydGlvbi4gUGVybCA1LjExIGRvY3VtZW50cyB0aGF0CiAgICBcSyBpcyAibm90IHdlbGwgZGVmaW5lZCIgaWYgdXNlZCBpbiBhbiBhc3NlcnRpb24uIFBDUkUgbm93IGFjY2VwdHMgaXQgaWYKICAgIHRoZSBhc3NlcnRpb24gaXMgcG9zaXRpdmUsIGJ1dCBub3QgaWYgaXQgaXMgbmVnYXRpdmUuCgoxMi4gQ2hhbmdlIDExIGZvcnR1aXRvdXNseSByZWR1Y2VkIHRoZSBzaXplIG9mIHRoZSBzdGFjayBmcmFtZSB1c2VkIGluIHRoZQogICAgIm1hdGNoKCkiIGZ1bmN0aW9uIG9mIHBjcmVfZXhlYy5jIGJ5IG9uZSBwb2ludGVyLiBGb3J0aGNvbWluZwogICAgaW1wbGVtZW50YXRpb24gb2Ygc3VwcG9ydCBmb3IgKCpNQVJLKSB3aWxsIG5lZWQgYW4gZXh0cmEgcG9pbnRlciBvbiB0aGUKICAgIHN0YWNrOyBJIGhhdmUgcmVzZXJ2ZWQgaXQgbm93LCBzbyB0aGF0IHRoZSBzdGFjayBmcmFtZSBzaXplIGRvZXMgbm90CiAgICBkZWNyZWFzZS4KCjEzLiBBIHBhdHRlcm4gc3VjaCBhcyAoP1A8TDE+KD9QPEwyPjApfCg/UD5MMikoP1A+TDEpKSBpbiB3aGljaCB0aGUgb25seSBvdGhlcgogICAgaXRlbSBpbiBicmFuY2ggdGhhdCBjYWxscyBhIHJlY3Vyc2lvbiBpcyBhIHN1YnJvdXRpbmUgY2FsbCAtIGFzIGluIHRoZQogICAgc2Vjb25kIGJyYW5jaCBpbiB0aGUgYWJvdmUgZXhhbXBsZSAtIHdhcyBpbmNvcnJlY3RseSBnaXZlbiB0aGUgY29tcGlsZS0KICAgIHRpbWUgZXJyb3IgInJlY3Vyc2l2ZSBjYWxsIGNvdWxkIGxvb3AgaW5kZWZpbml0ZWx5IiBiZWNhdXNlIHBjcmVfY29tcGlsZSgpCiAgICB3YXMgbm90IGNvcnJlY3RseSBjaGVja2luZyB0aGUgc3Vicm91dGluZSBmb3IgbWF0Y2hpbmcgYSBub24tZW1wdHkgc3RyaW5nLgoKMTQuIFRoZSBjaGVja3MgZm9yIG92ZXJydW5uaW5nIGNvbXBpbGluZyB3b3Jrc3BhY2UgY291bGQgdHJpZ2dlciBhZnRlciBhbgogICAgb3ZlcnJ1biBoYWQgb2NjdXJyZWQuIFRoaXMgaXMgYSAic2hvdWxkIG5ldmVyIG9jY3VyIiBlcnJvciwgYnV0IGl0IGNhbiBiZQogICAgdHJpZ2dlcmVkIGJ5IHBhdGhvbG9naWNhbCBwYXR0ZXJucyBzdWNoIGFzIGh1bmRyZWRzIG9mIG5lc3RlZCBwYXJlbnRoZXNlcy4KICAgIFRoZSBjaGVja3Mgbm93IHRyaWdnZXIgMTAwIGJ5dGVzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSB3b3Jrc3BhY2UuCgoxNS4gRml4IHR5cG8gaW4gY29uZmlndXJlLmFjOiAic3J0b3EiIHNob3VsZCBiZSAic3RydG9xIi4KCgpWZXJzaW9uIDguMDEgMTktSmFuLTIwMTAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiAgSWYgYSBwYXR0ZXJuIGNvbnRhaW5lZCBhIGNvbmRpdGlvbmFsIHN1YnBhdHRlcm4gd2l0aCBvbmx5IG9uZSBicmFuY2ggKGluCiAgICBwYXJ0aWN1bGFyLCB0aGlzIGluY2x1ZGVzIGFsbCAoKkRFRklORSkgcGF0dGVybnMpLCBhIGNhbGwgdG8gcGNyZV9zdHVkeSgpCiAgICBjb21wdXRlZCB0aGUgd3JvbmcgbWluaW11bSBkYXRhIGxlbmd0aCAod2hpY2ggaXMgb2YgY291cnNlIHplcm8gZm9yIHN1Y2gKICAgIHN1YnBhdHRlcm5zKS4gVGhpcyBjb3VsZCBjYXVzZSBpbmNvcnJlY3QgIm5vIG1hdGNoIiByZXN1bHRzLgoKMi4gIEZvciBwYXR0ZXJucyBzdWNoIGFzICg/aSlhKD8taSlifGMgd2hlcmUgYW4gb3B0aW9uIHNldHRpbmcgYXQgdGhlIHN0YXJ0IG9mCiAgICB0aGUgcGF0dGVybiBpcyByZXNldCBpbiB0aGUgZmlyc3QgYnJhbmNoLCBwY3JlX2NvbXBpbGUoKSBmYWlsZWQgd2l0aAogICAgImludGVybmFsIGVycm9yOiBjb2RlIG92ZXJmbG93IGF0IG9mZnNldC4uLiIuIFRoaXMgaGFwcGVuZWQgb25seSB3aGVuCiAgICB0aGUgcmVzZXQgd2FzIHRvIHRoZSBvcmlnaW5hbCBleHRlcm5hbCBvcHRpb24gc2V0dGluZy4gKEFuIG9wdGltaXphdGlvbgogICAgYWJzdHJhY3RzIGxlYWRpbmcgb3B0aW9ucyBzZXR0aW5ncyBpbnRvIGFuIGV4dGVybmFsIHNldHRpbmcsIHdoaWNoIHdhcyB0aGUKICAgIGNhdXNlIG9mIHRoaXMuKQoKMy4gIEEgcGF0dGVybiBzdWNoIGFzIF4oPyFhKCpTS0lQKWIpIHdoZXJlIGEgbmVnYXRpdmUgYXNzZXJ0aW9uIGNvbnRhaW5lZCBvbmUKICAgIG9mIHRoZSB2ZXJicyBTS0lQLCBQUlVORSwgb3IgQ09NTUlULCBkaWQgbm90IHdvcmsgY29ycmVjdGx5LiBXaGVuIHRoZQogICAgYXNzZXJ0aW9uIHBhdHRlcm4gZGlkIG5vdCBtYXRjaCAobWVhbmluZyB0aGF0IHRoZSBhc3NlcnRpb24gd2FzIHRydWUpLCBpdAogICAgd2FzIGluY29ycmVjdGx5IHRyZWF0ZWQgYXMgZmFsc2UgaWYgdGhlIFNLSVAgaGFkIGJlZW4gcmVhY2hlZCBkdXJpbmcgdGhlCiAgICBtYXRjaGluZy4gVGhpcyBhbHNvIGFwcGxpZWQgdG8gYXNzZXJ0aW9ucyB1c2VkIGFzIGNvbmRpdGlvbnMuCgo0LiAgSWYgYW4gaXRlbSB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgcGNyZV9kZmFfZXhlYygpIHdhcyBlbmNvdW50ZXJlZCBpbiBhbgogICAgYXNzZXJ0aW9uIHN1YnBhdHRlcm4sIGluY2x1ZGluZyBzdWNoIGEgcGF0dGVybiB1c2VkIGFzIGEgY29uZGl0aW9uLAogICAgdW5wcmVkaWN0YWJsZSByZXN1bHRzIG9jY3VycmVkLCBpbnN0ZWFkIG9mIHRoZSBlcnJvciByZXR1cm4KICAgIFBDUkVfRVJST1JfREZBX1VJVEVNLgoKNS4gIFRoZSBDKysgR2xvYmFsUmVwbGFjZSBmdW5jdGlvbiB3YXMgbm90IHdvcmtpbmcgbGlrZSBQZXJsIGZvciB0aGUgc3BlY2lhbAogICAgc2l0dWF0aW9uIHdoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIG1hdGNoZWQuIEl0IG5vdyBkb2VzIHRoZSBmYW5jeSBtYWdpYwogICAgc3R1ZmYgdGhhdCBpcyBuZWNlc3NhcnkuCgo2LiAgSW4gcGNyZV9pbnRlcm5hbC5oLCBvYnNvbGV0ZSBpbmNsdWRlcyB0byBzZXRqbXAuaCBhbmQgc3RkYXJnLmggaGF2ZSBiZWVuCiAgICByZW1vdmVkLiAoVGhlc2Ugd2VyZSBsZWZ0IG92ZXIgZnJvbSB2ZXJ5LCB2ZXJ5IGVhcmx5IHZlcnNpb25zIG9mIFBDUkUuKQoKNy4gIFNvbWUgY29zbWV0aWMgY2hhbmdlcyB0byB0aGUgY29kZSB0byBtYWtlIGxpZmUgZWFzaWVyIHdoZW4gY29tcGlsaW5nIGl0CiAgICBhcyBwYXJ0IG9mIHNvbWV0aGluZyBlbHNlOgoKICAgIChhKSBDaGFuZ2UgREVCVUcgdG8gUENSRV9ERUJVRy4KCiAgICAoYikgSW4gcGNyZV9jb21waWxlKCksIHJlbmFtZSB0aGUgbWVtYmVyIG9mIHRoZSAiYnJhbmNoX2NoYWluIiBzdHJ1Y3R1cmUKICAgICAgICBjYWxsZWQgImN1cnJlbnQiIGFzICJjdXJyZW50X2JyYW5jaCIsIHRvIHByZXZlbnQgYSBjb2xsaXNpb24gd2l0aCB0aGUKICAgICAgICBMaW51eCBtYWNybyB3aGVuIGNvbXBpbGVkIGFzIGEga2VybmVsIG1vZHVsZS4KCiAgICAoYykgSW4gcGNyZV9zdHVkeSgpLCByZW5hbWUgdGhlIGZ1bmN0aW9uIHNldF9iaXQoKSBhcyBzZXRfdGFibGVfYml0KCksIHRvCiAgICAgICAgcHJldmVudCBhIGNvbGxpc2lvbiB3aXRoIHRoZSBMaW51eCBtYWNybyB3aGVuIGNvbXBpbGVkIGFzIGEga2VybmVsCiAgICAgICAgbW9kdWxlLgoKOC4gIEluIHBjcmVfY29tcGlsZSgpIHRoZXJlIGFyZSBzb21lIGNoZWNrcyBmb3IgaW50ZWdlciBvdmVyZmxvd3MgdGhhdCB1c2VkIHRvCiAgICBjYXN0IHBvdGVudGlhbGx5IGxhcmdlIHZhbHVlcyB0byAoZG91YmxlKS4gVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIHRvIHRoYXQKICAgIHdoZW4gYnVpbGRpbmcsIGEgY2hlY2sgZm9yIGludDY0X3QgaXMgbWFkZSwgYW5kIGlmIGl0IGlzIGZvdW5kLCBpdCBpcyB1c2VkCiAgICBpbnN0ZWFkLCB0aHVzIGF2b2lkaW5nIHRoZSB1c2Ugb2YgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4gKFRoZXJlIGlzIG5vCiAgICBvdGhlciB1c2Ugb2YgRlAgaW4gUENSRS4pIElmIGludDY0X3QgaXMgbm90IGZvdW5kLCB0aGUgZmFsbGJhY2sgaXMgdG8KICAgIGRvdWJsZS4KCjkuICBBZGRlZCB0d28gY2FzdHMgdG8gYXZvaWQgc2lnbmVkL3Vuc2lnbmVkIHdhcm5pbmdzIGZyb20gVlMgU3R1ZGlvIEV4cHJlc3MKICAgIDIwMDUgKGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gYWRkcmVzc2VzIGNvbXBhcmVkIHRvIGFuIHVuc2lnbmVkIHZhbHVlKS4KCjEwLiBDaGFuZ2UgdGhlIHN0YW5kYXJkIEFDX0NIRUNLX0xJQiB0ZXN0IGZvciBsaWJiejIgaW4gY29uZmlndXJlLmFjIHRvIGEKICAgIGN1c3RvbSBvbmUsIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyByZXBvcnRlZCBwcm9ibGVtIGluIFdpbmRvd3M6CgogICAgICAtIGxpYmJ6MiB1c2VzIHRoZSBQYXNjYWwgY2FsbGluZyBjb252ZW50aW9uIChXSU5BUEkpIGZvciB0aGUgZnVuY3Rpb25zCiAgICAgICAgICB1bmRlciBXaW4zMi4KICAgICAgLSBUaGUgc3RhbmRhcmQgYXV0b2NvbmYgQUNfQ0hFQ0tfTElCIGZhaWxzIHRvIGluY2x1ZGUgImJ6bGliLmgiLAogICAgICAgICAgdGhlcmVmb3JlIG1pc3NpbmcgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uCiAgICAgIC0gVGhlIGNvbXBpbGVyIHRodXMgZ2VuZXJhdGVzIGEgIkMiIHNpZ25hdHVyZSBmb3IgdGhlIHRlc3QgZnVuY3Rpb24uCiAgICAgIC0gVGhlIGxpbmtlciBmYWlscyB0byBmaW5kIHRoZSAiQyIgZnVuY3Rpb24uCiAgICAgIC0gUENSRSBmYWlscyB0byBjb25maWd1cmUgaWYgYXNrZWQgdG8gZG8gc28gYWdhaW5zdCBsaWJiejIuCgoxMS4gV2hlbiBydW5uaW5nIGxpYnRvb2xpemUgZnJvbSBsaWJ0b29sLTIuMi42YiBhcyBwYXJ0IG9mIGF1dG9nZW4uc2gsIHRoZXNlCiAgICBtZXNzYWdlcyB3ZXJlIG91dHB1dDoKCiAgICAgIENvbnNpZGVyIGFkZGluZyBgQUNfQ09ORklHX01BQ1JPX0RJUihbbTRdKScgdG8gY29uZmlndXJlLmFjIGFuZAogICAgICByZXJ1bm5pbmcgbGlidG9vbGl6ZSwgdG8ga2VlcCB0aGUgY29ycmVjdCBsaWJ0b29sIG1hY3JvcyBpbi10cmVlLgogICAgICBDb25zaWRlciBhZGRpbmcgYC1JIG00JyB0byBBQ0xPQ0FMX0FNRkxBR1MgaW4gTWFrZWZpbGUuYW0uCgogICAgSSBoYXZlIGRvbmUgYm90aCBvZiB0aGVzZSB0aGluZ3MuCgoxMi4gQWx0aG91Z2ggcGNyZV9kZmFfZXhlYygpIGRvZXMgbm90IHVzZSBuZWFybHkgYXMgbXVjaCBzdGFjayBhcyBwY3JlX2V4ZWMoKQogICAgbW9zdCBvZiB0aGUgdGltZSwgaXQgKmNhbiogcnVuIG91dCBpZiBpdCBpcyBnaXZlbiBhIHBhdHRlcm4gdGhhdCBjb250YWlucyBhCiAgICBydW5hd2F5IGluZmluaXRlIHJlY3Vyc2lvbi4gSSB1cGRhdGVkIHRoZSBkaXNjdXNzaW9uIGluIHRoZSBwY3Jlc3RhY2sgbWFuCiAgICBwYWdlLgoKMTMuIE5vdyB0aGF0IHdlIGhhdmUgZ29uZSB0byB0aGUgeC54eCBzdHlsZSBvZiB2ZXJzaW9uIG51bWJlcnMsIHRoZSBtaW5vcgogICAgdmVyc2lvbiBtYXkgc3RhcnQgd2l0aCB6ZXJvLiBVc2luZyAwOCBvciAwOSBpcyBhIGJhZCBpZGVhIGJlY2F1c2UgdXNlcnMKICAgIG1pZ2h0IGNoZWNrIHRoZSB2YWx1ZSBvZiBQQ1JFX01JTk9SIGluIHRoZWlyIGNvZGUsIGFuZCAwOCBvciAwOSBtYXkgYmUKICAgIGludGVycHJldGVkIGFzIGludmFsaWQgb2N0YWwgbnVtYmVycy4gSSd2ZSB1cGRhdGVkIHRoZSBwcmV2aW91cyBjb21tZW50IGluCiAgICBjb25maWd1cmUuYWMsIGFuZCBhbHNvIGFkZGVkIGEgY2hlY2sgdGhhdCBnaXZlcyBhbiBlcnJvciBpZiAwOCBvciAwOSBhcmUKICAgIHVzZWQuCgoxNC4gQ2hhbmdlIDguMDAvMTEgd2FzIG5vdCBxdWl0ZSBjb21wbGV0ZTogY29kZSBoYWQgYmVlbiBhY2NpZGVudGFsbHkgb21pdHRlZCwKICAgIGNhdXNpbmcgcGFydGlhbCBtYXRjaGluZyB0byBmYWlsIHdoZW4gdGhlIGVuZCBvZiB0aGUgc3ViamVjdCBtYXRjaGVkIFxXCiAgICBpbiBhIFVURi04IHBhdHRlcm4gd2hlcmUgXFcgd2FzIHF1YW50aWZpZWQgd2l0aCBhIG1pbmltdW0gb2YgMy4KCjE1LiBUaGVyZSB3ZXJlIHNvbWUgZGlzY3JlcGFuY2llcyBiZXR3ZWVuIHRoZSBkZWNsYXJhdGlvbnMgaW4gcGNyZV9pbnRlcm5hbC5oCiAgICBvZiBfcGNyZV9pc19uZXdsaW5lKCksIF9wY3JlX3dhc19uZXdsaW5lKCksIGFuZCBfcGNyZV92YWxpZF91dGY4KCkgYW5kCiAgICB0aGVpciBkZWZpbml0aW9ucy4gVGhlIGRlY2xhcmF0aW9ucyB1c2VkICJjb25zdCB1c2NoYXIgKiIgYW5kIHRoZQogICAgZGVmaW5pdGlvbnMgdXNlZCBVU1BUUi4gRXZlbiB0aG91Z2ggVVNQVFIgaXMgbm9ybWFsbHkgZGVmaW5lZCBhcyAiY29uc3QKICAgIHVuc2lnbmVkIGNoYXIgKiIgKGFuZCB1c2NoYXIgaXMgdHlwZWRlZmZlZCBhcyAidW5zaWduZWQgY2hhciIpLCBpdCB3YXMKICAgIHJlcG9ydGVkIHRoYXQ6ICJUaGlzIGRpZmZlcmVuY2UgaW4gY2FzdGluZyBjb25mdXNlcyBzb21lIEMrKyBjb21waWxlcnMsIGZvcgogICAgZXhhbXBsZSwgU3VuQ0MgcmVjb2duaXplcyBhYm92ZSBkZWNsYXJhdGlvbnMgYXMgZGlmZmVyZW50IGZ1bmN0aW9ucyBhbmQKICAgIGdlbmVyYXRlcyBicm9rZW4gY29kZSBmb3IgaGJwY3JlLiIgSSBoYXZlIGNoYW5nZWQgdGhlIGRlY2xhcmF0aW9ucyB0byB1c2UKICAgIFVTUFRSLgoKMTYuIEdOVSBsaWJ0b29sIGlzIG5hbWVkIGRpZmZlcmVudGx5IG9uIHNvbWUgc3lzdGVtcy4gVGhlIGF1dG9nZW4uc2ggc2NyaXB0IG5vdwogICAgdHJpZXMgc2V2ZXJhbCB2YXJpYW50cyBzdWNoIGFzIGdsaWJ0b29saXplIChNYWNPU1gpIGFuZCBsaWJ0b29saXplMXgKICAgIChGcmVlQlNEKS4KCjE3LiBBcHBsaWVkIENyYWlnJ3MgcGF0Y2ggdGhhdCBmaXhlcyBhbiBIUCBhQ0MgY29tcGlsZSBlcnJvciBpbiBwY3JlIDguMDAKICAgIChzdHJ0b1hYIHVuZGVmaW5lZCB3aGVuIGNvbXBpbGluZyBwY3JlY3BwLmNjKS4gVGhlIHBhdGNoIGNvbnRhaW5zIHRoaXMKICAgIGNvbW1lbnQ6ICJGaWd1cmUgb3V0IGhvdyB0byBjcmVhdGUgYSBsb25nbG9uZyBmcm9tIGEgc3RyaW5nOiBzdHJ0b2xsIGFuZAogICAgZXF1aXZhbGVudC4gSXQncyBub3QgZW5vdWdoIHRvIGNhbGwgQUNfQ0hFQ0tfRlVOQ1M6IGhwdXggaGFzIGEgc3RydG9sbCwgZm9yCiAgICBpbnN0YW5jZSwgYnV0IGl0IG9ubHkgdGFrZXMgMiBhcmdzIGluc3RlYWQgb2YgMyEiCgoxOC4gQSBzdWJ0bGUgYnVnIGNvbmNlcm5lZCB3aXRoIGJhY2sgcmVmZXJlbmNlcyBoYXMgYmVlbiBmaXhlZCBieSBhIGNoYW5nZSBvZgogICAgc3BlY2lmaWNhdGlvbiwgd2l0aCBhIGNvcnJlc3BvbmRpbmcgY29kZSBmaXguIEEgcGF0dGVybiBzdWNoIGFzCiAgICBeKHhhfD0/XDFhKSskIHdoaWNoIGNvbnRhaW5zIGEgYmFjayByZWZlcmVuY2UgaW5zaWRlIHRoZSBncm91cCB0byB3aGljaCBpdAogICAgcmVmZXJzLCB3YXMgZ2l2aW5nIG1hdGNoZXMgd2hlbiBpdCBzaG91bGRuJ3QuIEZvciBleGFtcGxlLCB4YT14YWFhIHdvdWxkCiAgICBtYXRjaCB0aGF0IHBhdHRlcm4uIEludGVyZXN0aW5nbHksIFBlcmwgKGF0IGxlYXN0IHVwIHRvIDUuMTEuMykgaGFzIHRoZQogICAgc2FtZSBidWcuIFN1Y2ggZ3JvdXBzIGhhdmUgdG8gYmUgcXVhbnRpZmllZCB0byBiZSB1c2VmdWwsIG9yIGNvbnRhaW5lZAogICAgaW5zaWRlIGFub3RoZXIgcXVhbnRpZmllZCBncm91cC4gKElmIHRoZXJlJ3Mgbm8gcmVwZXRpdGlvbiwgdGhlIHJlZmVyZW5jZQogICAgY2FuIG5ldmVyIG1hdGNoLikgVGhlIHByb2JsZW0gYXJpc2VzIGJlY2F1c2UsIGhhdmluZyBsZWZ0IHRoZSBncm91cCBhbmQKICAgIG1vdmVkIG9uIHRvIHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuLCBhIGxhdGVyIGZhaWx1cmUgdGhhdCBiYWNrdHJhY2tzIGludG8KICAgIHRoZSBncm91cCB1c2VzIHRoZSBjYXB0dXJlZCB2YWx1ZSBmcm9tIHRoZSBmaW5hbCBpdGVyYXRpb24gb2YgdGhlIGdyb3VwCiAgICByYXRoZXIgdGhhbiB0aGUgY29ycmVjdCBlYXJsaWVyIG9uZS4gSSBoYXZlIGZpeGVkIHRoaXMgaW4gUENSRSBieSBmb3JjaW5nCiAgICBhbnkgZ3JvdXAgdGhhdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byBpdHNlbGYgdG8gYmUgYW4gYXRvbWljIGdyb3VwOyB0aGF0CiAgICBpcywgdGhlcmUgY2Fubm90IGJlIGFueSBiYWNrdHJhY2tpbmcgaW50byBpdCBvbmNlIGl0IGhhcyBjb21wbGV0ZWQuIFRoaXMgaXMKICAgIHNpbWlsYXIgdG8gcmVjdXJzaXZlIGFuZCBzdWJyb3V0aW5lIGNhbGxzLgoKClZlcnNpb24gOC4wMCAxOS1PY3QtMDkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gIFRoZSB0YWJsZSBmb3IgdHJhbnNsYXRpbmcgcGNyZV9jb21waWxlKCkgZXJyb3IgY29kZXMgaW50byBQT1NJWCBlcnJvciBjb2RlcwogICAgd2FzIG91dC1vZi1kYXRlLCBhbmQgdGhlcmUgd2FzIG5vIGNoZWNrIG9uIHRoZSBwY3JlX2NvbXBpbGUoKSBlcnJvciBjb2RlCiAgICBiZWluZyB3aXRoaW4gdGhlIHRhYmxlLiBUaGlzIGNvdWxkIGxlYWQgdG8gYW4gT0sgcmV0dXJuIGJlaW5nIGdpdmVuIGluCiAgICBlcnJvci4KCjIuICBDaGFuZ2VkIHRoZSBjYWxsIHRvIG9wZW4gYSBzdWJqZWN0IGZpbGUgaW4gcGNyZWdyZXAgZnJvbSBmb3BlbihwYXRobmFtZSwKICAgICJyIikgdG8gZm9wZW4ocGF0aG5hbWUsICJyYiIpLCB3aGljaCBmaXhlZCBhIHByb2JsZW0gd2l0aCBzb21lIG9mIHRoZSB0ZXN0cwogICAgaW4gYSBXaW5kb3dzIGVudmlyb25tZW50LgoKMy4gIFRoZSBwY3JlZ3JlcCAtLWNvdW50IG9wdGlvbiBwcmludHMgdGhlIGNvdW50IGZvciBlYWNoIGZpbGUgZXZlbiB3aGVuIGl0IGlzCiAgICB6ZXJvLCBhcyBkb2VzIEdOVSBncmVwLiBIb3dldmVyLCBwY3JlZ3JlcCB3YXMgYWxzbyBwcmludGluZyBhbGwgZmlsZXMgd2hlbgogICAgLS1maWxlcy13aXRoLW1hdGNoZXMgd2FzIGFkZGVkLiBOb3csIHdoZW4gYm90aCBvcHRpb25zIGFyZSBnaXZlbiwgaXQgcHJpbnRzCiAgICBjb3VudHMgb25seSBmb3IgdGhvc2UgZmlsZXMgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZSBtYXRjaC4gKEdOVSBncmVwIGp1c3QKICAgIHByaW50cyB0aGUgZmlsZSBuYW1lIGluIHRoaXMgY2lyY3Vtc3RhbmNlLCBidXQgaW5jbHVkaW5nIHRoZSBjb3VudCBzZWVtcwogICAgbW9yZSB1c2VmdWwgLSBvdGhlcndpc2UsIHdoeSB1c2UgLS1jb3VudD8pIEFsc28gZW5zdXJlZCB0aGF0IHRoZQogICAgY29tYmluYXRpb24gLWNsaCBqdXN0IGxpc3RzIG5vbi16ZXJvIGNvdW50cywgd2l0aCBubyBuYW1lcy4KCjQuICBUaGUgbG9uZyBmb3JtIG9mIHRoZSBwY3JlZ3JlcCAtRiBvcHRpb24gd2FzIGluY29ycmVjdGx5IGltcGxlbWVudGVkIGFzCiAgICAtLWZpeGVkX3N0cmluZ3MgaW5zdGVhZCBvZiAtLWZpeGVkLXN0cmluZ3MuIFRoaXMgaXMgYW4gaW5jb21wYXRpYmxlIGNoYW5nZSwKICAgIGJ1dCBpdCBzZWVtcyByaWdodCB0byBmaXggaXQsIGFuZCBJIGRpZG4ndCB0aGluayBpdCB3YXMgd29ydGggcHJlc2VydmluZwogICAgdGhlIG9sZCBiZWhhdmlvdXIuCgo1LiAgVGhlIGNvbW1hbmQgbGluZSBpdGVtcyAtLXJlZ2V4PXBhdHRlcm4gYW5kIC0tcmVnZXhwPXBhdHRlcm4gd2VyZSBub3QKICAgIHJlY29nbml6ZWQgYnkgcGNyZWdyZXAsIHdoaWNoIHJlcXVpcmVkIC0tcmVnZXggcGF0dGVybiBvciAtLXJlZ2V4cCBwYXR0ZXJuCiAgICAod2l0aCBhIHNwYWNlIHJhdGhlciB0aGFuIGFuICc9JykuIFRoZSBtYW4gcGFnZSBkb2N1bWVudGVkIHRoZSAnPScgZm9ybXMsCiAgICB3aGljaCBhcmUgY29tcGF0aWJsZSB3aXRoIEdOVSBncmVwOyB0aGVzZSBub3cgd29yay4KCjYuICBObyBsaWJwY3JlcG9zaXgucGMgZmlsZSB3YXMgY3JlYXRlZCBmb3IgcGtnLWNvbmZpZzsgdGhlcmUgd2FzIGp1c3QKICAgIGxpYnBjcmUucGMgYW5kIGxpYnBjcmVjcHAucGMuIFRoZSBvbWlzc2lvbiBoYXMgYmVlbiByZWN0aWZpZWQuCgo3LiAgQWRkZWQgI2lmbmRlZiBTVVBQT1JUX1VDUCBpbnRvIHRoZSBwY3JlX3VjZC5jIG1vZHVsZSwgdG8gcmVkdWNlIGl0cyBzaXplCiAgICB3aGVuIFVDUCBzdXBwb3J0IGlzIG5vdCBuZWVkZWQsIGJ5IG1vZGlmeWluZyB0aGUgUHl0aG9uIHNjcmlwdCB0aGF0CiAgICBnZW5lcmF0ZXMgaXQgZnJvbSBVbmljb2RlIGRhdGEgZmlsZXMuIFRoaXMgc2hvdWxkIG5vdCBtYXR0ZXIgaWYgdGhlIG1vZHVsZQogICAgaXMgY29ycmVjdGx5IHVzZWQgYXMgYSBsaWJyYXJ5LCBidXQgSSByZWNlaXZlZCBvbmUgY29tcGxhaW50IGFib3V0IDUwSyBvZgogICAgdW53YW50ZWQgZGF0YS4gTXkgZ3Vlc3MgaXMgdGhhdCB0aGUgcGVyc29uIGxpbmtlZCBldmVyeXRoaW5nIGludG8gaGlzCiAgICBwcm9ncmFtIHJhdGhlciB0aGFuIHVzaW5nIGEgbGlicmFyeS4gQW55d2F5LCBpdCBkb2VzIG5vIGhhcm0uCgo4LiAgQSBwYXR0ZXJuIHN1Y2ggYXMgL1x4ezEyM317MiwyfSsvOCB3YXMgaW5jb3JyZWN0bHkgY29tcGlsZWQ7IHRoZSB0cmlnZ2VyCiAgICB3YXMgYSBtaW5pbXVtIGdyZWF0ZXIgdGhhbiAxIGZvciBhIHdpZGUgY2hhcmFjdGVyIGluIGEgcG9zc2Vzc2l2ZQogICAgcmVwZXRpdGlvbi4gVGhlIHNhbWUgYnVnIGNvdWxkIGFsc28gYWZmZWN0IHBhdHRlcm5zIGxpa2UgLyhceHtmZn17MCwyfSkqLzgKICAgIHdoaWNoIGhhZCBhbiB1bmxpbWl0ZWQgcmVwZWF0IG9mIGEgbmVzdGVkLCBmaXhlZCBtYXhpbXVtIHJlcGVhdCBvZiBhIHdpZGUKICAgIGNoYXJhY3Rlci4gQ2hhb3MgaW4gdGhlIGZvcm0gb2YgaW5jb3JyZWN0IG91dHB1dCBvciBhIGNvbXBpbGluZyBsb29wIGNvdWxkCiAgICByZXN1bHQuCgo5LiAgVGhlIHJlc3RyaWN0aW9ucyBvbiB3aGF0IGEgcGF0dGVybiBjYW4gY29udGFpbiB3aGVuIHBhcnRpYWwgbWF0Y2hpbmcgaXMKICAgIHJlcXVlc3RlZCBmb3IgcGNyZV9leGVjKCkgaGF2ZSBiZWVuIHJlbW92ZWQuIEFsbCBwYXR0ZXJucyBjYW4gbm93IGJlCiAgICBwYXJ0aWFsbHkgbWF0Y2hlZCBieSB0aGlzIGZ1bmN0aW9uLiBJbiBhZGRpdGlvbiwgaWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3bwogICAgc2xvdHMgaW4gdGhlIG9mZnNldCB2ZWN0b3IsIHRoZSBvZmZzZXQgb2YgdGhlIGVhcmxpZXN0IGluc3BlY3RlZCBjaGFyYWN0ZXIKICAgIGZvciB0aGUgbWF0Y2ggYW5kIHRoZSBvZmZzZXQgb2YgdGhlIGVuZCBvZiB0aGUgc3ViamVjdCBhcmUgc2V0IGluIHRoZW0gd2hlbgogICAgUENSRV9FUlJPUl9QQVJUSUFMIGlzIHJldHVybmVkLgoKMTAuIFBhcnRpYWwgbWF0Y2hpbmcgaGFzIGJlZW4gc3BsaXQgaW50byB0d28gZm9ybXM6IFBDUkVfUEFSVElBTF9TT0ZULCB3aGljaCBpcwogICAgc3lub255bW91cyB3aXRoIFBDUkVfUEFSVElBTCwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhbmQKICAgIFBDUkVfUEFSVElBTF9IQVJELCB3aGljaCBjYXVzZXMgYSBwYXJ0aWFsIG1hdGNoIHRvIHN1cGVyc2VkZSBhIGZ1bGwgbWF0Y2gsCiAgICBhbmQgbWF5IGJlIG1vcmUgdXNlZnVsIGZvciBtdWx0aS1zZWdtZW50IG1hdGNoaW5nLgoKMTEuIFBhcnRpYWwgbWF0Y2hpbmcgd2l0aCBwY3JlX2V4ZWMoKSBpcyBub3cgbW9yZSBpbnR1aXRpdmUuIEEgcGFydGlhbCBtYXRjaAogICAgdXNlZCB0byBiZSBnaXZlbiBpZiBldmVyIHRoZSBlbmQgb2YgdGhlIHN1YmplY3Qgd2FzIHJlYWNoZWQ7IG5vdyBpdCBpcwogICAgZ2l2ZW4gb25seSBpZiBtYXRjaGluZyBjb3VsZCBub3QgcHJvY2VlZCBiZWNhdXNlIGFub3RoZXIgY2hhcmFjdGVyIHdhcwogICAgbmVlZGVkLiBUaGlzIG1ha2VzIGEgZGlmZmVyZW5jZSBpbiBzb21lIG9kZCBjYXNlcyBzdWNoIGFzIFooKkZBSUwpIHdpdGggdGhlCiAgICBzdHJpbmcgIloiLCB3aGljaCBub3cgeWllbGRzICJubyBtYXRjaCIgaW5zdGVhZCBvZiAicGFydGlhbCBtYXRjaCIuIEluIHRoZQogICAgY2FzZSBvZiBwY3JlX2RmYV9leGVjKCksICJubyBtYXRjaCIgaXMgZ2l2ZW4gaWYgZXZlcnkgbWF0Y2hpbmcgcGF0aCBmb3IgdGhlCiAgICBmaW5hbCBjaGFyYWN0ZXIgZW5kZWQgd2l0aCAoKkZBSUwpLgoKMTIuIFJlc3RhcnRpbmcgYSBtYXRjaCB1c2luZyBwY3JlX2RmYV9leGVjKCkgYWZ0ZXIgYSBwYXJ0aWFsIG1hdGNoIGRpZCBub3Qgd29yawogICAgaWYgdGhlIHBhdHRlcm4gaGFkIGEgIm11c3QgY29udGFpbiIgY2hhcmFjdGVyIHRoYXQgd2FzIGFscmVhZHkgZm91bmQgaW4gdGhlCiAgICBlYXJsaWVyIHBhcnRpYWwgbWF0Y2gsIHVubGVzcyBwYXJ0aWFsIG1hdGNoaW5nIHdhcyBhZ2FpbiByZXF1ZXN0ZWQuIEZvcgogICAgZXhhbXBsZSwgd2l0aCB0aGUgcGF0dGVybiAvZG9nLihib2R5KT8vLCB0aGUgIm11c3QgY29udGFpbiIgY2hhcmFjdGVyIGlzCiAgICAiZyIuIElmIHRoZSBmaXJzdCBwYXJ0LW1hdGNoIHdhcyBmb3IgdGhlIHN0cmluZyAiZG9nIiwgcmVzdGFydGluZyB3aXRoCiAgICAic2JvZHkiIGZhaWxlZC4gVGhpcyBidWcgaGFzIGJlZW4gZml4ZWQuCgoxMy4gVGhlIHN0cmluZyByZXR1cm5lZCBieSBwY3JlX2RmYV9leGVjKCkgYWZ0ZXIgYSBwYXJ0aWFsIG1hdGNoIGhhcyBiZWVuCiAgICBjaGFuZ2VkIHNvIHRoYXQgaXQgc3RhcnRzIGF0IHRoZSBmaXJzdCBpbnNwZWN0ZWQgY2hhcmFjdGVyIHJhdGhlciB0aGFuIHRoZQogICAgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBtYXRjaC4gVGhpcyBtYWtlcyBhIGRpZmZlcmVuY2Ugb25seSBpZiB0aGUgcGF0dGVybgogICAgc3RhcnRzIHdpdGggYSBsb29rYmVoaW5kIGFzc2VydGlvbiBvciBcYiBvciBcQiAoXEsgaXMgbm90IHN1cHBvcnRlZCBieQogICAgcGNyZV9kZmFfZXhlYygpKS4gSXQncyBhbiBpbmNvbXBhdGlibGUgY2hhbmdlLCBidXQgaXQgbWFrZXMgdGhlIHR3bwogICAgbWF0Y2hpbmcgZnVuY3Rpb25zIGNvbXBhdGlibGUsIGFuZCBJIHRoaW5rIGl0J3MgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLgoKMTQuIEFkZGVkIGEgcGNyZWRlbW8gbWFuIHBhZ2UsIGNyZWF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBwY3JlZGVtby5jIGZpbGUsCiAgICBzbyB0aGF0IHRoZSBkZW1vbnN0cmF0aW9uIHByb2dyYW0gaXMgZWFzaWx5IGF2YWlsYWJsZSBpbiBlbnZpcm9ubWVudHMgd2hlcmUKICAgIFBDUkUgaGFzIG5vdCBiZWVuIGluc3RhbGxlZCBmcm9tIHNvdXJjZS4KCjE1LiBBcnJhbmdlZCB0byBhZGQgLURQQ1JFX1NUQVRJQyB0byBjZmxhZ3MgaW4gbGlicGNyZS5wYywgbGlicGNyZXBvc2l4LmNwLAogICAgbGlicGNyZWNwcC5wYyBhbmQgcGNyZS1jb25maWcgd2hlbiBQQ1JFIGlzIG5vdCBjb21waWxlZCBhcyBhIHNoYXJlZAogICAgbGlicmFyeS4KCjE2LiBBZGRlZCBSRUdfVU5HUkVFRFkgdG8gdGhlIHBjcmVwb3NpeCBpbnRlcmZhY2UsIGF0IHRoZSByZXF1ZXN0IG9mIGEgdXNlci4KICAgIEl0IG1hcHMgdG8gUENSRV9VTkdSRUVEWS4gSXQgaXMgbm90LCBvZiBjb3Vyc2UsIFBPU0lYLWNvbXBhdGlibGUsIGJ1dCBpdAogICAgaXMgbm90IHRoZSBmaXJzdCBub24tUE9TSVggb3B0aW9uIHRvIGJlIGFkZGVkLiBDbGVhcmx5IHNvbWUgcGVvcGxlIGZpbmQKICAgIHRoZXNlIG9wdGlvbnMgdXNlZnVsLgoKMTcuIElmIGEgY2FsbGVyIHRvIHRoZSBQT1NJWCBtYXRjaGluZyBmdW5jdGlvbiByZWdleGVjKCkgcGFzc2VzIGEgbm9uLXplcm8KICAgIHZhbHVlIGZvciBubWF0Y2ggd2l0aCBhIE5VTEwgdmFsdWUgZm9yIHBtYXRjaCwgdGhlIHZhbHVlIG9mCiAgICBubWF0Y2ggaXMgZm9yY2VkIHRvIHplcm8uCgoxOC4gUnVuR3JlcFRlc3QgZGlkIG5vdCBoYXZlIGEgdGVzdCBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgLXUgb3B0aW9uIG9mCiAgICB0aGUgZGlmZiBjb21tYW5kLCBhcyBSdW5UZXN0IGRvZXMuIEl0IG5vdyBjaGVja3MgaW4gdGhlIHNhbWUgd2F5IGFzCiAgICBSdW5UZXN0LCBhbmQgYWxzbyBjaGVja3MgZm9yIHRoZSAtYiBvcHRpb24uCgoxOS4gSWYgYW4gb2RkIG51bWJlciBvZiBuZWdhdGVkIGNsYXNzZXMgY29udGFpbmluZyBqdXN0IGEgc2luZ2xlIGNoYXJhY3RlcgogICAgaW50ZXJwb3NlZCwgd2l0aGluIHBhcmVudGhlc2VzLCBiZXR3ZWVuIGEgZm9yd2FyZCByZWZlcmVuY2UgdG8gYSBuYW1lZAogICAgc3VicGF0dGVybiBhbmQgdGhlIGRlZmluaXRpb24gb2YgdGhlIHN1YnBhdHRlcm4sIGNvbXBpbGF0aW9uIGNyYXNoZWQgd2l0aAogICAgYW4gaW50ZXJuYWwgZXJyb3IsIGNvbXBsYWluaW5nIHRoYXQgaXQgY291bGQgbm90IGZpbmQgdGhlIHJlZmVyZW5jZWQKICAgIHN1YnBhdHRlcm4uIEFuIGV4YW1wbGUgb2YgYSBjcmFzaGluZyBwYXR0ZXJuIGlzIC8oPyZBKSgoW15tXSkoPzxBPikpLy4KICAgIFtUaGUgYnVnIHdhcyB0aGF0IGl0IHdhcyBzdGFydGluZyBvbmUgY2hhcmFjdGVyIHRvbyBmYXIgaW4gd2hlbiBza2lwcGluZwogICAgb3ZlciB0aGUgY2hhcmFjdGVyIGNsYXNzLCB0aHVzIHRyZWF0aW5nIHRoZSBdIGFzIGRhdGEgcmF0aGVyIHRoYW4KICAgIHRlcm1pbmF0aW5nIHRoZSBjbGFzcy4gVGhpcyBtZWFudCBpdCBjb3VsZCBza2lwIHRvbyBtdWNoLl0KCjIwLiBBZGRlZCBQQ1JFX05PVEVNUFRZX0FUU1RBUlQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZQogICAgL2cgb3B0aW9uIGluIHBjcmV0ZXN0IHdoZW4gdGhlIHBhdHRlcm4gY29udGFpbnMgXEssIHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlCiAgICB0byBoYXZlIGFuIGVtcHR5IHN0cmluZyBtYXRjaCBub3QgYXQgdGhlIHN0YXJ0LCBldmVuIHdoZW4gdGhlIHBhdHRlcm4gaXMKICAgIGFuY2hvcmVkLiBVcGRhdGVkIHBjcmV0ZXN0IGFuZCBwY3JlZGVtbyB0byB1c2UgdGhpcyBvcHRpb24uCgoyMS4gSWYgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNhcHR1cmluZyBzdWJwYXR0ZXJucyBpbiBhIHJlY3Vyc2lvbiB3YXMgZ3JlYXRlcgogICAgdGhhbiB0aGUgbWF4aW11bSBhdCB0aGUgb3V0ZXIgbGV2ZWwsIHRoZSBoaWdoZXIgbnVtYmVyIHdhcyByZXR1cm5lZCwgYnV0CiAgICB3aXRoIHVuc2V0IHZhbHVlcyBhdCB0aGUgb3V0ZXIgbGV2ZWwuIFRoZSBjb3JyZWN0IChvdXRlciBsZXZlbCkgdmFsdWUgaXMKICAgIG5vdyBnaXZlbi4KCjIyLiBJZiAoKkFDQ0VQVCkgYXBwZWFyZWQgaW5zaWRlIGNhcHR1cmluZyBwYXJlbnRoZXNlcywgcHJldmlvdXMgcmVsZWFzZXMgb2YKICAgIFBDUkUgZGlkIG5vdCBzZXQgdGhvc2UgcGFyZW50aGVzZXMgKHVubGlrZSBQZXJsKS4gSSBoYXZlIG5vdyBmb3VuZCBhIHdheSB0bwogICAgbWFrZSBpdCBkbyBzby4gVGhlIHN0cmluZyBzbyBmYXIgaXMgY2FwdHVyZWQsIG1ha2luZyB0aGlzIGZlYXR1cmUKICAgIGNvbXBhdGlibGUgd2l0aCBQZXJsLgoKMjMuIFRoZSB0ZXN0cyBoYXZlIGJlZW4gcmUtb3JnYW5pemVkLCBhZGRpbmcgdGVzdHMgMTEgYW5kIDEyLCB0byBtYWtlIGl0CiAgICBwb3NzaWJsZSB0byBjaGVjayB0aGUgUGVybCA1LjEwIGZlYXR1cmVzIGFnYWluc3QgUGVybCA1LjEwLgoKMjQuIFBlcmwgNS4xMCBhbGxvd3Mgc3Vicm91dGluZSBjYWxscyBpbiBsb29rYmVoaW5kcywgYXMgbG9uZyBhcyB0aGUgc3Vicm91dGluZQogICAgcGF0dGVybiBtYXRjaGVzIGEgZml4ZWQgbGVuZ3RoIHN0cmluZy4gUENSRSBkaWQgbm90IGFsbG93IHRoaXM7IG5vdyBpdAogICAgZG9lcy4gTmVpdGhlciBhbGxvd3MgcmVjdXJzaW9uLgoKMjUuIEkgZmluYWxseSBmaWd1cmVkIG91dCBob3cgdG8gaW1wbGVtZW50IGEgcmVxdWVzdCB0byBwcm92aWRlIHRoZSBtaW5pbXVtCiAgICBsZW5ndGggb2Ygc3ViamVjdCBzdHJpbmcgdGhhdCB3YXMgbmVlZGVkIGluIG9yZGVyIHRvIG1hdGNoIGEgZ2l2ZW4gcGF0dGVybi4KICAgIChJdCB3YXMgYmFjayByZWZlcmVuY2VzIGFuZCByZWN1cnNpb24gdGhhdCBJIGhhZCBwcmV2aW91c2x5IGdvdCBodW5nIHVwCiAgICBvbi4pIFRoaXMgY29kZSBoYXMgbm93IGJlZW4gYWRkZWQgdG8gcGNyZV9zdHVkeSgpOyBpdCBmaW5kcyBhIGxvd2VyIGJvdW5kCiAgICB0byB0aGUgbGVuZ3RoIG9mIHN1YmplY3QgbmVlZGVkLiBJdCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGdyZWF0ZXN0IGxvd2VyCiAgICBib3VuZCwgYnV0IHVzaW5nIGl0IHRvIGF2b2lkIHNlYXJjaGluZyBzdHJpbmdzIHRoYXQgYXJlIHRvbyBzaG9ydCBkb2VzIGdpdmUKICAgIHNvbWUgdXNlZnVsIHNwZWVkLXVwcy4gVGhlIHZhbHVlIGlzIGF2YWlsYWJsZSB0byBjYWxsaW5nIHByb2dyYW1zIHZpYQogICAgcGNyZV9mdWxsaW5mbygpLgoKMjYuIFdoaWxlIGltcGxlbWVudGluZyAyNSwgSSBkaXNjb3ZlcmVkIHRvIG15IGVtYmFycmFzc21lbnQgdGhhdCBwY3JldGVzdCBoYWQKICAgIG5vdCBiZWVuIHBhc3NpbmcgdGhlIHJlc3VsdCBvZiBwY3JlX3N0dWR5KCkgdG8gcGNyZV9kZmFfZXhlYygpLCBzbyB0aGUKICAgIHN0dWR5IG9wdGltaXphdGlvbnMgaGFkIG5ldmVyIGJlZW4gdGVzdGVkIHdpdGggdGhhdCBtYXRjaGluZyBmdW5jdGlvbi4KICAgIE9vcHMuIFdoYXQgaXMgd29yc2UsIGV2ZW4gd2hlbiBpdCB3YXMgcGFzc2VkIHN0dWR5IGRhdGEsIHRoZXJlIHdhcyBhIGJ1ZyBpbgogICAgcGNyZV9kZmFfZXhlYygpIHRoYXQgbWVhbnQgaXQgbmV2ZXIgYWN0dWFsbHkgdXNlZCBpdC4gRG91YmxlIG9vcHMuIFRoZXJlCiAgICB3ZXJlIGFsc28gdmVyeSBmZXcgdGVzdHMgb2Ygc3R1ZGllZCBwYXR0ZXJucyB3aXRoIHBjcmVfZGZhX2V4ZWMoKS4KCjI3LiBJZiAoP3wgaXMgdXNlZCB0byBjcmVhdGUgc3VicGF0dGVybnMgd2l0aCBkdXBsaWNhdGUgbnVtYmVycywgdGhleSBhcmUgbm93CiAgICBhbGxvd2VkIHRvIGhhdmUgdGhlIHNhbWUgbmFtZSwgZXZlbiBpZiBQQ1JFX0RVUE5BTUVTIGlzIG5vdCBzZXQuIEhvd2V2ZXIsCiAgICBvbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgY29pbiwgdGhleSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgdG8gaGF2ZSBkaWZmZXJlbnQKICAgIG5hbWVzLCBiZWNhdXNlIHRoZXNlIGNhbm5vdCBiZSBkaXN0aW5ndWlzaGVkIGluIFBDUkUsIGFuZCB0aGlzIGhhcyBjYXVzZWQKICAgIGNvbmZ1c2lvbi4gKFRoaXMgaXMgYSBkaWZmZXJlbmNlIGZyb20gUGVybC4pCgoyOC4gV2hlbiBkdXBsaWNhdGUgc3VicGF0dGVybiBuYW1lcyBhcmUgcHJlc2VudCAobmVjZXNzYXJpbHkgd2l0aCBkaWZmZXJlbnQKICAgIG51bWJlcnMsIGFzIHJlcXVpcmVkIGJ5IDI3IGFib3ZlKSwgYW5kIGEgdGVzdCBpcyBtYWRlIGJ5IG5hbWUgaW4gYQogICAgY29uZGl0aW9uYWwgcGF0dGVybiwgZWl0aGVyIGZvciBhIHN1YnBhdHRlcm4gaGF2aW5nIGJlZW4gbWF0Y2hlZCwgb3IgZm9yCiAgICByZWN1cnNpb24gaW4gc3VjaCBhIHBhdHRlcm4sIGFsbCB0aGUgYXNzb2NpYXRlZCBudW1iZXJlZCBzdWJwYXR0ZXJucyBhcmUKICAgIHRlc3RlZCwgYW5kIHRoZSBvdmVyYWxsIGNvbmRpdGlvbiBpcyB0cnVlIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBmb3IgYW55CiAgICBvbmUgb2YgdGhlbS4gVGhpcyBpcyB0aGUgd2F5IFBlcmwgd29ya3MsIGFuZCBpcyBhbHNvIG1vcmUgbGlrZSB0aGUgd2F5CiAgICB0ZXN0aW5nIGJ5IG51bWJlciB3b3Jrcy4KCgpWZXJzaW9uIDcuOSAxMS1BcHItMDkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiAgV2hlbiBidWlsZGluZyB3aXRoIHN1cHBvcnQgZm9yIGJ6bGliL3psaWIgKHBjcmVncmVwKSBhbmQvb3IgcmVhZGxpbmUKICAgIChwY3JldGVzdCksIGFsbCB0YXJnZXRzIHdlcmUgbGlua2VkIGFnYWluc3QgdGhlc2UgbGlicmFyaWVzLiBUaGlzIGluY2x1ZGVkCiAgICBsaWJwY3JlLCBsaWJwY3JlcG9zaXgsIGFuZCBsaWJwY3JlY3BwLCBldmVuIHRob3VnaCB0aGV5IGRvIG5vdCB1c2UgdGhlc2UKICAgIGxpYnJhcmllcy4gVGhpcyBjYXVzZWQgdW53YW50ZWQgZGVwZW5kZW5jaWVzIHRvIGJlIGNyZWF0ZWQuIFRoaXMgcHJvYmxlbQogICAgaGFzIGJlZW4gZml4ZWQsIGFuZCBub3cgb25seSBwY3JlZ3JlcCBpcyBsaW5rZWQgd2l0aCBiemxpYi96bGliIGFuZCBvbmx5CiAgICBwY3JldGVzdCBpcyBsaW5rZWQgd2l0aCByZWFkbGluZS4KCjIuICBUaGUgInR5cGVkZWYgaW50IEJPT0wiIGluIHBjcmVfaW50ZXJuYWwuaCB0aGF0IHdhcyBpbmNsdWRlZCBpbnNpZGUgdGhlCiAgICAiI2lmbmRlZiBGQUxTRSIgY29uZGl0aW9uIGJ5IGFuIGVhcmxpZXIgY2hhbmdlIChwcm9iYWJseSA3LjgvMTgpIGhhcyBiZWVuCiAgICBtb3ZlZCBvdXRzaWRlIGl0IGFnYWluLCBiZWNhdXNlIEZBTFNFIGFuZCBUUlVFIGFyZSBhbHJlYWR5IGRlZmluZWQgaW4gQUlYLAogICAgYnV0IEJPT0wgaXMgbm90LgoKMy4gIFRoZSBwY3JlX2NvbmZpZygpIGZ1bmN0aW9uIHdhcyB0cmVhdGluZyB0aGUgUENSRV9NQVRDSF9MSU1JVCBhbmQKICAgIFBDUkVfTUFUQ0hfTElNSVRfUkVDVVJTSU9OIHZhbHVlcyBhcyBpbnRzLCB3aGVuIHRoZXkgc2hvdWxkIGJlIGxvbmcgaW50cy4KCjQuICBUaGUgcGNyZWdyZXAgZG9jdW1lbnRhdGlvbiBzYWlkIHNwYWNlcyB3ZXJlIGluc2VydGVkIGFzIHdlbGwgYXMgY29sb25zIChvcgogICAgaHlwaGVucykgZm9sbG93aW5nIGZpbGUgbmFtZXMgYW5kIGxpbmUgbnVtYmVycyB3aGVuIG91dHB1dHRpbmcgbWF0Y2hpbmcKICAgIGxpbmVzLiBUaGlzIGlzIG5vdCB0cnVlOyBubyBzcGFjZXMgYXJlIGluc2VydGVkLiBJIGhhdmUgYWxzbyBjbGFyaWZpZWQgdGhlCiAgICB3b3JkaW5nIGZvciB0aGUgLS1jb2xvdXIgKG9yIC0tY29sb3IpIG9wdGlvbi4KCjUuICBJbiBwY3JlZ3JlcCwgd2hlbiAtLWNvbG91ciB3YXMgdXNlZCB3aXRoIC1vLCB0aGUgbGlzdCBvZiBtYXRjaGluZyBzdHJpbmdzCiAgICB3YXMgbm90IGNvbG91cmVkOyB0aGlzIGlzIGRpZmZlcmVudCB0byBHTlUgZ3JlcCwgc28gSSBoYXZlIGNoYW5nZWQgaXQgdG8gYmUKICAgIHRoZSBzYW1lLgoKNi4gIFdoZW4gLS1jb2xvKHUpciB3YXMgdXNlZCBpbiBwY3JlZ3JlcCwgb25seSB0aGUgZmlyc3QgbWF0Y2hpbmcgc3Vic3RyaW5nIGluCiAgICBlYWNoIG1hdGNoaW5nIGxpbmUgd2FzIGNvbG91cmVkLiBOb3cgaXQgZ29lcyBvbiB0byBsb29rIGZvciBmdXJ0aGVyIG1hdGNoZXMKICAgIG9mIGFueSBvZiB0aGUgdGVzdCBwYXR0ZXJucywgd2hpY2ggaXMgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIEdOVSBncmVwLgoKNy4gIEEgcGF0dGVybiB0aGF0IGNvdWxkIG1hdGNoIGFuIGVtcHR5IHN0cmluZyBjb3VsZCBjYXVzZSBwY3JlZ3JlcCB0byBsb29wOyBpdAogICAgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGFjY2VwdCBhbiBlbXB0eSBzdHJpbmcgbWF0Y2ggaW4gcGNyZWdyZXAsIHNvIEkgaGF2ZQogICAgbG9ja2VkIGl0IG91dCAodXNpbmcgUENSRSdzIFBDUkVfTk9URU1QVFkgb3B0aW9uKS4gQnkgZXhwZXJpbWVudCwgdGhpcwogICAgc2VlbXMgdG8gYmUgaG93IEdOVSBncmVwIGJlaGF2ZXMuCgo4LiAgVGhlIHBhdHRlcm4gKD8oPz0uKmIpYnxeKSB3YXMgaW5jb3JyZWN0bHkgY29tcGlsZWQgYXMgIm1hdGNoIG11c3QgYmUgYXQKICAgIHN0YXJ0IG9yIGFmdGVyIGEgbmV3bGluZSIsIGJlY2F1c2UgdGhlIGNvbmRpdGlvbmFsIGFzc2VydGlvbiB3YXMgbm90IGJlaW5nCiAgICBjb3JyZWN0bHkgaGFuZGxlZC4gVGhlIHJ1bGUgbm93IGlzIHRoYXQgYm90aCB0aGUgYXNzZXJ0aW9uIGFuZCB3aGF0IGZvbGxvd3MKICAgIGluIHRoZSBmaXJzdCBhbHRlcm5hdGl2ZSBtdXN0IHNhdGlzZnkgdGhlIHRlc3QuCgo5LiAgSWYgYXV0by1jYWxsb3V0IHdhcyBlbmFibGVkIGluIGEgcGF0dGVybiB3aXRoIGEgY29uZGl0aW9uYWwgZ3JvdXAgd2hvc2UKICAgIGNvbmRpdGlvbiB3YXMgYW4gYXNzZXJ0aW9uLCBQQ1JFIGNvdWxkIGNyYXNoIGR1cmluZyBtYXRjaGluZywgYm90aCB3aXRoCiAgICBwY3JlX2V4ZWMoKSBhbmQgcGNyZV9kZmFfZXhlYygpLgoKMTAuIFRoZSBQQ1JFX0RPTExBUl9FTkRPTkxZIG9wdGlvbiB3YXMgbm90IHdvcmtpbmcgd2hlbiBwY3JlX2RmYV9leGVjKCkgd2FzCiAgICB1c2VkIGZvciBtYXRjaGluZy4KCjExLiBVbmljb2RlIHByb3BlcnR5IHN1cHBvcnQgaW4gY2hhcmFjdGVyIGNsYXNzZXMgd2FzIG5vdCB3b3JraW5nIGZvcgogICAgY2hhcmFjdGVycyAoYnl0ZXMpIGdyZWF0ZXIgdGhhbiAxMjcgd2hlbiBub3QgaW4gVVRGLTggbW9kZS4KCjEyLiBBZGRlZCB0aGUgLU0gY29tbWFuZCBsaW5lIG9wdGlvbiB0byBwY3JldGVzdC4KCjE0LiBBZGRlZCB0aGUgbm9uLXN0YW5kYXJkIFJFR19OT1RFTVBUWSBvcHRpb24gdG8gdGhlIFBPU0lYIGludGVyZmFjZS4KCjE1LiBBZGRlZCB0aGUgUENSRV9OT19TVEFSVF9PUFRJTUlaRSBtYXRjaC10aW1lIG9wdGlvbi4KCjE2LiBBZGRlZCBjb21tZW50cyBhbmQgZG9jdW1lbnRhdGlvbiBhYm91dCBtaXMtdXNlIG9mIG5vX2FyZyBpbiB0aGUgQysrCiAgICB3cmFwcGVyLgoKMTcuIEltcGxlbWVudGVkIHN1cHBvcnQgZm9yIFVURi04IGVuY29kaW5nIGluIEVCQ0RJQyBlbnZpcm9ubWVudHMsIGEgcGF0Y2gKICAgIGZyb20gTWFydGluIEplcmFiZWsgdGhhdCB1c2VzIG1hY3JvIG5hbWVzIGZvciBhbGwgcmVsZXZhbnQgY2hhcmFjdGVyIGFuZAogICAgc3RyaW5nIGNvbnN0YW50cy4KCjE4LiBBZGRlZCB0byBwY3JlX2ludGVybmFsLmggdHdvIGNvbmZpZ3VyYXRpb24gY2hlY2tzOiAoYSkgSWYgYm90aCBFQkNESUMgYW5kCiAgICBTVVBQT1JUX1VURjggYXJlIHNldCwgZ2l2ZSBhbiBlcnJvcjsgKGIpIElmIFNVUFBPUlRfVUNQIGlzIHNldCB3aXRob3V0CiAgICBTVVBQT1JUX1VURjgsIGRlZmluZSBTVVBQT1JUX1VURjguIFRoZSAiY29uZmlndXJlIiBzY3JpcHQgaGFuZGxlcyBib3RoIG9mCiAgICB0aGVzZSwgYnV0IG5vdCBldmVyeWJvZHkgdXNlcyBjb25maWd1cmUuCgoxOS4gQSBjb25kaXRpb25hbCBncm91cCB0aGF0IGhhZCBvbmx5IG9uZSBicmFuY2ggd2FzIG5vdCBiZWluZyBjb3JyZWN0bHkKICAgIHJlY29nbml6ZWQgYXMgYW4gaXRlbSB0aGF0IGNvdWxkIG1hdGNoIGFuIGVtcHR5IHN0cmluZy4gVGhpcyBtZWFudCB0aGF0IGFuCiAgICBlbmNsb3NpbmcgZ3JvdXAgbWlnaHQgYWxzbyBub3QgYmUgc28gcmVjb2duaXplZCwgY2F1c2luZyBpbmZpbml0ZSBsb29waW5nCiAgICAoYW5kIHByb2JhYmx5IGEgc2VnZmF1bHQpIGZvciBwYXR0ZXJucyBzdWNoIGFzIF4iKCg/KD89W2FdKVteIl0pfGIpKiIkCiAgICB3aXRoIHRoZSBzdWJqZWN0ICJhYiIsIHdoZXJlIGtub3dsZWRnZSB0aGF0IHRoZSByZXBlYXRlZCBncm91cCBjYW4gbWF0Y2gKICAgIG5vdGhpbmcgaXMgbmVlZGVkIGluIG9yZGVyIHRvIGJyZWFrIHRoZSBsb29wLgoKMjAuIElmIGEgcGF0dGVybiB0aGF0IHdhcyBjb21waWxlZCB3aXRoIGNhbGxvdXRzIHdhcyBtYXRjaGVkIHVzaW5nIHBjcmVfZGZhXwogICAgZXhlYygpLCBidXQgd2l0aG91dCBzdXBwbHlpbmcgYSBjYWxsb3V0IGZ1bmN0aW9uLCBtYXRjaGluZyB3ZW50IHdyb25nLgoKMjEuIElmIFBDUkVfRVJST1JfTUFUQ0hMSU1JVCBvY2N1cnJlZCBkdXJpbmcgYSByZWN1cnNpb24sIHRoZXJlIHdhcyBhIG1lbW9yeQogICAgbGVhayBpZiB0aGUgc2l6ZSBvZiB0aGUgb2Zmc2V0IHZlY3RvciB3YXMgZ3JlYXRlciB0aGFuIDMwLiBXaGVuIHRoZSB2ZWN0b3IKICAgIGlzIHNtYWxsZXIsIHRoZSBzYXZlZCBvZmZzZXRzIGR1cmluZyByZWN1cnNpb24gZ28gb250byBhIGxvY2FsIHN0YWNrCiAgICB2ZWN0b3IsIGJ1dCBmb3IgbGFyZ2VyIHZlY3RvcnMgbWFsbG9jKCkgaXMgdXNlZC4gSXQgd2FzIGZhaWxpbmcgdG8gZnJlZQogICAgd2hlbiB0aGUgcmVjdXJzaW9uIHlpZWxkZWQgUENSRV9FUlJPUl9NQVRDSF9MSU1JVCAob3IgYW55IG90aGVyICJhYm5vcm1hbCIKICAgIGVycm9yLCBpbiBmYWN0KS4KCjIyLiBUaGVyZSB3YXMgYSBtaXNzaW5nICNpZmRlZiBTVVBQT1JUX1VURjggcm91bmQgb25lIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlCiAgICBoZWFwZnJhbWUgdGhhdCBpcyB1c2VkIG9ubHkgd2hlbiBVVEYtOCBzdXBwb3J0IGlzIGVuYWJsZWQuIFRoaXMgY2F1c2VkIG5vCiAgICBwcm9ibGVtLCBidXQgd2FzIHVudGlkeS4KCjIzLiBTdGV2ZW4gVmFuIEluZ2VsZ2VtJ3MgcGF0Y2ggdG8gQ01ha2VMaXN0cy50eHQgdG8gY2hhbmdlIHRoZSBuYW1lCiAgICBDTUFLRV9CSU5BUllfRElSIHRvIFBST0pFQ1RfQklOQVJZX0RJUiBzbyB0aGF0IGl0IHdvcmtzIHdoZW4gUENSRSBpcwogICAgaW5jbHVkZWQgd2l0aGluIGFub3RoZXIgcHJvamVjdC4KCjI0LiBTdGV2ZW4gVmFuIEluZ2VsZ2VtJ3MgcGF0Y2hlcyB0byBhZGQgbW9yZSBvcHRpb25zIHRvIHRoZSBDTWFrZSBzdXBwb3J0LAogICAgc2xpZ2h0bHkgbW9kaWZpZWQgYnkgbWU6CgogICAgICAoYSkgUENSRV9CVUlMRF9URVNUUyBjYW4gYmUgc2V0IE9GRiBub3QgdG8gYnVpbGQgdGhlIHRlc3RzLCBpbmNsdWRpbmcKICAgICAgICAgIG5vdCBidWlsZGluZyBwY3JlZ3JlcC4KCiAgICAgIChiKSBQQ1JFX0JVSUxEX1BDUkVHUkVQIGNhbiBiZSBzZWUgT0ZGIG5vdCB0byBidWlsZCBwY3JlZ3JlcCwgYnV0IG9ubHkKICAgICAgICAgIGlmIFBDUkVfQlVJTERfVEVTVFMgaXMgYWxzbyBzZXQgT0ZGLCBiZWNhdXNlIHRoZSB0ZXN0cyB1c2UgcGNyZWdyZXAuCgoyNS4gRm9yd2FyZCByZWZlcmVuY2VzLCBib3RoIG51bWVyaWMgYW5kIGJ5IG5hbWUsIGluIHBhdHRlcm5zIHRoYXQgbWFkZSB1c2Ugb2YKICAgIGR1cGxpY2F0ZSBncm91cCBudW1iZXJzLCBjb3VsZCBiZWhhdmUgaW5jb3JyZWN0bHkgb3IgZ2l2ZSBpbmNvcnJlY3QgZXJyb3JzLAogICAgYmVjYXVzZSB3aGVuIHNjYW5uaW5nIGZvcndhcmQgdG8gZmluZCB0aGUgcmVmZXJlbmNlIGdyb3VwLCBQQ1JFIHdhcyBub3QKICAgIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGR1cGxpY2F0ZSBncm91cCBudW1iZXJzLiBBIHBhdHRlcm4gc3VjaCBhcwogICAgXlgoPzMpKGEpKD98KGIpfChxKSkoWSkgaXMgYW4gZXhhbXBsZS4KCjI2LiBDaGFuZ2VkIGEgZmV3IG1vcmUgaW5zdGFuY2VzIG9mICJjb25zdCB1bnNpZ25lZCBjaGFyICoiIHRvIFVTUFRSLCBtYWtpbmcKICAgIHRoZSBmZWF0dXJlIG9mIGEgY3VzdG9tIHBvaW50ZXIgbW9yZSBwZXJzdWFzaXZlIChhcyByZXF1ZXN0ZWQgYnkgYSB1c2VyKS4KCjI3LiBXcmFwcGVkIHRoZSBkZWZpbml0aW9ucyBvZiBmaWxlbm8gYW5kIGlzYXR0eSBmb3IgV2luZG93cywgd2hpY2ggYXBwZWFyIGluCiAgICBwY3JldGVzdC5jLCBpbnNpZGUgI2lmbmRlZnMsIGJlY2F1c2UgaXQgc2VlbXMgdGhleSBhcmUgc29tZXRpbWVzIGFscmVhZHkKICAgIHByZS1kZWZpbmVkLgoKMjguIEFkZGVkIHN1cHBvcnQgZm9yICgqVVRGOCkgYXQgdGhlIHN0YXJ0IG9mIGEgcGF0dGVybi4KCjI5LiBBcnJhbmdlIGZvciBmbGFncyBhZGRlZCBieSB0aGUgInJlbGVhc2UgdHlwZSIgc2V0dGluZyBpbiBDTWFrZSB0byBiZSBzaG93bgogICAgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3VtbWFyeS4KCgpWZXJzaW9uIDcuOCAwNS1TZXAtMDgKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiAgUmVwbGFjZWQgVUNQIHNlYXJjaGluZyBjb2RlIHdpdGggb3B0aW1pemVkIHZlcnNpb24gYXMgaW1wbGVtZW50ZWQgZm9yIEFkCiAgICBNdW5jaGVyIChodHRwOi8vd3d3LmFkbXVuY2hlci5jb20vKSBieSBQZXRlciBLYW5rb3dza2kuIFRoaXMgdXNlcyBhIHR3by0KICAgIHN0YWdlIHRhYmxlIGFuZCBpbmxpbmUgbG9va3VwIGluc3RlYWQgb2YgYSBmdW5jdGlvbiwgZ2l2aW5nIHNwZWVkIHVwcyBvZiAyCiAgICB0byA1IHRpbWVzIG9uIHNvbWUgc2ltcGxlIHBhdHRlcm5zIHRoYXQgSSB0ZXN0ZWQuIFBlcm1pc3Npb24gd2FzIGdpdmVuIHRvCiAgICBkaXN0cmlidXRlIHRoZSBNdWx0aVN0YWdlMi5weSBzY3JpcHQgdGhhdCBnZW5lcmF0ZXMgdGhlIHRhYmxlcyAoaXQncyBub3QgaW4KICAgIHRoZSB0YXJiYWxsLCBidXQgaXMgaW4gdGhlIFN1YnZlcnNpb24gcmVwb3NpdG9yeSkuCgoyLiAgVXBkYXRlZCB0aGUgVW5pY29kZSBkYXRhdGFibGVzIHRvIFVuaWNvZGUgNS4xLjAuIFRoaXMgYWRkcyB5ZXQgbW9yZQogICAgc2NyaXB0cy4KCjMuICBDaGFuZ2UgMTIgZm9yIDcuNyBpbnRyb2R1Y2VkIGEgYnVnIGluIHBjcmVfc3R1ZHkoKSB3aGVuIGEgcGF0dGVybiBjb250YWluZWQKICAgIGEgZ3JvdXAgd2l0aCBhIHplcm8gcXVhbGlmaWVyLiBUaGUgcmVzdWx0IG9mIHRoZSBzdHVkeSBjb3VsZCBiZSBpbmNvcnJlY3QsCiAgICBvciB0aGUgZnVuY3Rpb24gbWlnaHQgY3Jhc2gsIGRlcGVuZGluZyBvbiB0aGUgcGF0dGVybi4KCjQuICBDYXNlbGVzcyBtYXRjaGluZyB3YXMgbm90IHdvcmtpbmcgZm9yIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIGJhY2sKICAgIHJlZmVyZW5jZXMuIEZvciBleGFtcGxlLCAvKFx4e2RlfSlcMS84aSB3YXMgbm90IG1hdGNoaW5nIFx4e2RlfVx4e2ZlfS4KICAgIEl0IG5vdyB3b3JrcyB3aGVuIFVuaWNvZGUgUHJvcGVydHkgU3VwcG9ydCBpcyBhdmFpbGFibGUuCgo1LiAgSW4gcGNyZXRlc3QsIGFuIGVzY2FwZSBzdWNoIGFzIFx4e2RlfSBpbiB0aGUgZGF0YSB3YXMgYWx3YXlzIGdlbmVyYXRpbmcKICAgIGEgVVRGLTggc3RyaW5nLCBldmVuIGluIG5vbi1VVEYtOCBtb2RlLiBOb3cgaXQgZ2VuZXJhdGVzIGEgc2luZ2xlIGJ5dGUgaW4KICAgIG5vbi1VVEYtOCBtb2RlLiBJZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDI1NSwgaXQgZ2l2ZXMgYSB3YXJuaW5nIGFib3V0CiAgICB0cnVuY2F0aW9uLgoKNi4gIE1pbm9yIGJ1Z2ZpeCBpbiBwY3JlY3BwLmNjIChjaGFuZ2UgIiIgPT0gLi4uIHRvIE5VTEwgPT0gLi4uKS4KCjcuICBBZGRlZCB0d28gKGludCkgY2FzdHMgdG8gcGNyZWdyZXAgd2hlbiBwcmludGluZyB0aGUgZGlmZmVyZW5jZSBvZiB0d28KICAgIHBvaW50ZXJzLCBpbiBjYXNlIHRoZXkgYXJlIDY0LWJpdCB2YWx1ZXMuCgo4LiAgQWRkZWQgY29tbWVudHMgYWJvdXQgTWFjIE9TIFggc3RhY2sgdXNhZ2UgdG8gdGhlIHBjcmVzdGFjayBtYW4gcGFnZSBhbmQgdG8KICAgIHRlc3QgMiBpZiBpdCBmYWlscy4KCjkuICBBZGRlZCBQQ1JFX0NBTExfQ09OVkVOVElPTiBqdXN0IGJlZm9yZSB0aGUgbmFtZXMgb2YgYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucywKICAgIGFuZCBhICNkZWZpbmUgb2YgdGhhdCBuYW1lIHRvIGVtcHR5IGlmIGl0IGlzIG5vdCBleHRlcm5hbGx5IHNldC4gVGhpcyBpcyB0bwogICAgYWxsb3cgdXNlcnMgb2YgTVNWQyB0byBzZXQgaXQgaWYgbmVjZXNzYXJ5LgoKMTAuIFRoZSBQQ1JFX0VYUF9ERUZOIG1hY3JvIHdoaWNoIHByZWNlZGVzIGV4cG9ydGVkIGZ1bmN0aW9ucyB3YXMgbWlzc2luZyBmcm9tCiAgICB0aGUgY29udmVuaWVuY2UgZnVuY3Rpb25zIGluIHRoZSBwY3JlX2dldC5jIHNvdXJjZSBmaWxlLgoKMTEuIEFuIG9wdGlvbiBjaGFuZ2UgYXQgdGhlIHN0YXJ0IG9mIGEgcGF0dGVybiB0aGF0IGhhZCB0b3AtbGV2ZWwgYWx0ZXJuYXRpdmVzCiAgICBjb3VsZCBjYXVzZSBvdmVyd3JpdGluZyBhbmQvb3IgYSBjcmFzaC4gVGhpcyBjb21tYW5kIHByb3Zva2VkIGEgY3Jhc2ggaW4KICAgIHNvbWUgZW52aXJvbm1lbnRzOgoKICAgICAgcHJpbnRmICIvKD9pKVtceGMzXHhhOVx4YzNceGJkXXxbXHhjM1x4YTlceGMzXHhiZEFdLzhcbiIgfCBwY3JldGVzdAoKICAgIFRoaXMgcG90ZW50aWFsIHNlY3VyaXR5IHByb2JsZW0gd2FzIHJlY29yZGVkIGFzIENWRS0yMDA4LTIzNzEuCgoxMi4gRm9yIGEgcGF0dGVybiB3aGVyZSB0aGUgbWF0Y2ggaGFkIHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3IgaW1tZWRpYXRlbHkKICAgIGFmdGVyIGEgbmV3bGluZSAoZS5nIC8uKmFueXRoaW5nLyB3aXRob3V0IHRoZSBET1RBTEwgZmxhZyksIHBjcmVfZXhlYygpIGFuZAogICAgcGNyZV9kZmFfZXhlYygpIGNvdWxkIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBwYXNzZWQgc3ViamVjdCBpZiB0aGVyZSB3YXMKICAgIG5vIG1hdGNoLiBUbyBoZWxwIHdpdGggZGV0ZWN0aW5nIHN1Y2ggYnVncyAoZS5nLiB3aXRoIHZhbGdyaW5kKSwgSSBtb2RpZmllZAogICAgcGNyZXRlc3Qgc28gdGhhdCBpdCBwbGFjZXMgdGhlIHN1YmplY3QgYXQgdGhlIGVuZCBvZiBpdHMgbWFsbG9jLWVkIGJ1ZmZlci4KCjEzLiBUaGUgY2hhbmdlIHRvIHBjcmV0ZXN0IGluIDEyIGFib3ZlIHRocmV3IHVwIGEgY291cGxlIG1vcmUgY2FzZXMgd2hlbiBwY3JlXwogICAgZXhlYygpIG1pZ2h0IHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBkYXRhIGJ1ZmZlciBpbiBVVEYtOCBtb2RlLgoKMTQuIEEgc2ltaWxhciBidWcgdG8gNy4zLzIgZXhpc3RlZCB3aGVuIHRoZSBQQ1JFX0ZJUlNUTElORSBvcHRpb24gd2FzIHNldCBhbmQKICAgIHRoZSBkYXRhIGNvbnRhaW5lZCB0aGUgYnl0ZSAweDg1IGFzIHBhcnQgb2YgYSBVVEYtOCBjaGFyYWN0ZXIgd2l0aGluIGl0cwogICAgZmlyc3QgbGluZS4gVGhpcyBhcHBsaWVkIGJvdGggdG8gbm9ybWFsIGFuZCBERkEgbWF0Y2hpbmcuCgoxNS4gTGF6eSBxdWFsaWZpZXJzIHdlcmUgbm90IHdvcmtpbmcgaW4gc29tZSBjYXNlcyBpbiBVVEYtOCBtb2RlLiBGb3IgZXhhbXBsZSwKICAgIC9eW15kXSo/JC84IGZhaWxlZCB0byBtYXRjaCAiYWJjIi4KCjE2LiBBZGRlZCBhIG1pc3NpbmcgY29weXJpZ2h0IG5vdGljZSB0byBwY3JlY3BwX2ludGVybmFsLmguCgoxNy4gTWFrZSBpdCBtb3JlIGNsZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIHRoYXQgdmFsdWVzIHJldHVybmVkIGZyb20KICAgIHBjcmVfZXhlYygpIGluIG92ZWN0b3IgYXJlIGJ5dGUgb2Zmc2V0cywgbm90IGNoYXJhY3RlciBjb3VudHMuCgoxOC4gVGlkaWVkIGEgZmV3IHBsYWNlcyB0byBzdG9wIGNlcnRhaW4gY29tcGlsZXJzIGZyb20gaXNzdWluZyB3YXJuaW5ncy4KCjE5LiBVcGRhdGVkIHRoZSBWaXJ0dWFsIFBhc2NhbCArIEJDQyBmaWxlcyB0byBjb21waWxlIHRoZSBsYXRlc3QgdjcuNywgYXMKICAgIHN1cHBsaWVkIGJ5IFN0ZWZhbiBXZWJlci4gSSBtYWRlIGEgZnVydGhlciBzbWFsbCB1cGRhdGUgZm9yIDcuOCBiZWNhdXNlCiAgICB0aGVyZSBpcyBhIGNoYW5nZSBvZiBzb3VyY2UgYXJyYW5nZW1lbnRzOiB0aGUgcGNyZV9zZWFyY2hmdW5jcy5jIG1vZHVsZSBpcwogICAgcmVwbGFjZWQgYnkgcGNyZV91Y2QuYy4KCgpWZXJzaW9uIDcuNyAwNy1NYXktMDgKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiAgQXBwbGllZCBDcmFpZydzIHBhdGNoIHRvIHNvcnQgb3V0IGEgbG9uZyBsb25nIHByb2JsZW06ICJJZiB3ZSBjYW4ndCBjb252ZXJ0CiAgICBhIHN0cmluZyB0byBhIGxvbmcgbG9uZywgcHJldGVuZCB3ZSBkb24ndCBldmVuIGhhdmUgYSBsb25nIGxvbmcuIiBUaGlzIGlzCiAgICBkb25lIGJ5IGNoZWNraW5nIGZvciB0aGUgc3RydG9xLCBzdHJ0b2xsLCBhbmQgX3N0cnRvaTY0IGZ1bmN0aW9ucy4KCjIuICBBcHBsaWVkIENyYWlnJ3MgcGF0Y2ggdG8gcGNyZWNwcC5jYyB0byByZXN0b3JlIEFCSSBjb21wYXRpYmlsaXR5IHdpdGgKICAgIHByZS03LjYgdmVyc2lvbnMsIHdoaWNoIGRlZmluZWQgYSBnbG9iYWwgbm9fYXJnIHZhcmlhYmxlIGluc3RlYWQgb2YgcHV0dGluZwogICAgaXQgaW4gdGhlIFJFIGNsYXNzLiAoU2VlIGFsc28gIzggYmVsb3cuKQoKMy4gIFJlbW92ZSBhIGxpbmUgb2YgZGVhZCBjb2RlLCBpZGVudGlmaWVkIGJ5IGNvdmVyaXR5IGFuZCByZXBvcnRlZCBieSBOdW5vCiAgICBMb3Blcy4KCjQuICBGaXhlZCB0d28gcmVsYXRlZCBwY3JlZ3JlcCBidWdzIGludm9sdmluZyAtciB3aXRoIC0taW5jbHVkZSBvciAtLWV4Y2x1ZGU6CgogICAgKDEpIFRoZSBpbmNsdWRlL2V4Y2x1ZGUgcGF0dGVybnMgd2VyZSBiZWluZyBhcHBsaWVkIHRvIHRoZSB3aG9sZSBwYXRobmFtZXMKICAgICAgICBvZiBmaWxlcywgaW5zdGVhZCBvZiBqdXN0IHRvIHRoZSBmaW5hbCBjb21wb25lbnRzLgoKICAgICgyKSBJZiB0aGVyZSB3YXMgbW9yZSB0aGFuIG9uZSBsZXZlbCBvZiBkaXJlY3RvcnksIHRoZSBzdWJkaXJlY3RvcmllcyB3ZXJlCiAgICAgICAgc2tpcHBlZCB1bmxlc3MgdGhleSBzYXRpc2ZpZWQgdGhlIGluY2x1ZGUvZXhjbHVkZSBjb25kaXRpb25zLiBUaGlzIGlzCiAgICAgICAgaW5jb25zaXN0ZW50IHdpdGggR05VIGdyZXAgKGFuZCBjb3VsZCBldmVuIGJlIHNlZW4gYXMgY29udHJhcnkgdG8gdGhlCiAgICAgICAgcGNyZWdyZXAgc3BlY2lmaWNhdGlvbiAtIHdoaWNoIEkgaW1wcm92ZWQgdG8gbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyKS4KICAgICAgICBUaGUgYWN0aW9uIG5vdyBpcyBhbHdheXMgdG8gc2NhbiBhbGwgbGV2ZWxzIG9mIGRpcmVjdG9yeSwgYW5kIGp1c3QKICAgICAgICBhcHBseSB0aGUgaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zIHRvIHJlZ3VsYXIgZmlsZXMuCgo1LiAgQWRkZWQgdGhlIC0taW5jbHVkZV9kaXIgYW5kIC0tZXhjbHVkZV9kaXIgcGF0dGVybnMgdG8gcGNyZWdyZXAsIGFuZCB1c2VkCiAgICAtLWV4Y2x1ZGVfZGlyIGluIHRoZSB0ZXN0cyB0byBhdm9pZCBzY2FubmluZyAuc3ZuIGRpcmVjdG9yaWVzLgoKNi4gIEFwcGxpZWQgQ3JhaWcncyBwYXRjaCB0byB0aGUgUXVvdGVNZXRhIGZ1bmN0aW9uIHNvIHRoYXQgaXQgZXNjYXBlcyB0aGUKICAgIE5VTCBjaGFyYWN0ZXIgYXMgYmFja3NsYXNoICsgMCByYXRoZXIgdGhhbiBiYWNrc2xhc2ggKyBOVUwsIGJlY2F1c2UgUENSRQogICAgZG9lc24ndCBzdXBwb3J0IE5VTHMgaW4gcGF0dGVybnMuCgo3LiAgQWRkZWQgc29tZSBtaXNzaW5nICJjb25zdCJzIHRvIGRlY2xhcmF0aW9ucyBvZiBzdGF0aWMgdGFibGVzIGluCiAgICBwY3JlX2NvbXBpbGUuYyBhbmQgcGNyZV9kZmFfZXhlYy5jLgoKOC4gIEFwcGxpZWQgQ3JhaWcncyBwYXRjaCB0byBwY3JlY3BwLmNjIHRvIGZpeCBhIHByb2JsZW0gaW4gT1MgWCB0aGF0IHdhcwogICAgY2F1c2VkIGJ5IGZpeCAjMiAgYWJvdmUuIChTdWJzZXF1ZW50bHkgYWxzbyBhIHNlY29uZCBwYXRjaCB0byBmaXggdGhlCiAgICBmaXJzdCBwYXRjaC4gQW5kIGEgdGhpcmQgcGF0Y2ggLSB0aGlzIHdhcyBhIG1lc3N5IHByb2JsZW0uKQoKOS4gIEFwcGxpZWQgQ3JhaWcncyBwYXRjaCB0byByZW1vdmUgdGhlIHVzZSBvZiBwdXNoX2JhY2soKS4KCjEwLiBBcHBsaWVkIEFsYW4gTGVob3Rza3kncyBwYXRjaCB0byBhZGQgUkVHX1NUQVJURU5EIHN1cHBvcnQgdG8gdGhlIFBPU0lYCiAgICBtYXRjaGluZyBmdW5jdGlvbiByZWdleGVjKCkuCgoxMS4gQWRkZWQgc3VwcG9ydCBmb3IgdGhlIE9uaWd1cnVtYSBzeW50YXggXGc8bmFtZT4sIFxnPG4+LCBcZyduYW1lJywgXGcnbicsCiAgICB3aGljaCwgaG93ZXZlciwgdW5saWtlIFBlcmwncyBcZ3suLi59LCBhcmUgc3Vicm91dGluZSBjYWxscywgbm90IGJhY2sKICAgIHJlZmVyZW5jZXMuIFBDUkUgc3VwcG9ydHMgcmVsYXRpdmUgbnVtYmVycyB3aXRoIHRoaXMgc3ludGF4IChJIGRvbid0IHRoaW5rCiAgICBPbmlndXJ1bWEgZG9lcykuCgoxMi4gUHJldmlvdXNseSwgYSBncm91cCB3aXRoIGEgemVybyByZXBlYXQgc3VjaCBhcyAoLi4uKXswfSB3YXMgY29tcGxldGVseQogICAgb21pdHRlZCBmcm9tIHRoZSBjb21waWxlZCByZWdleC4gSG93ZXZlciwgdGhpcyBtZWFucyB0aGF0IGlmIHRoZSBncm91cAogICAgd2FzIGNhbGxlZCBhcyBhIHN1YnJvdXRpbmUgZnJvbSBlbHNld2hlcmUgaW4gdGhlIHBhdHRlcm4sIHRoaW5ncyB3ZW50IHdyb25nCiAgICAoYW4gaW50ZXJuYWwgZXJyb3Igd2FzIGdpdmVuKS4gU3VjaCBncm91cHMgYXJlIG5vdyBsZWZ0IGluIHRoZSBjb21waWxlZAogICAgcGF0dGVybiwgd2l0aCBhIG5ldyBvcGNvZGUgdGhhdCBjYXVzZXMgdGhlbSB0byBiZSBza2lwcGVkIGF0IGV4ZWN1dGlvbgogICAgdGltZS4KCjEzLiBBZGRlZCB0aGUgUENSRV9KQVZBU0NSSVBUX0NPTVBBVCBvcHRpb24uIFRoaXMgbWFrZXMgdGhlIGZvbGxvd2luZyBjaGFuZ2VzCiAgICB0byB0aGUgd2F5IFBDUkUgYmVoYXZlczoKCiAgICAoYSkgQSBsb25lIF0gY2hhcmFjdGVyIGlzIGRpcy1hbGxvd2VkIChQZXJsIHRyZWF0cyBpdCBhcyBkYXRhKS4KCiAgICAoYikgQSBiYWNrIHJlZmVyZW5jZSB0byBhbiB1bm1hdGNoZWQgc3VicGF0dGVybiBtYXRjaGVzIGFuIGVtcHR5IHN0cmluZwogICAgICAgIChQZXJsIGZhaWxzIHRoZSBjdXJyZW50IG1hdGNoIHBhdGgpLgoKICAgIChjKSBBIGRhdGEgXSBpbiBhIGNoYXJhY3RlciBjbGFzcyBtdXN0IGJlIG5vdGF0ZWQgYXMgXF0gYmVjYXVzZSBpZiB0aGUKICAgICAgICBmaXJzdCBkYXRhIGNoYXJhY3RlciBpbiBhIGNsYXNzIGlzIF0sIGl0IGRlZmluZXMgYW4gZW1wdHkgY2xhc3MuIChJbgogICAgICAgIFBlcmwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgYW4gZW1wdHkgY2xhc3MuKSBUaGUgZW1wdHkgY2xhc3MgW10KICAgICAgICBuZXZlciBtYXRjaGVzOyBpdCBmb3JjZXMgZmFpbHVyZSBhbmQgaXMgZXF1aXZhbGVudCB0byAoKkZBSUwpIG9yICg/ISkuCiAgICAgICAgVGhlIG5lZ2F0aXZlIGVtcHR5IGNsYXNzIFteXSBtYXRjaGVzIGFueSBvbmUgY2hhcmFjdGVyLCBpbmRlcGVuZGVudGx5CiAgICAgICAgb2YgdGhlIERPVEFMTCBzZXR0aW5nLgoKMTQuIEEgcGF0dGVybiBzdWNoIGFzIC8oPzIpW11hKCliXShhYmMpLyB3aGljaCBoYWQgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byBhCiAgICBub24tZXhpc3RlbnQgc3VicGF0dGVybiBmb2xsb3dpbmcgYSBjaGFyYWN0ZXIgY2xhc3Mgc3RhcnRpbmcgd2l0aCAnXScgYW5kCiAgICBjb250YWluaW5nICgpIGdhdmUgYW4gaW50ZXJuYWwgY29tcGlsaW5nIGVycm9yIGluc3RlYWQgb2YgInJlZmVyZW5jZSB0bwogICAgbm9uLWV4aXN0ZW50IHN1YnBhdHRlcm4iLiBGb3J0dW5hdGVseSwgd2hlbiB0aGUgcGF0dGVybiBkaWQgZXhpc3QsIHRoZQogICAgY29tcGlsZWQgY29kZSB3YXMgY29ycmVjdC4gKFdoZW4gc2Nhbm5pbmcgZm9yd2FyZHMgdG8gY2hlY2sgZm9yIHRoZQogICAgZXhpc3RlbmNkIG9mIHRoZSBzdWJwYXR0ZXJuLCBpdCB3YXMgdHJlYXRpbmcgdGhlIGRhdGEgJ10nIGFzIHRlcm1pbmF0aW5nCiAgICB0aGUgY2xhc3MsIHNvIGdvdCB0aGUgY291bnQgd3JvbmcuIFdoZW4gYWN0dWFsbHkgY29tcGlsaW5nLCB0aGUgcmVmZXJlbmNlCiAgICB3YXMgc3Vic2VxdWVudGx5IHNldCB1cCBjb3JyZWN0bHkuKQoKMTUuIFRoZSAiYWx3YXlzIGZhaWwiIGFzc2VydGlvbiAoPyEpIGlzIG9wdGltemVkIHRvICgqRkFJTCkgYnkgcGNyZV9jb21waWxlOwogICAgaXQgd2FzIGJlaW5nIHJlamVjdGVkIGFzIG5vdCBzdXBwb3J0ZWQgYnkgcGNyZV9kZmFfZXhlYygpLCBldmVuIHRob3VnaAogICAgb3RoZXIgYXNzZXJ0aW9ucyBhcmUgc3VwcG9ydGVkLiBJIGhhdmUgbWFkZSBwY3JlX2RmYV9leGVjKCkgc3VwcG9ydAogICAgKCpGQUlMKS4KCjE2LiBUaGUgaW1wbGVtZW50YXRpb24gb2YgMTNjIGFib3ZlIGludm9sdmVkIHRoZSBpbnZlbnRpb24gb2YgYSBuZXcgb3Bjb2RlLAogICAgT1BfQUxMQU5ZLCB3aGljaCBpcyBsaWtlIE9QX0FOWSBidXQgZG9lc24ndCBjaGVjayB0aGUgL3MgZmxhZy4gU2luY2UgL3MKICAgIGNhbm5vdCBiZSBjaGFuZ2VkIGF0IG1hdGNoIHRpbWUsIEkgcmVhbGl6ZWQgSSBjb3VsZCBtYWtlIGEgc21hbGwKICAgIGltcHJvdmVtZW50IHRvIG1hdGNoaW5nIHBlcmZvcm1hbmNlIGJ5IGNvbXBpbGluZyBPUF9BTExBTlkgaW5zdGVhZCBvZgogICAgT1BfQU5ZIGZvciAiLiIgd2hlbiBET1RBTEwgd2FzIHNldCwgYW5kIHRoZW4gcmVtb3ZpbmcgdGhlIHJ1bnRpbWUgdGVzdHMKICAgIG9uIHRoZSBPUF9BTlkgcGF0aC4KCjE3LiBDb21waWxpbmcgcGNyZXRlc3Qgb24gV2luZG93cyB3aXRoIHJlYWRsaW5lIHN1cHBvcnQgZmFpbGVkIHdpdGhvdXQgdGhlCiAgICBmb2xsb3dpbmcgdHdvIGZpeGVzOiAoMSkgTWFrZSB0aGUgdW5pc3RkLmggaW5jbHVkZSBjb25kaXRpb25hbCBvbgogICAgSEFWRV9VTklTVERfSDsgKDIpICNkZWZpbmUgaXNhdHR5IGFuZCBmaWxlbm8gYXMgX2lzYXR0eSBhbmQgX2ZpbGVuby4KCjE4LiBDaGFuZ2VkIENNYWtlTGlzdHMudHh0IGFuZCBjbWFrZS9GaW5kUmVhZGxpbmUuY21ha2UgdG8gYXJyYW5nZSBmb3IgdGhlCiAgICBuY3Vyc2VzIGxpYnJhcnkgdG8gYmUgaW5jbHVkZWQgZm9yIHBjcmV0ZXN0IHdoZW4gUmVhZExpbmUgc3VwcG9ydCBpcwogICAgcmVxdWVzdGVkLCBidXQgYWxzbyB0byBhbGxvdyBmb3IgaXQgdG8gYmUgb3ZlcnJpZGRlbi4gVGhpcyBwYXRjaCBjYW1lIGZyb20KICAgIERhbmllbCBCZXJnc3Ry9m0uCgoxOS4gVGhlcmUgd2FzIGEgdHlwbyBpbiB0aGUgZmlsZSB1Y3BpbnRlcm5hbC5oIHdoZXJlIGYwX3JhbmdlZmxhZyB3YXMgZGVmaW5lZAogICAgYXMgMHgwMGYwMDAwMCBpbnN0ZWFkIG9mIDB4MDA4MDAwMDAuIEx1Y2tpbHksIHRoaXMgd291bGQgbm90IGhhdmUgY2F1c2VkCiAgICBhbnkgZXJyb3JzIHdpdGggdGhlIGN1cnJlbnQgVW5pY29kZSB0YWJsZXMuIFRoYW5rcyB0byBQZXRlciBLYW5rb3dza2kgZm9yCiAgICBzcG90dGluZyB0aGlzLgoKClZlcnNpb24gNy42IDI4LUphbi0wOAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuICBBIGNoYXJhY3RlciBjbGFzcyBjb250YWluaW5nIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3aXRoCiAgICBjb2RlcG9pbnRzIGdyZWF0ZXIgdGhhbiAyNTUgKGluIFVURi04IG1vZGUsIG9mIGNvdXJzZSkgY2F1c2VkIGEgYnVmZmVyCiAgICBvdmVyZmxvdy4KCjIuICBQYXRjaCB0byBjdXQgb3V0IHRoZSAibG9uZyBsb25nIiB0ZXN0IGluIHBjcmVjcHBfdW5pdHRlc3Qgd2hlbgogICAgSEFWRV9MT05HX0xPTkcgaXMgbm90IGRlZmluZWQuCgozLiAgQXBwbGllZCBDaHJpc3RpYW4gRWhybGljaGVyJ3MgcGF0Y2ggdG8gdXBkYXRlIHRoZSBDTWFrZSBidWlsZCBmaWxlcyB0bwogICAgYnJpbmcgdGhlbSB1cCB0byBkYXRlIGFuZCBpbmNsdWRlIG5ldyBmZWF0dXJlcy4gVGhpcyBwYXRjaCBpbmNsdWRlczoKCiAgICAtIEZpeGVkIFBIJ3MgYmFkbHkgYWRkZWQgbGlieiBhbmQgbGliYnoyIHN1cHBvcnQuCiAgICAtIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHN0YXRpYyBsaW5raW5nLgogICAgLSBBZGRlZCBwY3JlZGVtby4gW0J1dCBsYXRlciByZW1vdmVkIC0gc2VlIDcgYmVsb3cuXQogICAgLSBGaXhlZCBkZnRhYmxlcyBwcm9ibGVtIGFuZCBhZGRlZCBhbiBvcHRpb24uCiAgICAtIEFkZGVkIGEgbnVtYmVyIG9mIEhBVkVfWFhYIHRlc3RzLCBpbmNsdWRpbmcgSEFWRV9XSU5ET1dTX0ggYW5kCiAgICAgICAgSEFWRV9MT05HX0xPTkcuCiAgICAtIEFkZGVkIHJlYWRsaW5lIHN1cHBvcnQgZm9yIHBjcmV0ZXN0LgogICAgLSBBZGRlZCBhbiBsaXN0aW5nIG9mIHRoZSBvcHRpb24gc2V0dGluZ3MgYWZ0ZXIgY21ha2UgaGFzIHJ1bi4KCjQuICBBIHVzZXIgc3VibWl0dGVkIGEgcGF0Y2ggdG8gTWFrZWZpbGUgdGhhdCBtYWtlcyBpdCBlYXN5IHRvIGNyZWF0ZQogICAgInBjcmUuZGxsIiB1bmRlciBtaW5ndyB3aGVuIHVzaW5nIENvbmZpZ3VyZS9NYWtlLiBJIGFkZGVkIHN0dWZmIHRvCiAgICBNYWtlZmlsZS5hbSB0aGF0IGNhdXNlIGl0IHRvIGluY2x1ZGUgdGhpcyBzcGVjaWFsIHRhcmdldCwgd2l0aG91dAogICAgYWZmZWN0aW5nIGFueXRoaW5nIGVsc2UuIE5vdGUgdGhhdCB0aGUgc2FtZSBtaW5ndyB0YXJnZXQgcGx1cyBhbGwKICAgIHRoZSBvdGhlciBkaXN0cmlidXRpb24gbGlicmFyaWVzIGFuZCBwcm9ncmFtcyBhcmUgbm93IHN1cHBvcnRlZAogICAgd2hlbiBjb25maWd1cmluZyB3aXRoIENNYWtlIChzZWUgNiBiZWxvdykgaW5zdGVhZCBvZiB3aXRoCiAgICBDb25maWd1cmUvTWFrZS4KCjUuICBBcHBsaWVkIENyYWlnJ3MgcGF0Y2ggdGhhdCBtb3ZlcyBub19hcmcgaW50byB0aGUgUkUgY2xhc3MgaW4gdGhlIEMrKyBjb2RlLgogICAgVGhpcyBpcyBhbiBhdHRlbXB0IHRvIHNvbHZlIHRoZSByZXBvcnRlZCBwcm9ibGVtICJwY3JlY3BwOjpub19hcmcgaXMgbm90CiAgICBleHBvcnRlZCBpbiB0aGUgV2luZG93cyBwb3J0Ii4gSXQgaGFzIG5vdCB5ZXQgYmVlbiBjb25maXJtZWQgdGhhdCB0aGUgcGF0Y2gKICAgIHNvbHZlcyB0aGUgcHJvYmxlbSwgYnV0IGl0IGRvZXMgbm8gaGFybS4KCjYuICBBcHBsaWVkIFNoZXJpJ3MgcGF0Y2ggdG8gQ01ha2VMaXN0cy50eHQgdG8gYWRkIE5PTl9TVEFOREFSRF9MSUJfUFJFRklYIGFuZAogICAgTk9OX1NUQU5EQVJEX0xJQl9TVUZGSVggZm9yIGRsbCBuYW1lcyBidWlsdCB3aXRoIG1pbmd3IHdoZW4gY29uZmlndXJlZAogICAgd2l0aCBDTWFrZSwgYW5kIGFsc28gY29ycmVjdCB0aGUgY29tbWVudCBhYm91dCBzdGFjayByZWN1cnNpb24uCgo3LiAgUmVtb3ZlIHRoZSBhdXRvbWF0aWMgYnVpbGRpbmcgb2YgcGNyZWRlbW8gZnJvbSB0aGUgLi9jb25maWd1cmUgc3lzdGVtIGFuZAogICAgZnJvbSBDTWFrZUxpc3RzLnR4dC4gVGhlIHdob2xlIGlkZWEgb2YgcGNyZWRlbW8uYyBpcyB0aGF0IGl0IGlzIGFuIGV4YW1wbGUKICAgIG9mIGEgcHJvZ3JhbSB0aGF0IHVzZXJzIHNob3VsZCBidWlsZCB0aGVtc2VsdmVzIGFmdGVyIFBDUkUgaXMgaW5zdGFsbGVkLCBzbwogICAgYnVpbGRpbmcgaXQgYXV0b21hdGljYWxseSBpcyBub3QgcmVhbGx5IHJpZ2h0LiBXaGF0IGlzIG1vcmUsIGl0IGdhdmUKICAgIHRyb3VibGUgaW4gc29tZSBidWlsZCBlbnZpcm9ubWVudHMuCgo4LiAgRnVydGhlciB0aWRpZXMgdG8gQ01ha2VMaXN0cy50eHQgZnJvbSBTaGVyaSBhbmQgQ2hyaXN0aWFuLgoKClZlcnNpb24gNy41IDEwLUphbi0wOAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuICBBcHBsaWVkIGEgcGF0Y2ggZnJvbSBDcmFpZzogIlRoaXMgcGF0Y2ggbWFrZXMgaXQgcG9zc2libGUgdG8gJ2lnbm9yZScKICAgIHZhbHVlcyBpbiBwYXJlbnMgd2hlbiBwYXJzaW5nIGFuIFJFIHVzaW5nIHRoZSBDKysgd3JhcHBlci4iCgoyLiAgTmVnYXRpdmUgc3BlY2lhbHMgbGlrZSBcUyBkaWQgbm90IHdvcmsgaW4gY2hhcmFjdGVyIGNsYXNzZXMgaW4gVVRGLTggbW9kZS4KICAgIENoYXJhY3RlcnMgZ3JlYXRlciB0aGFuIDI1NSB3ZXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGNsYXNzIGluc3RlYWQgb2YgYmVpbmcKICAgIGluY2x1ZGVkLgoKMy4gIFRoZSBzYW1lIGJ1ZyBhcyAoMikgYWJvdmUgYXBwbGllZCB0byBuZWdhdGVkIFBPU0lYIGNsYXNzZXMgc3VjaCBhcwogICAgWzpec3BhY2U6XS4KCjQuICBQQ1JFQ1BQX1NUQVRJQyB3YXMgcmVmZXJlbmNlZCBpbiBwY3JlY3BwX2ludGVybmFsLmgsIGJ1dCBub3doZXJlIHdhcyBpdAogICAgZGVmaW5lZCBvciBkb2N1bWVudGVkLiBJdCBzZWVtcyB0byBoYXZlIGJlZW4gYSB0eXBvIGZvciBQQ1JFX1NUQVRJQywgc28KICAgIEkgaGF2ZSBjaGFuZ2VkIGl0LgoKNS4gIFRoZSBjb25zdHJ1Y3QgKD8mKSB3YXMgbm90IGRpYWdub3NlZCBhcyBhIHN5bnRheCBlcnJvciAoaXQgcmVmZXJlbmNlZCB0aGUKICAgIGZpcnN0IG5hbWVkIHN1YnBhdHRlcm4pIGFuZCBhIGNvbnN0cnVjdCBzdWNoIGFzICg/JmEpIHdvdWxkIHJlZmVyZW5jZSB0aGUKICAgIGZpcnN0IG5hbWVkIHN1YnBhdHRlcm4gd2hvc2UgbmFtZSBzdGFydGVkIHdpdGggImEiIChpbiBvdGhlciB3b3JkcywgdGhlCiAgICBsZW5ndGggY2hlY2sgd2FzIG1pc3NpbmcpLiBCb3RoIHRoZXNlIHByb2JsZW1zIGFyZSBmaXhlZC4gIlN1YnBhdHRlcm4gbmFtZQogICAgZXhwZWN0ZWQiIGlzIG5vdyBnaXZlbiBmb3IgKD8mKSAoYSB6ZXJvLWxlbmd0aCBuYW1lKSwgYW5kIHRoaXMgcGF0Y2ggYWxzbwogICAgbWFrZXMgaXQgZ2l2ZSB0aGUgc2FtZSBlcnJvciBmb3IgXGsnJyAocHJldmlvdXNseSBpdCBjb21wbGFpbmVkIHRoYXQgdGhhdAogICAgd2FzIGEgcmVmZXJlbmNlIHRvIGEgbm9uLWV4aXN0ZW50IHN1YnBhdHRlcm4pLgoKNi4gIFRoZSBlcnJvbmVvdXMgcGF0dGVybnMgKD8rLWEpIGFuZCAoPy0rYSkgZ2l2ZSBkaWZmZXJlbnQgZXJyb3IgbWVzc2FnZXM7CiAgICB0aGlzIGlzIHJpZ2h0IGJlY2F1c2UgKD8tIGNhbiBiZSBmb2xsb3dlZCBieSBvcHRpb24gc2V0dGluZ3MgYXMgd2VsbCBhcyBieQogICAgZGlnaXRzLiBJIGhhdmUsIGhvd2V2ZXIsIG1hZGUgdGhlIG1lc3NhZ2VzIGNsZWFyZXIuCgo3LiAgUGF0dGVybnMgc3VjaCBhcyAoPygxKWF8YikgKGEgcGF0dGVybiB0aGF0IGNvbnRhaW5zIGZld2VyIHN1YnBhdHRlcm5zCiAgICB0aGFuIHRoZSBudW1iZXIgdXNlZCBpbiB0aGUgY29uZGl0aW9uYWwpIG5vdyBjYXVzZSBhIGNvbXBpbGUtdGltZSBlcnJvci4KICAgIFRoaXMgaXMgYWN0dWFsbHkgbm90IGNvbXBhdGlibGUgd2l0aCBQZXJsLCB3aGljaCBhY2NlcHRzIHN1Y2ggcGF0dGVybnMsIGJ1dAogICAgdHJlYXRzIHRoZSBjb25kaXRpb25hbCBhcyBhbHdheXMgYmVpbmcgRkFMU0UgKGFzIFBDUkUgdXNlZCB0byksIGJ1dCBpdAogICAgc2VlbXMgdG8gbWUgdGhhdCBnaXZpbmcgYSBkaWFnbm9zdGljIGlzIGJldHRlci4KCjguICBDaGFuZ2UgImFscGhhbWVyaWMiIHRvIHRoZSBtb3JlIGNvbW1vbiB3b3JkICJhbHBoYW51bWVyaWMiIGluIGNvbW1lbnRzCiAgICBhbmQgbWVzc2FnZXMuCgo5LiAgRml4IHR3byBvY2N1cnJlbmNlcyBvZiAiYmFja3NsYXNoIiBpbiBjb21tZW50cyB0aGF0IHNob3VsZCBoYXZlIGJlZW4KICAgICJiYWNrc3BhY2UiLgoKMTAuIFJlbW92ZSB0d28gcmVkdW5kYW50IGxpbmVzIG9mIGNvZGUgdGhhdCBjYW4gbmV2ZXIgYmUgb2JleWVkICh0aGVpciBmdW5jdGlvbgogICAgd2FzIG1vdmVkIGVsc2V3aGVyZSkuCgoxMS4gVGhlIHByb2dyYW0gdGhhdCBtYWtlcyBQQ1JFJ3MgVW5pY29kZSBjaGFyYWN0ZXIgcHJvcGVydHkgdGFibGUgaGFkIGEgYnVnCiAgICB3aGljaCBjYXVzZWQgaXQgdG8gZ2VuZXJhdGUgaW5jb3JyZWN0IHRhYmxlIGVudHJpZXMgZm9yIHNlcXVlbmNlcyBvZgogICAgY2hhcmFjdGVycyB0aGF0IGhhdmUgdGhlIHNhbWUgY2hhcmFjdGVyIHR5cGUsIGJ1dCBhcmUgaW4gZGlmZmVyZW50IHNjcmlwdHMuCiAgICBJdCBhbWFsZ2FtYXRlZCB0aGVtIGludG8gYSBzaW5nbGUgcmFuZ2UsIHdpdGggdGhlIHNjcmlwdCBvZiB0aGUgZmlyc3Qgb2YKICAgIHRoZW0uIEluIG90aGVyIHdvcmRzLCBzb21lIGNoYXJhY3RlcnMgd2VyZSBpbiB0aGUgd3Jvbmcgc2NyaXB0LiBUaGVyZSB3ZXJlCiAgICB0aGlydGVlbiBzdWNoIGNhc2VzLCBhZmZlY3RpbmcgY2hhcmFjdGVycyBpbiB0aGUgZm9sbG93aW5nIHJhbmdlczoKCiAgICAgIFUrMDAyYjAgLSBVKzAwMmMxCiAgICAgIFUrMDA2MGMgLSBVKzAwNjBkCiAgICAgIFUrMDA2MWUgLSBVKzAwNjEyCiAgICAgIFUrMDA2NGIgLSBVKzAwNjVlCiAgICAgIFUrMDA3NGQgLSBVKzAwNzZkCiAgICAgIFUrMDE4MDAgLSBVKzAxODA1CiAgICAgIFUrMDFkMDAgLSBVKzAxZDc3CiAgICAgIFUrMDFkOWIgLSBVKzAxZGJmCiAgICAgIFUrMDIwMGIgLSBVKzAyMDBmCiAgICAgIFUrMDMwZmMgLSBVKzAzMGZlCiAgICAgIFUrMDMyNjAgLSBVKzAzMjdmCiAgICAgIFUrMGZiNDYgLSBVKzBmYmIxCiAgICAgIFUrMTA0NTAgLSBVKzEwNDlkCgoxMi4gVGhlIC1vIG9wdGlvbiAoc2hvdyBvbmx5IHRoZSBtYXRjaGluZyBwYXJ0IG9mIGEgbGluZSkgZm9yIHBjcmVncmVwIHdhcyBub3QKICAgIGNvbXBhdGlibGUgd2l0aCBHTlUgZ3JlcCBpbiB0aGF0LCBpZiB0aGVyZSB3YXMgbW9yZSB0aGFuIG9uZSBtYXRjaCBpbiBhCiAgICBsaW5lLCBpdCBzaG93ZWQgb25seSB0aGUgZmlyc3Qgb2YgdGhlbS4gSXQgbm93IGJlaGF2ZXMgaW4gdGhlIHNhbWUgd2F5IGFzCiAgICBHTlUgZ3JlcC4KCjEzLiBJZiB0aGUgLW8gYW5kIC12IG9wdGlvbnMgd2VyZSBjb21iaW5lZCBmb3IgcGNyZWdyZXAsIGl0IHByaW50ZWQgYSBibGFuawogICAgbGluZSBmb3IgZXZlcnkgbm9uLW1hdGNoaW5nIGxpbmUuIEdOVSBncmVwIHByaW50cyBub3RoaW5nLCBhbmQgcGNyZWdyZXAgbm93CiAgICBkb2VzIHRoZSBzYW1lLiBUaGUgcmV0dXJuIGNvZGUgY2FuIGJlIHVzZWQgdG8gdGVsbCBpZiB0aGVyZSB3ZXJlIGFueQogICAgbm9uLW1hdGNoaW5nIGxpbmVzLgoKMTQuIEFkZGVkIC0tZmlsZS1vZmZzZXRzIGFuZCAtLWxpbmUtb2Zmc2V0cyB0byBwY3JlZ3JlcC4KCjE1LiBUaGUgcGF0dGVybiAoPz1zb21ldGhpbmcpKD9SKSB3YXMgbm90IGJlaW5nIGRpYWdub3NlZCBhcyBhIHBvdGVudGlhbGx5CiAgICBpbmZpbml0ZWx5IGxvb3BpbmcgcmVjdXJzaW9uLiBUaGUgYnVnIHdhcyB0aGF0IHBvc2l0aXZlIGxvb2thaGVhZHMgd2VyZSBub3QKICAgIGJlaW5nIHNraXBwZWQgd2hlbiBjaGVja2luZyBmb3IgYSBwb3NzaWJsZSBlbXB0eSBtYXRjaCAobmVnYXRpdmUgbG9va2FoZWFkcwogICAgYW5kIGJvdGgga2luZHMgb2YgbG9va2JlaGluZCB3ZXJlIHNraXBwZWQpLgoKMTYuIEZpeGVkIHR3byB0eXBvcyBpbiB0aGUgV2luZG93cy1vbmx5IGNvZGUgaW4gcGNyZWdyZXAuYywgYW5kIG1vdmVkIHRoZQogICAgaW5jbHVzaW9uIG9mIDx3aW5kb3dzLmg+IHRvIGJlZm9yZSByYXRoZXIgdGhhbiBhZnRlciB0aGUgZGVmaW5pdGlvbiBvZgogICAgSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMgKHBhdGNoIGZyb20gRGF2aWQgQnlyb24pLgoKMTcuIFNwZWNpZnlpbmcgYSBwb3NzZXNzaXZlIHF1YW50aWZpZXIgd2l0aCBhIHNwZWNpZmljIGxpbWl0IGZvciBhIFVuaWNvZGUKICAgIGNoYXJhY3RlciBwcm9wZXJ0eSBjYXVzZWQgcGNyZV9jb21waWxlKCkgdG8gY29tcGlsZSBiYWQgY29kZSwgd2hpY2ggbGVkIGF0CiAgICBydW50aW1lIHRvIFBDUkVfRVJST1JfSU5URVJOQUwgKC0xNCkuIEV4YW1wbGVzIG9mIHBhdHRlcm5zIHRoYXQgY2F1c2VkIHRoaXMKICAgIGFyZTogL1xwe1psfXsyLDN9Ky84IGFuZCAvXHB7Q2N9ezJ9Ky84LiBJdCB3YXMgdGhlIHBvc3Nlc3NpdmUgIisiIHRoYXQKICAgIGNhdXNlZCB0aGUgZXJyb3I7IHdpdGhvdXQgdGhhdCB0aGVyZSB3YXMgbm8gcHJvYmxlbS4KCjE4LiBBZGRlZCAtLWVuYWJsZS1wY3JlZ3JlcC1saWJ6IGFuZCAtLWVuYWJsZS1wY3JlZ3JlcC1saWJiejIuCgoxOS4gQWRkZWQgLS1lbmFibGUtcGNyZXRlc3QtbGlicmVhZGxpbmUuCgoyMC4gSW4gcGNyZWNwcC5jYywgdGhlIHZhcmlhYmxlICdjb3VudCcgd2FzIGluY3JlbWVudGVkIHR3aWNlIGluCiAgICBSRTo6R2xvYmFsUmVwbGFjZSgpLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiByZXBsYWNlbWVudHMgcmV0dXJuZWQgd2FzCiAgICBkb3VibGUgd2hhdCBpdCBzaG91bGQgYmUuIEkgcmVtb3ZlZCBvbmUgb2YgdGhlIGluY3JlbWVudHMsIGJ1dCBDcmFpZyBzZW50IGEKICAgIGxhdGVyIHBhdGNoIHRoYXQgcmVtb3ZlZCB0aGUgb3RoZXIgb25lICh0aGUgcmlnaHQgZml4KSBhbmQgYWRkZWQgdW5pdCB0ZXN0cwogICAgdGhhdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlcyAod2hpY2ggd2FzIG5vdCBkb25lIGJlZm9yZSkuCgoyMS4gU2V2ZXJhbCBDTWFrZSB0aGluZ3M6CgogICAgKDEpIEFycmFuZ2VkIHRoYXQsIHdoZW4gY21ha2UgaXMgdXNlZCBvbiBVbml4LCB0aGUgbGlicmFyaWVzIGVuZCB1cCB3aXRoCiAgICAgICAgdGhlIG5hbWVzIGxpYnBjcmUgYW5kIGxpYnBjcmVwb3NpeCwgbm90IGp1c3QgcGNyZSBhbmQgcGNyZXBvc2l4LgoKICAgICgyKSBUaGUgYWJvdmUgY2hhbmdlIG1lYW5zIHRoYXQgcGNyZXRlc3QgYW5kIHBjcmVncmVwIGFyZSBub3cgY29ycmVjdGx5CiAgICAgICAgbGlua2VkIHdpdGggdGhlIG5ld2x5LWJ1aWx0IGxpYnJhcmllcywgbm90IHByZXZpb3VzbHkgaW5zdGFsbGVkIG9uZXMuCgogICAgKDMpIEFkZGVkIFBDUkVfU1VQUE9SVF9MSUJSRUFETElORSwgUENSRV9TVVBQT1JUX0xJQlosIFBDUkVfU1VQUE9SVF9MSUJCWjIuCgoyMi4gSW4gVVRGLTggbW9kZSwgd2l0aCBuZXdsaW5lIHNldCB0byAiYW55IiwgYSBwYXR0ZXJuIHN1Y2ggYXMgLiphLio9LmIuKgogICAgY3Jhc2hlZCB3aGVuIG1hdGNoaW5nIGEgc3RyaW5nIHN1Y2ggYXMgYVx4ezIwMjl9YiAobm90ZSB0aGF0IFx4ezIwMjl9IGlzIGEKICAgIFVURi04IG5ld2xpbmUgY2hhcmFjdGVyKS4gVGhlIGtleSBpc3N1ZSBpcyB0aGF0IHRoZSBwYXR0ZXJuIHN0YXJ0cyAuKjsKICAgIHRoaXMgbWVhbnMgdGhhdCB0aGUgbWF0Y2ggbXVzdCBiZSBlaXRoZXIgYXQgdGhlIGJlZ2lubmluZywgb3IgYWZ0ZXIgYQogICAgbmV3bGluZS4gVGhlIGJ1ZyB3YXMgaW4gdGhlIGNvZGUgZm9yIGFkdmFuY2luZyBhZnRlciBhIGZhaWxlZCBtYXRjaCBhbmQKICAgIGNoZWNraW5nIHRoYXQgdGhlIG5ldyBwb3NpdGlvbiBmb2xsb3dlZCBhIG5ld2xpbmUuIEl0IHdhcyBub3QgdGFraW5nCiAgICBhY2NvdW50IG9mIFVURi04IGNoYXJhY3RlcnMgY29ycmVjdGx5LgoKMjMuIFBDUkUgd2FzIGJlaGF2aW5nIGRpZmZlcmVudGx5IGZyb20gUGVybCBpbiB0aGUgd2F5IGl0IHJlY29nbml6ZWQgUE9TSVgKICAgIGNoYXJhY3RlciBjbGFzc2VzLiBQQ1JFIHdhcyBub3QgdHJlYXRpbmcgdGhlIHNlcXVlbmNlIFs6Li4uOl0gYXMgYQogICAgY2hhcmFjdGVyIGNsYXNzIHVubGVzcyB0aGUgLi4uIHdlcmUgYWxsIGxldHRlcnMuIFBlcmwsIGhvd2V2ZXIsIHNlZW1zIHRvCiAgICBhbGxvdyBhbnkgY2hhcmFjdGVycyBiZXR3ZWVuIFs6IGFuZCA6XSwgdGhvdWdoIG9mIGNvdXJzZSBpdCByZWplY3RzIGFzCiAgICB1bmtub3duIGFueSAibmFtZXMiIHRoYXQgY29udGFpbiBub24tbGV0dGVycywgYmVjYXVzZSBhbGwgdGhlIGtub3duIGNsYXNzCiAgICBuYW1lcyBjb25zaXN0IG9ubHkgb2YgbGV0dGVycy4gVGh1cywgUGVybCBnaXZlcyBhbiBlcnJvciBmb3IgW1s6MTIzNDpdXSwKICAgIGZvciBleGFtcGxlLCB3aGVyZWFzIFBDUkUgZGlkIG5vdCAtIGl0IGRpZCBub3QgcmVjb2duaXplIGEgUE9TSVggY2hhcmFjdGVyCiAgICBjbGFzcy4gVGhpcyBzZWVtZWQgYSBiaXQgZGFuZ2Vyb3VzLCBzbyB0aGUgY29kZSBoYXMgYmVlbiBjaGFuZ2VkIHRvIGJlCiAgICBjbG9zZXIgdG8gUGVybC4gVGhlIGJlaGF2aW91ciBpcyBub3QgaWRlbnRpY2FsIHRvIFBlcmwsIGJlY2F1c2UgUENSRSB3aWxsCiAgICBkaWFnbm9zZSBhbiB1bmtub3duIGNsYXNzIGZvciwgZm9yIGV4YW1wbGUsIFtbOmxcb3dlcjpdXSB3aGVyZSBQZXJsIHdpbGwKICAgIHRyZWF0IGl0IGFzIFtbOmxvd2VyOl1dLiBIb3dldmVyLCBQQ1JFIGRvZXMgbm93IGdpdmUgInVua25vd24iIGVycm9ycyB3aGVyZQogICAgUGVybCBkb2VzLCBhbmQgd2hlcmUgaXQgZGlkbid0IGJlZm9yZS4KCjI0LiBSZXdyaXRlIHNvIGFzIHRvIHJlbW92ZSB0aGUgc2luZ2xlIHVzZSBvZiAlbiBmcm9tIHBjcmVncmVwIGJlY2F1c2UgaW4gc29tZQogICAgV2luZG93cyBlbnZpcm9ubWVudHMgJW4gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KCgpWZXJzaW9uIDcuNCAyMS1TZXAtMDcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiAgQ2hhbmdlIDcuMy8yOCB3YXMgaW1wbGVtZW50ZWQgZm9yIGNsYXNzZXMgYnkgbG9va2luZyBhdCB0aGUgYml0bWFwLiBUaGlzCiAgICBtZWFucyB0aGF0IGEgY2xhc3Mgc3VjaCBhcyBbXHNdIGNvdW50ZWQgYXMgImV4cGxpY2l0IHJlZmVyZW5jZSB0byBDUiBvcgogICAgTEYiLiBUaGF0IGlzbid0IHJlYWxseSByaWdodCAtIHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgY2hhbmdlIHdhcyB0byB0cnkgdG8KICAgIGhlbHAgd2hlbiB0aGVyZSB3YXMgYW4gYWN0dWFsIG1lbnRpb24gb2Ygb25lIG9mIHRoZSB0d28gY2hhcmFjdGVycy4gU28gbm93CiAgICB0aGUgY2hhbmdlIGhhcHBlbnMgb25seSBpZiBcciBvciBcbiAob3IgYSBsaXRlcmFsIENSIG9yIExGKSBjaGFyYWN0ZXIgaXMKICAgIGVuY291bnRlcmVkLgoKMi4gIFRoZSAzMi1iaXQgb3B0aW9ucyB3b3JkIHdhcyBhbHNvIHVzZWQgZm9yIDYgaW50ZXJuYWwgZmxhZ3MsIGJ1dCB0aGUgbnVtYmVycwogICAgb2YgYm90aCBoYWQgZ3Jvd24gdG8gdGhlIHBvaW50IHdoZXJlIHRoZXJlIHdlcmUgb25seSAzIGJpdHMgbGVmdC4KICAgIEZvcnR1bmF0ZWx5LCB0aGVyZSB3YXMgc3BhcmUgc3BhY2UgaW4gdGhlIGRhdGEgc3RydWN0dXJlLCBhbmQgc28gSSBoYXZlCiAgICBtb3ZlZCB0aGUgaW50ZXJuYWwgZmxhZ3MgaW50byBhIG5ldyAxNi1iaXQgZmllbGQgdG8gZnJlZSB1cCBtb3JlIG9wdGlvbgogICAgYml0cy4KCjMuICBUaGUgYXBwZWFyYW5jZSBvZiAoP0opIGF0IHRoZSBzdGFydCBvZiBhIHBhdHRlcm4gc2V0IHRoZSBEVVBOQU1FUyBvcHRpb24sCiAgICBidXQgZGlkIG5vdCBzZXQgdGhlIGludGVybmFsIEpDSEFOR0VEIGZsYWcgLSBlaXRoZXIgb2YgdGhlc2UgaXMgZW5vdWdoIHRvCiAgICBjb250cm9sIHRoZSB3YXkgdGhlICJnZXQiIGZ1bmN0aW9uIHdvcmtzIC0gYnV0IHRoZSBQQ1JFX0lORk9fSkNIQU5HRUQKICAgIGZhY2lsaXR5IGlzIHN1cHBvc2VkIHRvIHRlbGwgaWYgKD9KKSB3YXMgZXZlciB1c2VkLCBzbyBub3cgKD9KKSBhdCB0aGUKICAgIHN0YXJ0IHNldHMgYm90aCBiaXRzLgoKNC4gIEFkZGVkIG9wdGlvbnMgKGF0IGJ1aWxkIHRpbWUsIGNvbXBpbGUgdGltZSwgZXhlYyB0aW1lKSB0byBjaGFuZ2UgXFIgZnJvbQogICAgbWF0Y2hpbmcgYW55IFVuaWNvZGUgbGluZSBlbmRpbmcgc2VxdWVuY2UgdG8ganVzdCBtYXRjaGluZyBDUiwgTEYsIG9yIENSTEYuCgo1LiAgZG9jL3BjcmVzeW50YXguaHRtbCB3YXMgbWlzc2luZyBmcm9tIHRoZSBkaXN0cmlidXRpb24uCgo2LiAgUHV0IGJhY2sgdGhlIGRlZmluaXRpb24gb2YgUENSRV9FUlJPUl9OVUxMV1NMSU1JVCwgZm9yIGJhY2t3YXJkCiAgICBjb21wYXRpYmlsaXR5LCBldmVuIHRob3VnaCBpdCBpcyBubyBsb25nZXIgdXNlZC4KCjcuICBBZGRlZCBtYWNybyBmb3Igc25wcmludGYgdG8gcGNyZWNwcF91bml0dGVzdC5jYyBhbmQgYWxzbyBmb3Igc3RydG9sbCBhbmQKICAgIHN0cnRvdWxsIHRvIHBjcmVjcHAuY2MgdG8gc2VsZWN0IHRoZSBhdmFpbGFibGUgZnVuY3Rpb25zIGluIFdJTjMyIHdoZW4gdGhlCiAgICB3aW5kb3dzLmggZmlsZSBpcyBwcmVzZW50ICh3aGVyZSBkaWZmZXJlbnQgbmFtZXMgYXJlIHVzZWQpLiBbVGhpcyB3YXMKICAgIHJldmVyc2VkIGxhdGVyIGFmdGVyIHRlc3RpbmcgLSBzZWUgMTYgYmVsb3cuXQoKOC4gIENoYW5nZWQgYWxsICNpbmNsdWRlIDxjb25maWcuaD4gdG8gI2luY2x1ZGUgImNvbmZpZy5oIi4gVGhlcmUgd2VyZSBhbHNvCiAgICBzb21lIGZ1cnRoZXIgPHBjcmUuaD4gY2FzZXMgdGhhdCBJIGNoYW5nZWQgdG8gInBjcmUuaCIuCgo5LiAgV2hlbiBwY3JlZ3JlcCB3YXMgdXNlZCB3aXRoIHRoZSAtLWNvbG91ciBvcHRpb24sIGl0IG1pc3NlZCB0aGUgbGluZSBlbmRpbmcKICAgIHNlcXVlbmNlIG9mZiB0aGUgbGluZXMgdGhhdCBpdCBvdXRwdXQuCgoxMC4gSXQgd2FzIHBvaW50ZWQgb3V0IHRvIG1lIHRoYXQgYXJyYXlzIG9mIHN0cmluZyBwb2ludGVycyBjYXVzZSBsb3RzIG9mCiAgICByZWxvY2F0aW9ucyB3aGVuIGEgc2hhcmVkIGxpYnJhcnkgaXMgZHluYW1pY2FsbHkgbG9hZGVkLiBBIHRlY2huaXF1ZSBvZgogICAgdXNpbmcgYSBzaW5nbGUgbG9uZyBzdHJpbmcgd2l0aCBhIHRhYmxlIG9mIG9mZnNldHMgY2FuIGRyYXN0aWNhbGx5IHJlZHVjZQogICAgdGhlc2UuIEkgaGF2ZSByZWZhY3RvcmVkIFBDUkUgaW4gZm91ciBwbGFjZXMgdG8gZG8gdGhpcy4gVGhlIHJlc3VsdCBpcwogICAgZHJhbWF0aWM6CgogICAgICBPcmlnaW5hbGx5OiAgICAgICAgICAgICAgICAgICAgICAgICAgMjkwCiAgICAgIEFmdGVyIGNoYW5naW5nIFVDUCB0YWJsZTogICAgICAgICAgICAxODcKICAgICAgQWZ0ZXIgY2hhbmdpbmcgZXJyb3IgbWVzc2FnZSB0YWJsZTogICA0MwogICAgICBBZnRlciBjaGFuZ2luZyB0YWJsZSBvZiAidmVyYnMiICAgICAgIDM2CiAgICAgIEFmdGVyIGNoYW5naW5nIHRhYmxlIG9mIFBvc2l4IG5hbWVzICAgMjIKCiAgICBUaGFua3MgdG8gdGhlIGZvbGtzIHdvcmtpbmcgb24gR3JlZ2V4IGZvciBnbGliIGZvciB0aGlzIGluc2lnaHQuCgoxMS4gLS1kaXNhYmxlLXN0YWNrLWZvci1yZWN1cnNpb24gY2F1c2VkIGNvbXBpbGluZyB0byBmYWlsIHVubGVzcyAtZW5hYmxlLQogICAgdW5pY29kZS1wcm9wZXJ0aWVzIHdhcyBhbHNvIHNldC4KCjEyLiBVcGRhdGVkIHRoZSB0ZXN0cyBzbyB0aGF0IHRoZXkgd29yayB3aGVuIFxSIGlzIGRlZmF1bHRlZCB0byBBTllDUkxGLgoKMTMuIEFkZGVkIGNoZWNrcyBmb3IgQU5ZIGFuZCBBTllDUkxGIHRvIHBjcmVjcHAuY2Mgd2hlcmUgaXQgcHJldmlvdXNseQogICAgY2hlY2tlZCBvbmx5IGZvciBDUkxGLgoKMTQuIEFkZGVkIGNhc3RzIHRvIHBjcmV0ZXN0LmMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCgoxNS4gQWRkZWQgQ3JhaWcncyBwYXRjaCB0byB2YXJpb3VzIHBjcmVjcHAgbW9kdWxlcyB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4KCjE2LiBBZGRlZCBDcmFpZydzIHBhdGNoIHRvIHJlbW92ZSB0aGUgV0lORE9XU19IIHRlc3RzLCB0aGF0IHdlcmUgbm90IHdvcmtpbmcsCiAgICBhbmQgaW5zdGVhZCBjaGVjayBmb3IgX3N0cnRvaTY0IGV4cGxpY2l0bHksIGFuZCBhdm9pZCB0aGUgdXNlIG9mIHNucHJpbnRmKCkKICAgIGVudGlyZWx5LiBUaGlzIHJlbW92ZXMgY2hhbmdlcyBtYWRlIGluIDcgYWJvdmUuCgoxNy4gVGhlIENNYWtlIGZpbGVzIGhhdmUgYmVlbiB1cGRhdGVkLCBhbmQgdGhlcmUgaXMgbm93IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKICAgIGJ1aWxkaW5nIHdpdGggQ01ha2UgaW4gdGhlIE5PTi1VTklYLVVTRSBkb2N1bWVudC4KCgpWZXJzaW9uIDcuMyAyOC1BdWctMDcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogMS4gSW4gdGhlIHJlamlnZ2luZyBvZiB0aGUgYnVpbGQgc3lzdGVtIHRoYXQgZXZlbnR1YWxseSByZXN1bHRlZCBpbiA3LjEsIHRoZQogICAgbGluZSAiI2luY2x1ZGUgPHBjcmUuaD4iIHdhcyBpbmNsdWRlZCBpbiBwY3JlX2ludGVybmFsLmguIFRoZSB1c2Ugb2YgYW5nbGUKICAgIGJyYWNrZXRzIHRoZXJlIGlzIG5vdCByaWdodCwgc2luY2UgaXQgY2F1c2VzIGNvbXBpbGVycyB0byBsb29rIGZvciBhbgogICAgaW5zdGFsbGVkIHBjcmUuaCwgbm90IHRoZSB2ZXJzaW9uIHRoYXQgaXMgaW4gdGhlIHNvdXJjZSB0aGF0IGlzIGJlaW5nCiAgICBjb21waWxlZCAod2hpY2ggb2YgY291cnNlIG1heSBiZSBkaWZmZXJlbnQpLiBJIGhhdmUgY2hhbmdlZCBpdCBiYWNrIHRvOgoKICAgICAgI2luY2x1ZGUgInBjcmUuaCIKCiAgICBJIGhhdmUgYSB2YWd1ZSByZWNvbGxlY3Rpb24gdGhhdCB0aGUgY2hhbmdlIHdhcyBjb25jZXJuZWQgd2l0aCBjb21waWxpbmcgaW4KICAgIGRpZmZlcmVudCBkaXJlY3RvcmllcywgYnV0IGluIHRoZSBuZXcgYnVpbGQgc3lzdGVtLCB0aGF0IGlzIHRha2VuIGNhcmUgb2YKICAgIGJ5IHRoZSBWUEFUSCBzZXR0aW5nIHRoZSBNYWtlZmlsZS4KCiAyLiBUaGUgcGF0dGVybiAuKiQgd2hlbiBydW4gaW4gbm90LURPVEFMTCBVVEYtOCBtb2RlIHdpdGggbmV3bGluZT1hbnkgZmFpbGVkCiAgICB3aGVuIHRoZSBzdWJqZWN0IGhhcHBlbmVkIHRvIGVuZCBpbiB0aGUgYnl0ZSAweDg1IChlLmcuIGlmIHRoZSBsYXN0CiAgICBjaGFyYWN0ZXIgd2FzIFx4ezFlYzV9KS4gKkNoYXJhY3RlciogMHg4NSBpcyBvbmUgb2YgdGhlICJhbnkiIG5ld2xpbmUKICAgIGNoYXJhY3RlcnMgYnV0IG9mIGNvdXJzZSBpdCBzaG91bGRuJ3QgYmUgdGFrZW4gYXMgYSBuZXdsaW5lIHdoZW4gaXQgaXMgcGFydAogICAgb2YgYW5vdGhlciBjaGFyYWN0ZXIuIFRoZSBidWcgd2FzIHRoYXQsIGZvciBhbiB1bmxpbWl0ZWQgcmVwZWF0IG9mIC4gaW4KICAgIG5vdC1ET1RBTEwgVVRGLTggbW9kZSwgUENSRSB3YXMgYWR2YW5jaW5nIGJ5IGJ5dGVzIHJhdGhlciB0aGFuIGJ5CiAgICBjaGFyYWN0ZXJzIHdoZW4gbG9va2luZyBmb3IgYSBuZXdsaW5lLgoKIDMuIEEgc21hbGwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgaW4gdGhlIERPVEFMTCBVVEYtOCBtb2RlIC4qIGNhc2UuCgogNC4gRGVidWdnaW5nOiBhZGp1c3RlZCB0aGUgbmFtZXMgb2Ygb3Bjb2RlcyBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIHBhcmVudGhlc2VzCiAgICBpbiBkZWJ1ZyBvdXRwdXQuCgogNS4gQXJyYW5nZSB0byB1c2UgIiVJNjRkIiBpbnN0ZWFkIG9mICIlbGxkIiBhbmQgIiVJNjR1IiBpbnN0ZWFkIG9mICIlbGx1IiBmb3IKICAgIGxvbmcgcHJpbnRpbmcgaW4gdGhlIHBjcmVjcHAgdW5pdHRlc3Qgd2hlbiBydW5uaW5nIHVuZGVyIE1pbkdXLgoKIDYuIEVTQ19LIHdhcyBsZWZ0IG91dCBvZiB0aGUgRUJDRElDIHRhYmxlLgoKIDcuIENoYW5nZSA3LjAvMzggaW50cm9kdWNlZCBhIG5ldyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIG5lc3RlZCBub24tY2FwdHVyaW5nCiAgICBwYXJlbnRoZXNlczsgSSBtYWRlIGl0IDEwMDAsIHdoaWNoIHNlZW1lZCBsYXJnZSBlbm91Z2guIFVuZm9ydHVuYXRlbHksIHRoZQogICAgbGltaXQgYWxzbyBhcHBsaWVzIHRvICJ2aXJ0dWFsIG5lc3RpbmciIHdoZW4gYSBwYXR0ZXJuIGlzIHJlY3Vyc2l2ZSwgYW5kIGluCiAgICB0aGlzIGNhc2UgMTAwMCBpc24ndCBzbyBiaWcuIEkgaGF2ZSBiZWVuIGFibGUgdG8gcmVtb3ZlIHRoaXMgbGltaXQgYXQgdGhlCiAgICBleHBlbnNlIG9mIGJhY2tpbmcgb2ZmIG9uZSBvcHRpbWl6YXRpb24gaW4gY2VydGFpbiBjaXJjdW1zdGFuY2VzLiBOb3JtYWxseSwKICAgIHdoZW4gcGNyZV9leGVjKCkgd291bGQgY2FsbCBpdHMgaW50ZXJuYWwgbWF0Y2goKSBmdW5jdGlvbiByZWN1cnNpdmVseSBhbmQKICAgIGltbWVkaWF0ZWx5IHJldHVybiB0aGUgcmVzdWx0IHVuY29uZGl0aW9uYWxseSwgaXQgdXNlcyBhICJ0YWlsIHJlY3Vyc2lvbiIKICAgIGZlYXR1cmUgdG8gc2F2ZSBzdGFjay4gSG93ZXZlciwgd2hlbiBhIHN1YnBhdHRlcm4gdGhhdCBjYW4gbWF0Y2ggYW4gZW1wdHkKICAgIHN0cmluZyBoYXMgYW4gdW5saW1pdGVkIHJlcGV0aXRpb24gcXVhbnRpZmllciwgaXQgbm8gbG9uZ2VyIG1ha2VzIHRoaXMKICAgIG9wdGltaXphdGlvbi4gVGhhdCBnaXZlcyBpdCBhIHN0YWNrIGZyYW1lIGluIHdoaWNoIHRvIHNhdmUgdGhlIGRhdGEgZm9yCiAgICBjaGVja2luZyB0aGF0IGFuIGVtcHR5IHN0cmluZyBoYXMgYmVlbiBtYXRjaGVkLiBQcmV2aW91c2x5IHRoaXMgd2FzIHRha2VuCiAgICBmcm9tIHRoZSAxMDAwLWVudHJ5IHdvcmtzcGFjZSB0aGF0IGhhZCBiZWVuIHJlc2VydmVkLiBTbyBub3cgdGhlcmUgaXMgbm8KICAgIGV4cGxpY2l0IGxpbWl0LCBidXQgbW9yZSBzdGFjayBpcyB1c2VkLgoKIDguIEFwcGxpZWQgRGFuaWVsJ3MgcGF0Y2hlcyB0byBzb2x2ZSBwcm9ibGVtcyB3aXRoIHRoZSBpbXBvcnQvZXhwb3J0IG1hZ2ljCiAgICBzeW50YXggdGhhdCBpcyByZXF1aXJlZCBmb3IgV2luZG93cywgYW5kIHdoaWNoIHdhcyBnb2luZyB3cm9uZyBmb3IgdGhlCiAgICBwY3JlcG9zaXggYW5kIHBjcmVjcHAgcGFydHMgb2YgdGhlIGxpYnJhcnkuIFRoZXNlIHdlcmUgb3Zlcmxvb2tlZCB3aGVuIHRoaXMKICAgIHByb2JsZW0gd2FzIHNvbHZlZCBmb3IgdGhlIG1haW4gbGlicmFyeS4KCiA5LiBUaGVyZSB3ZXJlIHNvbWUgY3J1ZGUgc3RhdGljIHRlc3RzIHRvIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBjb21wdXRpbmcKICAgIHRoZSBzaXplIG9mIHBhdHRlcm5zIHRoYXQgY29udGFpbiByZXBlYXRlZCBncm91cHMgd2l0aCBleHBsaWNpdCB1cHBlcgogICAgbGltaXRzLiBBcyB0aGUgbWF4aW11bSBxdWFudGlmaWVyIGlzIDY1NTM1LCB0aGUgbWF4aW11bSBncm91cCBsZW5ndGggd2FzCiAgICBzZXQgYXQgMzAsMDAwIHNvIHRoYXQgdGhlIHByb2R1Y3Qgb2YgdGhlc2UgdHdvIG51bWJlcnMgZGlkIG5vdCBvdmVyZmxvdyBhCiAgICAzMi1iaXQgaW50ZWdlci4gSG93ZXZlciwgaXQgdHVybnMgb3V0IHRoYXQgcGVvcGxlIHdhbnQgdG8gdXNlIGdyb3VwcyB0aGF0CiAgICBhcmUgbG9uZ2VyIHRoYW4gMzAsMDAwIGJ5dGVzICh0aG91Z2ggbm90IHJlcGVhdCB0aGVtIHRoYXQgbWFueSB0aW1lcykuCiAgICBDaGFuZ2UgNy4wLzE3ICh0aGUgcmVmYWN0b3Jpbmcgb2YgdGhlIHdheSB0aGUgcGF0dGVybiBzaXplIGlzIGNvbXB1dGVkKSBoYXMKICAgIG1hZGUgaXQgcG9zc2libGUgdG8gaW1wbGVtZW50IHRoZSBpbnRlZ2VyIG92ZXJmbG93IGNoZWNrcyBpbiBhIG11Y2ggbW9yZQogICAgZHluYW1pYyB3YXksIHdoaWNoIEkgaGF2ZSBub3cgZG9uZS4gVGhlIGFydGlmaWNpYWwgbGltaXRhdGlvbiBvbiBncm91cAogICAgbGVuZ3RoIGhhcyBiZWVuIHJlbW92ZWQgLSB3ZSBub3cgaGF2ZSBvbmx5IHRoZSBsaW1pdCBvbiB0aGUgdG90YWwgbGVuZ3RoIG9mCiAgICB0aGUgY29tcGlsZWQgcGF0dGVybiwgd2hpY2ggZGVwZW5kcyBvbiB0aGUgTElOS19TSVpFIHNldHRpbmcuCgoxMC4gRml4ZWQgYSBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGdldC9jb3B5IG5hbWVkIHN1YnN0cmluZyB3aGVuCiAgICBkdXBsaWNhdGUgbmFtZXMgYXJlIHBlcm1pdHRlZC4gSWYgbm9uZSBvZiB0aGUgbmFtZWQgc3Vic3RyaW5ncyBhcmUgc2V0LCB0aGUKICAgIGZ1bmN0aW9ucyByZXR1cm4gUENSRV9FUlJPUl9OT1NVQlNUUklORyAoNyk7IHRoZSBkb2Mgc2FpZCB0aGV5IHJldHVybmVkIGFuCiAgICBlbXB0eSBzdHJpbmcuCgoxMS4gQmVjYXVzZSBQZXJsIGludGVycHJldHMgXFEuLi5cRSBhdCBhIGhpZ2ggbGV2ZWwsIGFuZCBpZ25vcmVzIG9ycGhhbiBcRQogICAgaW5zdGFuY2VzLCBwYXR0ZXJucyBzdWNoIGFzIFtcUVxFXSBvciBbXEVdIG9yIGV2ZW4gW15cRV0gY2F1c2UgYW4gZXJyb3IsCiAgICBiZWNhdXNlIHRoZSBdIGlzIGludGVycHJldGVkIGFzIHRoZSBmaXJzdCBkYXRhIGNoYXJhY3RlciBhbmQgdGhlCiAgICB0ZXJtaW5hdGluZyBdIGlzIG5vdCBmb3VuZC4gUENSRSBoYXMgYmVlbiBtYWRlIGNvbXBhdGlibGUgd2l0aCBQZXJsIGluIHRoaXMKICAgIHJlZ2FyZC4gUHJldmlvdXNseSwgaXQgaW50ZXJwcmV0ZWQgW1xRXEVdIGFzIGFuIGVtcHR5IGNsYXNzLCBhbmQgW1xFXSBjb3VsZAogICAgY2F1c2UgbWVtb3J5IG92ZXJ3cml0aW5nLgoKMTAuIExpa2UgUGVybCwgUENSRSBhdXRvbWF0aWNhbGx5IGJyZWFrcyBhbiB1bmxpbWl0ZWQgcmVwZWF0IGFmdGVyIGFuIGVtcHR5CiAgICBzdHJpbmcgaGFzIGJlZW4gbWF0Y2hlZCAodG8gc3RvcCBhbiBpbmZpbml0ZSBsb29wKS4gSXQgd2FzIG5vdCByZWNvZ25pemluZwogICAgYSBjb25kaXRpb25hbCBzdWJwYXR0ZXJuIHRoYXQgY291bGQgbWF0Y2ggYW4gZW1wdHkgc3RyaW5nIGlmIHRoYXQKICAgIHN1YnBhdHRlcm4gd2FzIHdpdGhpbiBhbm90aGVyIHN1YnBhdHRlcm4uIEZvciBleGFtcGxlLCBpdCBsb29wZWQgd2hlbgogICAgdHJ5aW5nIHRvIG1hdGNoICAoKCg/KDEpWHwpKSopICBidXQgaXQgd2FzIE9LIHdpdGggICgoPygxKVh8KSopICB3aGVyZSB0aGUKICAgIGNvbmRpdGlvbiB3YXMgbm90IG5lc3RlZC4gVGhpcyBidWcgaGFzIGJlZW4gZml4ZWQuCgoxMi4gQSBwYXR0ZXJuIGxpa2UgXFg/XGQgb3IgXFB7TH0/XGQgaW4gbm9uLVVURi04IG1vZGUgY291bGQgY2F1c2UgYSBiYWNrdHJhY2sKICAgIHBhc3QgdGhlIHN0YXJ0IG9mIHRoZSBzdWJqZWN0IGluIHRoZSBwcmVzZW5jZSBvZiBieXRlcyB3aXRoIHRoZSB0b3AgYml0CiAgICBzZXQsIGZvciBleGFtcGxlICJceDhhQkNEIi4KCjEzLiBBZGRlZCBQZXJsIDUuMTAgZXhwZXJpbWVudGFsIGJhY2t0cmFja2luZyBjb250cm9scyAoKkZBSUwpLCAoKkYpLCAoKlBSVU5FKSwKICAgICgqU0tJUCksICgqVEhFTiksICgqQ09NTUlUKSwgYW5kICgqQUNDRVBUKS4KCjE0LiBPcHRpbWl6ZWQgKD8hKSB0byAoKkZBSUwpLgoKMTUuIFVwZGF0ZWQgdGhlIHRlc3QgZm9yIGEgdmFsaWQgVVRGLTggc3RyaW5nIHRvIGNvbmZvcm0gdG8gdGhlIGxhdGVyIFJGQyAzNjI5LgogICAgVGhpcyByZXN0cmljdHMgY29kZSBwb2ludHMgdG8gYmUgd2l0aGluIHRoZSByYW5nZSAwIHRvIDB4MTBGRkZGLCBleGNsdWRpbmcKICAgIHRoZSAibG93IHN1cnJvZ2F0ZSIgc2VxdWVuY2UgMHhEODAwIHRvIDB4REZGRi4gUHJldmlvdXNseSwgUENSRSBhbGxvd2VkIHRoZQogICAgZnVsbCByYW5nZSAwIHRvIDB4N0ZGRkZGRkYsIGFzIGRlZmluZWQgYnkgUkZDIDIyNzkuIEludGVybmFsbHksIGl0IHN0aWxsCiAgICBkb2VzOiBpdCdzIGp1c3QgdGhlIHZhbGlkaXR5IGNoZWNrIHRoYXQgaXMgbW9yZSByZXN0cmljdGl2ZS4KCjE2LiBJbnNlcnRlZCBjaGVja3MgZm9yIGludGVnZXIgb3ZlcmZsb3dzIGR1cmluZyBlc2NhcGUgc2VxdWVuY2UgKGJhY2tzbGFzaCkKICAgIHByb2Nlc3NpbmcsIGFuZCBhbHNvIGZpeGVkIGVycm9uZW91cyBvZmZzZXQgdmFsdWVzIGZvciBzeW50YXggZXJyb3JzIGR1cmluZwogICAgYmFja3NsYXNoIHByb2Nlc3NpbmcuCgoxNy4gRml4ZWQgYW5vdGhlciBjYXNlIG9mIGxvb2tpbmcgdG9vIGZhciBiYWNrIGluIG5vbi1VVEYtOCBtb2RlIChjZiAxMiBhYm92ZSkKICAgIGZvciBwYXR0ZXJucyBsaWtlIFtcUFBQXHg4YV17MSx9XHg4MCB3aXRoIHRoZSBzdWJqZWN0ICJBXHg4MCIuCgoxOC4gQW4gdW50ZXJtaW5hdGVkIGNsYXNzIGluIGEgcGF0dGVybiBsaWtlICg/MSlcY1sgd2l0aCBhICJmb3J3YXJkIHJlZmVyZW5jZSIKICAgIGNhdXNlZCBhbiBvdmVycnVuLgoKMTkuIEEgcGF0dGVybiBsaWtlICg/OltcUFBhKl0qKXs4LH0gd2hpY2ggaGFkIGFuICJleHRlbmRlZCBjbGFzcyIgKG9uZSB3aXRoCiAgICBzb21ldGhpbmcgb3RoZXIgdGhhbiBqdXN0IEFTQ0lJIGNoYXJhY3RlcnMpIGluc2lkZSBhIGdyb3VwIHRoYXQgaGFkIGFuCiAgICB1bmxpbWl0ZWQgcmVwZWF0IGNhdXNlZCBhIGxvb3AgYXQgY29tcGlsZSB0aW1lICh3aGlsZSBjaGVja2luZyB0byBzZWUKICAgIHdoZXRoZXIgdGhlIGdyb3VwIGNvdWxkIG1hdGNoIGFuIGVtcHR5IHN0cmluZykuCgoyMC4gRGVidWdnaW5nIGEgcGF0dGVybiBjb250YWluaW5nIFxwIG9yIFxQIGNvdWxkIGNhdXNlIGEgY3Jhc2guIEZvciBleGFtcGxlLAogICAgW1xQe0FueX1dIGRpZCBzby4gKEVycm9yIGluIHRoZSBjb2RlIGZvciBwcmludGluZyBwcm9wZXJ0eSBuYW1lcy4pCgoyMS4gQW4gb3JwaGFuIFxFIGluc2lkZSBhIGNoYXJhY3RlciBjbGFzcyBjb3VsZCBjYXVzZSBhIGNyYXNoLgoKMjIuIEEgcmVwZWF0ZWQgY2FwdHVyaW5nIGJyYWNrZXQgc3VjaCBhcyAoQSk/IGNvdWxkIGNhdXNlIGEgd2lsZCBtZW1vcnkKICAgIHJlZmVyZW5jZSBkdXJpbmcgY29tcGlsYXRpb24uCgoyMy4gVGhlcmUgYXJlIHNldmVyYWwgZnVuY3Rpb25zIGluIHBjcmVfY29tcGlsZSgpIHRoYXQgc2NhbiBhbG9uZyBhIGNvbXBpbGVkCiAgICBleHByZXNzaW9uIGZvciB2YXJpb3VzIHJlYXNvbnMgKGUuZy4gdG8gc2VlIGlmIGl0J3MgZml4ZWQgbGVuZ3RoIGZvciBsb29rCiAgICBiZWhpbmQpLiBUaGVyZSB3ZXJlIGJ1Z3MgaW4gdGhlc2UgZnVuY3Rpb25zIHdoZW4gYSByZXBlYXRlZCBccCBvciBcUCB3YXMKICAgIHByZXNlbnQgaW4gdGhlIHBhdHRlcm4uIFRoZXNlIG9wZXJhdG9ycyBoYXZlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBjb21wYXJlZAogICAgd2l0aCBcZCwgZXRjLCBhbmQgdGhlc2Ugd2VyZSBub3QgYmVpbmcgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gbW92aW5nIGFsb25nCiAgICB0aGUgY29tcGlsZWQgZGF0YS4gU3BlY2lmaWNhbGx5OgoKICAgIChhKSBBIGl0ZW0gc3VjaCBhcyBccHtZaX17M30gaW4gYSBsb29rYmVoaW5kIHdhcyBub3QgdHJlYXRlZCBhcyBmaXhlZAogICAgICAgIGxlbmd0aC4KCiAgICAoYikgQW4gaXRlbSBzdWNoIGFzIFxwTCsgd2l0aGluIGEgcmVwZWF0ZWQgZ3JvdXAgY291bGQgY2F1c2UgY3Jhc2hlcyBvcgogICAgICAgIGxvb3BzLgoKICAgIChjKSBBIHBhdHRlcm4gc3VjaCBhcyBccHtZaX0rKFxQe1lpfSspKD8xKSBjb3VsZCBnaXZlIGFuIGluY29ycmVjdAogICAgICAgICJyZWZlcmVuY2UgdG8gbm9uLWV4aXN0ZW50IHN1YnBhdHRlcm4iIGVycm9yLgoKICAgIChkKSBBIHBhdHRlcm4gbGlrZSAoXFB7WWl9ezJ9XDI3Nyk/IGNvdWxkIGxvb3AgYXQgY29tcGlsZSB0aW1lLgoKMjQuIEEgcmVwZWF0ZWQgXFMgb3IgXFcgaW4gVVRGLTggbW9kZSBjb3VsZCBnaXZlIHdyb25nIGFuc3dlcnMgd2hlbiBtdWx0aWJ5dGUKICAgIGNoYXJhY3RlcnMgd2VyZSBpbnZvbHZlZCAoZm9yIGV4YW1wbGUgL1xTezJ9LzhnIHdpdGggIkFceHthM31CQyIpLgoKMjUuIFVzaW5nIHBjcmVncmVwIGluIG11bHRpbGluZSwgaW52ZXJ0ZWQgbW9kZSAoLU12KSBjYXVzZWQgaXQgdG8gbG9vcC4KCjI2LiBQYXR0ZXJucyBzdWNoIGFzIFtcUHtZaX1BXSB3aGljaCBpbmNsdWRlIFxwIG9yIFxQIGFuZCBqdXN0IG9uZSBvdGhlcgogICAgY2hhcmFjdGVyIHdlcmUgY2F1c2luZyBjcmFzaGVzIChicm9rZW4gb3B0aW1pemF0aW9uKS4KCjI3LiBQYXR0ZXJucyBzdWNoIGFzIChcUHtZaX0qXDI3NykqIChncm91cCB3aXRoIHBvc3NpYmxlIHplcm8gcmVwZWF0IGNvbnRhaW5pbmcKICAgIFxwIG9yIFxQKSBjYXVzZWQgYSBjb21waWxlLXRpbWUgbG9vcC4KCjI4LiBNb3JlIHByb2JsZW1zIGhhdmUgYXJpc2VuIGluIHVuYW5jaG9yZWQgcGF0dGVybnMgd2hlbiBDUkxGIGlzIGEgdmFsaWQgbGluZQogICAgYnJlYWsuIEZvciBleGFtcGxlLCB0aGUgdW5zdHVkaWVkIHBhdHRlcm4gW1xyXG5dQSBkb2VzIG5vdCBtYXRjaCB0aGUgc3RyaW5nCiAgICAiXHJcbkEiIGJlY2F1c2UgY2hhbmdlIDcuMC80NiBiZWxvdyBtb3ZlcyB0aGUgY3VycmVudCBwb2ludCBvbiBieSB0d28KICAgIGNoYXJhY3RlcnMgYWZ0ZXIgZmFpbGluZyB0byBtYXRjaCBhdCB0aGUgc3RhcnQuIEhvd2V2ZXIsIHRoZSBwYXR0ZXJuIFxuQQogICAgKmRvZXMqIG1hdGNoLCBiZWNhdXNlIGl0IGRvZXNuJ3Qgc3RhcnQgdGlsbCBcbiwgYW5kIGlmIFtcclxuXUEgaXMgc3R1ZGllZCwKICAgIHRoZSBzYW1lIGlzIHRydWUuIFRoZXJlIGRvZXNuJ3Qgc2VlbSBhbnkgdmVyeSBjbGVhbiB3YXkgb3V0IG9mIHRoaXMsIGJ1dAogICAgd2hhdCBJIGhhdmUgY2hvc2VuIHRvIGRvIG1ha2VzIHRoZSBjb21tb24gY2FzZXMgd29yazogUENSRSBub3cgdGFrZXMgbm90ZQogICAgb2Ygd2hldGhlciB0aGVyZSBjYW4gYmUgYW4gZXhwbGljaXQgbWF0Y2ggZm9yIFxyIG9yIFxuIGFueXdoZXJlIGluIHRoZQogICAgcGF0dGVybiwgYW5kIGlmIHNvLCA3LjAvNDYgbm8gbG9uZ2VyIGFwcGxpZXMuIEFzIHBhcnQgb2YgdGhpcyBjaGFuZ2UsCiAgICB0aGVyZSdzIGEgbmV3IFBDUkVfSU5GT19IQVNDUk9STEYgb3B0aW9uIGZvciBmaW5kaW5nIG91dCB3aGV0aGVyIGEgY29tcGlsZWQKICAgIHBhdHRlcm4gaGFzIGV4cGxpY2l0IENSIG9yIExGIHJlZmVyZW5jZXMuCgoyOS4gQWRkZWQgKCpDUikgZXRjIGZvciBjaGFuZ2luZyBuZXdsaW5lIHNldHRpbmcgYXQgc3RhcnQgb2YgcGF0dGVybi4KCgpWZXJzaW9uIDcuMiAxOS1KdW4tMDcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogMS4gSWYgdGhlIGZyX0ZSIGxvY2FsZSBjYW5ub3QgYmUgZm91bmQgZm9yIHRlc3QgMywgdHJ5IHRoZSAiZnJlbmNoIiBsb2NhbGUsCiAgICB3aGljaCBpcyBhcHBhcmVudGx5IG5vcm1hbGx5IGF2YWlsYWJsZSB1bmRlciBXaW5kb3dzLgoKIDIuIFJlLWppZyB0aGUgcGNyZWdyZXAgdGVzdHMgd2l0aCBkaWZmZXJlbnQgbmV3bGluZSBzZXR0aW5ncyBpbiBhbiBhdHRlbXB0CiAgICB0byBtYWtlIHRoZW0gaW5kZXBlbmRlbnQgb2YgdGhlIGxvY2FsIGVudmlyb25tZW50J3MgbmV3bGluZSBzZXR0aW5nLgoKIDMuIEFkZCBjb2RlIHRvIGNvbmZpZ3VyZS5hYyB0byByZW1vdmUgLWcgZnJvbSB0aGUgQ0ZMQUdTIGRlZmF1bHQgc2V0dGluZ3MuCgogNC4gU29tZSBvZiB0aGUgImludGVybmFscyIgdGVzdHMgd2VyZSBwcmV2aW91c2x5IGN1dCBvdXQgd2hlbiB0aGUgbGluayBzaXplCiAgICB3YXMgbm90IDIsIGJlY2F1c2UgdGhlIG91dHB1dCBjb250YWluZWQgYWN0dWFsIG9mZnNldHMuIFRoZSByZWNlbnQgbmV3CiAgICAiWiIgZmVhdHVyZSBvZiBwY3JldGVzdCBtZWFucyB0aGF0IHRoZXNlIGNhbiBiZSBjdXQgb3V0LCBtYWtpbmcgdGhlIHRlc3RzCiAgICB1c2FibGUgd2l0aCBhbGwgbGluayBzaXplcy4KCiA1LiBJbXBsZW1lbnRlZCBTdGFuIFN3aXR6ZXIncyBnb3RvIHJlcGxhY2VtZW50IGZvciBsb25nam1wKCkgd2hlbiBub3QgdXNpbmcKICAgIHN0YWNrIHJlY3Vyc2lvbi4gVGhpcyBnaXZlcyBhIG1hc3NpdmUgcGVyZm9ybWFuY2UgYm9vc3QgdW5kZXIgQlNELCBidXQganVzdAogICAgYSBzbWFsbCBpbXByb3ZlbWVudCB1bmRlciBMaW51eC4gSG93ZXZlciwgaXQgc2F2ZXMgb25lIGZpZWxkIGluIHRoZSBmcmFtZQogICAgaW4gYWxsIGNhc2VzLgoKIDYuIEFkZGVkIG1vcmUgZmVhdHVyZXMgZnJvbSB0aGUgZm9ydGhjb21pbmcgUGVybCA1LjEwOgoKICAgIChhKSAoPy1uKSAod2hlcmUgbiBpcyBhIHN0cmluZyBvZiBkaWdpdHMpIGlzIGEgcmVsYXRpdmUgc3Vicm91dGluZSBvcgogICAgICAgIHJlY3Vyc2lvbiBjYWxsLiBJdCByZWZlcnMgdG8gdGhlIG50aCBtb3N0IHJlY2VudGx5IG9wZW5lZCBwYXJlbnRoZXNlcy4KCiAgICAoYikgKD8rbikgaXMgYWxzbyBhIHJlbGF0aXZlIHN1YnJvdXRpbmUgY2FsbDsgaXQgcmVmZXJzIHRvIHRoZSBudGggbmV4dAogICAgICAgIHRvIGJlIG9wZW5lZCBwYXJlbnRoZXNlcy4KCiAgICAoYykgQ29uZGl0aW9ucyB0aGF0IHJlZmVyIHRvIGNhcHR1cmluZyBwYXJlbnRoZXNlcyBjYW4gYmUgc3BlY2lmaWVkCiAgICAgICAgcmVsYXRpdmVseSwgZm9yIGV4YW1wbGUsICg/KC0yKS4uLiBvciAoPygrMykuLi4KCiAgICAoZCkgXEsgcmVzZXRzIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBtYXRjaCBzbyB0aGF0IGV2ZXJ5dGhpbmcgYmVmb3JlCiAgICAgICAgaXMgbm90IHBhcnQgb2YgaXQuCgogICAgKGUpIFxre25hbWV9IGlzIHN5bm9ueW1vdXMgd2l0aCBcazxuYW1lPiBhbmQgXGsnbmFtZScgKC5ORVQgY29tcGF0aWJsZSkuCgogICAgKGYpIFxne25hbWV9IGlzIGFub3RoZXIgc3lub255bSAtIHBhcnQgb2YgUGVybCA1LjEwJ3MgdW5pZmljYXRpb24gb2YKICAgICAgICByZWZlcmVuY2Ugc3ludGF4LgoKICAgIChnKSAoP3wgaW50cm9kdWNlcyBhIGdyb3VwIGluIHdoaWNoIHRoZSBudW1iZXJpbmcgb2YgcGFyZW50aGVzZXMgaW4gZWFjaAogICAgICAgIGFsdGVybmF0aXZlIHN0YXJ0cyB3aXRoIHRoZSBzYW1lIG51bWJlci4KCiAgICAoaCkgXGgsIFxILCBcdiwgYW5kIFxWIG1hdGNoIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHdoaXRlc3BhY2UuCgogNy4gQWRkZWQgdHdvIG5ldyBjYWxscyB0byBwY3JlX2Z1bGxpbmZvKCk6IFBDUkVfSU5GT19PS1BBUlRJQUwgYW5kCiAgICBQQ1JFX0lORk9fSkNIQU5HRUQuCgogOC4gQSBwYXR0ZXJuIHN1Y2ggYXMgICguKiguKT8pKiAgY2F1c2VkIHBjcmVfZXhlYygpIHRvIGZhaWwgYnkgZWl0aGVyIG5vdAogICAgdGVybWluYXRpbmcgb3IgYnkgY3Jhc2hpbmcuIERpYWdub3NlZCBieSBWaWt0b3IgR3JpcGg7IGl0IHdhcyBpbiB0aGUgY29kZQogICAgZm9yIGRldGVjdGluZyBncm91cHMgdGhhdCBjYW4gbWF0Y2ggYW4gZW1wdHkgc3RyaW5nLgoKIDkuIEEgcGF0dGVybiB3aXRoIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgYWx0ZXJuYXRpdmVzIChtb3JlIHRoYW4gc2V2ZXJhbAogICAgaHVuZHJlZCkgd2FzIHJ1bm5pbmcgb3V0IG9mIGludGVybmFsIHdvcmtzcGFjZSBkdXJpbmcgdGhlIHByZS1jb21waWxlCiAgICBwaGFzZSwgd2hlcmUgcGNyZV9jb21waWxlKCkgZmlndXJlcyBvdXQgaG93IG11Y2ggbWVtb3J5IHdpbGwgYmUgbmVlZGVkLiBBCiAgICBiaXQgb2YgbmV3IGN1bm5pbmcgaGFzIHJlZHVjZWQgdGhlIHdvcmtzcGFjZSBuZWVkZWQgZm9yIGdyb3VwcyB3aXRoCiAgICBhbHRlcm5hdGl2ZXMuIFRoZSAxMDAwLWFsdGVybmF0aXZlIHRlc3QgcGF0dGVybiBub3cgdXNlcyAxMiBieXRlcyBvZgogICAgd29ya3NwYWNlIGluc3RlYWQgb2YgcnVubmluZyBvdXQgb2YgdGhlIDQwOTYgdGhhdCBhcmUgYXZhaWxhYmxlLgoKMTAuIEluc2VydGVkIHNvbWUgbWlzc2luZyAodW5zaWduZWQgaW50KSBjYXN0cyB0byBnZXQgcmlkIG9mIGNvbXBpbGVyIHdhcm5pbmdzLgoKMTEuIEFwcGxpZWQgcGF0Y2ggZnJvbSBHb29nbGUgdG8gcmVtb3ZlIGFuIG9wdGltaXphdGlvbiB0aGF0IGRpZG4ndCBxdWl0ZSB3b3JrLgogICAgVGhlIHJlcG9ydCBvZiB0aGUgYnVnIHNhaWQ6CgogICAgICBwY3JlY3BwOjpSRSgiYSoiKS5GdWxsTWF0Y2goImFhYSIpIG1hdGNoZXMsIHdoaWxlCiAgICAgIHBjcmVjcHA6OlJFKCJhKj8iKS5GdWxsTWF0Y2goImFhYSIpIGRvZXMgbm90LCBhbmQKICAgICAgcGNyZWNwcDo6UkUoImEqP1xceiIpLkZ1bGxNYXRjaCgiYWFhIikgZG9lcyBhZ2Fpbi4KCjEyLiBJZiBccCBvciBcUCB3YXMgdXNlZCBpbiBub24tVVRGLTggbW9kZSBvbiBhIGNoYXJhY3RlciBncmVhdGVyIHRoYW4gMTI3CiAgICBpdCBtYXRjaGVkIHRoZSB3cm9uZyBudW1iZXIgb2YgYnl0ZXMuCgoKVmVyc2lvbiA3LjEgMjQtQXByLTA3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIDEuIEFwcGxpZWQgQm9iIFJvc3NpIGFuZCBEYW5pZWwgRydzIHBhdGNoZXMgdG8gY29udmVydCB0aGUgYnVpbGQgc3lzdGVtIHRvIG9uZQogICAgdGhhdCBpcyBtb3JlICJzdGFuZGFyZCIsIG1ha2luZyB1c2Ugb2YgYXV0b21ha2UgYW5kIG90aGVyIEF1dG90b29scy4gVGhlcmUKICAgIGlzIHNvbWUgcmUtYXJyYW5nZW1lbnQgb2YgdGhlIGZpbGVzIGFuZCBhZGp1c3RtZW50IG9mIGNvbW1lbnRzIGNvbnNlcXVlbnQKICAgIG9uIHRoaXMuCgogMi4gUGFydCBvZiB0aGUgcGF0Y2ggZml4ZWQgYSBwcm9ibGVtIHdpdGggdGhlIHBjcmVncmVwIHRlc3RzLiBUaGUgdGVzdCBvZiAtcgogICAgZm9yIHJlY3Vyc2l2ZSBkaXJlY3Rvcnkgc2Nhbm5pbmcgYnJva2Ugb24gc29tZSBzeXN0ZW1zIGJlY2F1c2UgdGhlIGZpbGVzCiAgICBhcmUgbm90IHNjYW5uZWQgaW4gYW55IHNwZWNpZmljIG9yZGVyIGFuZCBvbiBkaWZmZXJlbnQgc3lzdGVtcyB0aGUgb3JkZXIKICAgIHdhcyBkaWZmZXJlbnQuIEEgY2FsbCB0byAic29ydCIgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byBSdW5HcmVwVGVzdCBmb3IgdGhlCiAgICBhcHByb3ByYXRlIHRlc3QgYXMgYSBzaG9ydC10ZXJtIGZpeC4gSW4gdGhlIGxvbmdlciB0ZXJtIHRoZXJlIG1heSBiZSBhbgogICAgYWx0ZXJuYXRpdmUuCgogMy4gSSBoYWQgYW4gZW1haWwgZnJvbSBFcmljIFJheW1vbmQgYWJvdXQgcHJvYmxlbXMgdHJhbnNsYXRpbmcgc29tZSBvZiBQQ1JFJ3MKICAgIG1hbiBwYWdlcyB0byBIVE1MIChkZXNwaXRlIHRoZSBmYWN0IHRoYXQgSSBkaXN0cmlidXRlIEhUTUwgcGFnZXMsIHNvbWUKICAgIHBlb3BsZSBkbyB0aGVpciBvd24gY29udmVyc2lvbnMgZm9yIHZhcmlvdXMgcmVhc29ucykuIFRoZSBwcm9ibGVtcwogICAgY29uY2VybmVkIHRoZSB1c2Ugb2YgbG93LWxldmVsIHRyb2ZmIG1hY3JvcyAuYnIgYW5kIC5pbi4gSSBoYXZlIHRoZXJlZm9yZQogICAgcmVtb3ZlZCBhbGwgc3VjaCB1c2VzIGZyb20gdGhlIG1hbiBwYWdlcyAoc29tZSB3ZXJlIHJlZHVuZGFudCwgc29tZSBjb3VsZAogICAgYmUgcmVwbGFjZWQgYnkgLm5mLy5maSBwYWlycykuIFRoZSAxMzJodG1sIHNjcmlwdCB0aGF0IEkgdXNlIHRvIGdlbmVyYXRlCiAgICBIVE1MIGhhcyBiZWVuIHVwZGF0ZWQgdG8gaGFuZGxlIC5uZi8uZmkgYW5kIHRvIGNvbXBsYWluIGlmIGl0IGVuY291bnRlcnMKICAgIC5iciBvciAuaW4uCgogNC4gVXBkYXRlZCBjb21tZW50cyBpbiBjb25maWd1cmUuYWMgdGhhdCBnZXQgcGxhY2VkIGluIGNvbmZpZy5oLmluIGFuZCBhbHNvCiAgICBhcnJhbmdlZCBmb3IgY29uZmlnLmggdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgd2l0aCB0aGUgbmFtZQogICAgY29uZmlnLmguZ2VuZXJpYywgZm9yIHRoZSBiZW5lZml0IG9mIHRob3NlIHdobyBoYXZlIHRvIGNvbXBpbGUgd2l0aG91dAogICAgQXV0b3Rvb2xzIChjb21wYXJlIHBjcmUuaCwgd2hpY2ggaXMgbm93IGRpc3RyaWJ1dGVkIGFzIHBjcmUuaC5nZW5lcmljKS4KCiA1LiBVcGRhdGVkIHRoZSBzdXBwb3J0IChzdWNoIGFzIGl0IGlzKSBmb3IgVmlydHVhbCBQYXNjYWwsIHRoYW5rcyB0byBTdGVmYW4KICAgIFdlYmVyOiAoMSkgcGNyZV9pbnRlcm5hbC5oIHdhcyBtaXNzaW5nIHNvbWUgZnVuY3Rpb24gcmVuYW1lczsgKDIpIHVwZGF0ZWQKICAgIG1ha2V2cC5iYXQgZm9yIHRoZSBjdXJyZW50IFBDUkUsIHVzaW5nIHRoZSBhZGRpdGlvbmFsIGZpbGVzCiAgICBtYWtldnBfYy50eHQsIG1ha2V2cF9sLnR4dCwgYW5kIHBjcmVnZXhwLnBhcy4KCiA2LiBBIFdpbmRvd3MgdXNlciByZXBvcnRlZCBhIG1pbm9yIGRpc2NyZXBhbmN5IHdpdGggdGVzdCAyLCB3aGljaCB0dXJuZWQgb3V0CiAgICB0byBiZSBjYXVzZWQgYnkgYSB0cmFpbGluZyBzcGFjZSBvbiBhbiBpbnB1dCBsaW5lIHRoYXQgaGFkIGdvdCBsb3N0IGluIGhpcwogICAgY29weS4gVGhlIHRyYWlsaW5nIHNwYWNlIHdhcyBhbiBhY2NpZGVudCwgc28gSSd2ZSBqdXN0IHJlbW92ZWQgaXQuCgogNy4gQWRkIC1XbCwtUi4uLiBmbGFncyBpbiBwY3JlLWNvbmZpZy5pbiBmb3IgKkJTRCogc3lzdGVtcywgYXMgSSdtIHRvbGQKICAgIHRoYXQgaXMgbmVlZGVkLgoKIDguIE1hcmsgdWNwX3RhYmxlIChpbiB1Y3B0YWJsZS5oKSBhbmQgdWNwX2dlbnR5cGUgKGluIHBjcmVfdWNwX3NlYXJjaGZ1bmNzLmMpCiAgICBhcyAiY29uc3QiIChhKSBiZWNhdXNlIHRoZXkgYXJlIGFuZCAoYikgYmVjYXVzZSBpdCBoZWxwcyB0aGUgUEhQCiAgICBtYWludGFpbmVycyB3aG8gaGF2ZSByZWNlbnRseSBtYWRlIGEgc2NyaXB0IHRvIGRldGVjdCBiaWcgZGF0YSBzdHJ1Y3R1cmVzCiAgICBpbiB0aGUgcGhwIGNvZGUgdGhhdCBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIC5yb2RhdGEgc2VjdGlvbi4gSSByZW1lbWJlcmVkCiAgICB0byB1cGRhdGUgQnVpbGR1Y3B0YWJsZSBhcyB3ZWxsLCBzbyBpdCB3b24ndCByZXZlcnQgaWYgdWNwdGFibGUuaCBpcyBldmVyCiAgICByZS1jcmVhdGVkLgoKIDkuIEFkZGVkIHNvbWUgZXh0cmEgI2lmZGVmIFNVUFBPUlRfVVRGOCBjb25kaXRpb25hbHMgaW50byBwY3JldGVzdC5jLAogICAgcGNyZV9wcmludGludC5zcmMsIHBjcmVfY29tcGlsZS5jLCBwY3JlX3N0dWR5LmMsIGFuZCBwY3JlX3RhYmxlcy5jLCBpbgogICAgb3JkZXIgdG8gYmUgYWJsZSB0byBjdXQgb3V0IHRoZSBVVEYtOCB0YWJsZXMgaW4gdGhlIGxhdHRlciB3aGVuIFVURi04CiAgICBzdXBwb3J0IGlzIG5vdCByZXF1aXJlZC4gVGhpcyBzYXZlcyAxLjUtMksgb2YgY29kZSwgd2hpY2ggaXMgaW1wb3J0YW50IGluCiAgICBzb21lIGFwcGxpY2F0aW9ucy4KCiAgICBMYXRlcjogbW9yZSAjaWZkZWZzIGFyZSBuZWVkZWQgaW4gcGNyZV9vcmQydXRmOC5jIGFuZCBwY3JlX3ZhbGlkX3V0ZjguYwogICAgc28gYXMgbm90IHRvIHJlZmVyIHRvIHRoZSB0YWJsZXMsIGV2ZW4gdGhvdWdoIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIG5ldmVyIGJlCiAgICBjYWxsZWQgd2hlbiBVVEYtOCBzdXBwb3J0IGlzIGRpc2FibGVkLiBPdGhlcndpc2UgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggYQogICAgc2hhcmVkIGxpYnJhcnkuCgoxMC4gRml4ZWQgdHdvIGJ1Z3MgaW4gdGhlIGVtdWxhdGVkIG1lbW1vdmUoKSBmdW5jdGlvbiBpbiBwY3JlX2ludGVybmFsLmg6CgogICAgKGEpIEl0IHdhcyBkZWZpbmluZyBpdHMgYXJndW1lbnRzIGFzIGNoYXIgKiBpbnN0ZWFkIG9mIHZvaWQgKi4KCiAgICAoYikgSXQgd2FzIGFzc3VtaW5nIHRoYXQgYWxsIG1vdmVzIHdlcmUgdXB3YXJkcyBpbiBtZW1vcnk7IHRoaXMgd2FzIHRydWUKICAgICAgICBhIGxvbmcgdGltZSBhZ28gd2hlbiBJIHdyb3RlIGl0LCBidXQgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLgoKICAgIFRoZSBlbXVsYXRlZCBtZW1vdmUoKSBpcyBwcm92aWRlZCBmb3IgdGhvc2UgZW52aXJvbm1lbnRzIHRoYXQgaGF2ZSBuZWl0aGVyCiAgICBtZW1tb3ZlKCkgbm9yIGJjb3B5KCkuIEkgZGlkbid0IHRoaW5rIGFueW9uZSB1c2VkIGl0IHRoZXNlIGRheXMsIGJ1dCB0aGF0CiAgICBpcyBjbGVhcmx5IG5vdCB0aGUgY2FzZSwgYXMgdGhlc2UgdHdvIGJ1Z3Mgd2VyZSByZWNlbnRseSByZXBvcnRlZC4KCjExLiBUaGUgc2NyaXB0IFByZXBhcmVSZWxlYXNlIGlzIG5vdyBkaXN0cmlidXRlZDogaXQgY2FsbHMgMTMyaHRtbCwgQ2xlYW5UeHQsCiAgICBhbmQgRGV0cmFpbCB0byBjcmVhdGUgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbiwgdGhlIC50eHQgZm9ybSBvZiB0aGUgbWFuCiAgICBwYWdlcywgYW5kIGl0IHJlbW92ZXMgdHJhaWxpbmcgc3BhY2VzIGZyb20gbGlzdGVkIGZpbGVzLiBJdCBhbHNvIGNyZWF0ZXMKICAgIHBjcmUuaC5nZW5lcmljIGFuZCBjb25maWcuaC5nZW5lcmljIGZyb20gcGNyZS5oIGFuZCBjb25maWcuaC4gSW4gdGhlIGxhdHRlcgogICAgY2FzZSwgaXQgd3JhcHMgYWxsIHRoZSAjZGVmaW5lcyB3aXRoICNpZm5kZWZzLiBUaGlzIHNjcmlwdCBzaG91bGQgYmUgcnVuCiAgICBiZWZvcmUgIm1ha2UgZGlzdCIuCgoxMi4gRml4ZWQgdHdvIGZhaXJseSBvYnNjdXJlIGJ1Z3MgY29uY2VybmVkIHdpdGggcXVhbnRpZmllZCBjYXNlbGVzcyBtYXRjaGluZwogICAgd2l0aCBVbmljb2RlIHByb3BlcnR5IHN1cHBvcnQuCgogICAgKGEpIEZvciBhIG1heGltaXppbmcgcXVhbnRpZmllciwgaWYgdGhlIHR3byBkaWZmZXJlbnQgY2FzZXMgb2YgdGhlCiAgICAgICAgY2hhcmFjdGVyIHdlcmUgb2YgZGlmZmVyZW50IGxlbmd0aHMgaW4gdGhlaXIgVVRGLTggY29kaW5ncyAodGhlcmUgYXJlCiAgICAgICAgc29tZSBjYXNlcyBsaWtlIHRoaXMgLSBJIGZvdW5kIDExKSwgYW5kIHRoZSBtYXRjaGluZyBmdW5jdGlvbiBoYWQgdG8KICAgICAgICBiYWNrIHVwIG92ZXIgYSBtaXh0dXJlIG9mIHRoZSB0d28gY2FzZXMsIGl0IGluY29ycmVjdGx5IGFzc3VtZWQgdGhleQogICAgICAgIHdlcmUgYm90aCB0aGUgc2FtZSBsZW5ndGguCgogICAgKGIpIFdoZW4gUENSRSB3YXMgY29uZmlndXJlZCB0byB1c2UgdGhlIGhlYXAgcmF0aGVyIHRoYW4gdGhlIHN0YWNrIGZvcgogICAgICAgIHJlY3Vyc2lvbiBkdXJpbmcgbWF0Y2hpbmcsIGl0IHdhcyBub3QgY29ycmVjdGx5IHByZXNlcnZpbmcgdGhlIGRhdGEgZm9yCiAgICAgICAgdGhlIG90aGVyIGNhc2Ugb2YgYSBVVEYtOCBjaGFyYWN0ZXIgd2hlbiBjaGVja2luZyBhaGVhZCBmb3IgYSBtYXRjaAogICAgICAgIHdoaWxlIHByb2Nlc3NpbmcgYSBtaW5pbWl6aW5nIHJlcGVhdC4gSWYgdGhlIGNoZWNrIGFsc28gaW52b2x2ZWQKICAgICAgICBtYXRjaGluZyBhIHdpZGUgY2hhcmFjdGVyLCBidXQgZmFpbGVkLCBjb3JydXB0aW9uIGNvdWxkIGNhdXNlIGFuCiAgICAgICAgZXJyb25lb3VzIHJlc3VsdCB3aGVuIHRyeWluZyB0byBjaGVjayBmb3IgYSByZXBlYXQgb2YgdGhlIG9yaWdpbmFsCiAgICAgICAgY2hhcmFjdGVyLgoKMTMuIFNvbWUgdGlkeWluZyBjaGFuZ2VzIHRvIHRoZSB0ZXN0aW5nIG1lY2hhbmlzbToKCiAgICAoYSkgVGhlIFJ1blRlc3Qgc2NyaXB0IG5vdyBkZXRlY3RzIHRoZSBpbnRlcm5hbCBsaW5rIHNpemUgYW5kIHdoZXRoZXIgdGhlcmUKICAgICAgICBpcyBVVEYtOCBhbmQgVUNQIHN1cHBvcnQgYnkgcnVubmluZyAuL3BjcmV0ZXN0IC1DIGluc3RlYWQgb2YgcmVseWluZyBvbgogICAgICAgIHZhbHVlcyBzdWJzdGl0dXRlZCBieSAiY29uZmlndXJlIi4gKFRoZSBSdW5HcmVwVGVzdCBzY3JpcHQgYWxyZWFkeSBkaWQKICAgICAgICB0aGlzIGZvciBVVEYtOC4pIFRoZSBjb25maWd1cmUuYWMgc2NyaXB0IG5vIGxvbmdlciBzdWJzdGl0dXRlcyB0aGUKICAgICAgICByZWxldmFudCB2YXJpYWJsZXMuCgogICAgKGIpIFRoZSBkZWJ1Z2dpbmcgb3B0aW9ucyAvQiBhbmQgL0QgaW4gcGNyZXRlc3Qgc2hvdyB0aGUgY29tcGlsZWQgYnl0ZWNvZGUKICAgICAgICB3aXRoIGxlbmd0aCBhbmQgb2Zmc2V0IHZhbHVlcy4gVGhpcyBtZWFucyB0aGF0IHRoZSBvdXRwdXQgaXMgZGlmZmVyZW50CiAgICAgICAgZm9yIGRpZmZlcmVudCBpbnRlcm5hbCBsaW5rIHNpemVzLiBUZXN0IDIgaXMgc2tpcHBlZCBmb3IgbGluayBzaXplcwogICAgICAgIG90aGVyIHRoYW4gMiBiZWNhdXNlIG9mIHRoaXMsIGJ5cGFzc2luZyB0aGUgcHJvYmxlbS4gVW5mb3J0dW5hdGVseSwKICAgICAgICB0aGVyZSB3YXMgYWxzbyBhIHRlc3QgaW4gdGVzdCAzICh0aGUgbG9jYWxlIHRlc3RzKSB0aGF0IHVzZWQgL0IgYW5kCiAgICAgICAgZmFpbGVkIGZvciBsaW5rIHNpemVzIG90aGVyIHRoYW4gMi4gUmF0aGVyIHRoYW4gY3V0IHRoZSB3aG9sZSB0ZXN0IG91dCwKICAgICAgICBJIGhhdmUgYWRkZWQgYSBuZXcgL1ogb3B0aW9uIHRvIHBjcmV0ZXN0IHRoYXQgcmVwbGFjZXMgdGhlIGxlbmd0aCBhbmQKICAgICAgICBvZmZzZXQgdmFsdWVzIHdpdGggc3BhY2VzLiBUaGlzIGlzIG5vdyB1c2VkIHRvIG1ha2UgdGVzdCAzIGluZGVwZW5kZW50CiAgICAgICAgb2YgbGluayBzaXplLiAoVGVzdCAyIHdpbGwgYmUgdGlkaWVkIHVwIGxhdGVyLikKCjE0LiBJZiBlcnJvcm9mZnNldCB3YXMgcGFzc2VkIGFzIE5VTEwgdG8gcGNyZV9jb21waWxlLCBpdCBwcm92b2tlZCBhCiAgICBzZWdtZW50YXRpb24gZmF1bHQgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCgoxNS4gSW4gbXVsdGlsaW5lIG1vZGUgd2hlbiB0aGUgbmV3bGluZSBzZXF1ZW5jZSB3YXMgc2V0IHRvICJhbnkiLCB0aGUgcGF0dGVybgogICAgXiQgd291bGQgZ2l2ZSBhIG1hdGNoIGJldHdlZW4gdGhlIFxyIGFuZCBcbiBvZiBhIHN1YmplY3Qgc3VjaCBhcyAiQVxyXG5CIi4KICAgIFRoaXMgZG9lc24ndCBzZWVtIHJpZ2h0OyBpdCBub3cgdHJlYXRzIHRoZSBDUkxGIGNvbWJpbmF0aW9uIGFzIHRoZSBsaW5lCiAgICBlbmRpbmcsIGFuZCBzbyBkb2VzIG5vdCBtYXRjaCBpbiB0aGF0IGNhc2UuIEl0J3Mgb25seSBhIHBhdHRlcm4gc3VjaCBhcyBeJAogICAgdGhhdCB3b3VsZCBoaXQgdGhpcyBvbmU6IHNvbWV0aGluZyBsaWtlIF5BQkMkIHdvdWxkIGhhdmUgZmFpbGVkIGFmdGVyIFxyCiAgICBhbmQgdGhlbiB0cmllZCBhZ2FpbiBhZnRlciBcclxuLgoKMTYuIENoYW5nZWQgdGhlIGNvbXBhcmlzb24gY29tbWFuZCBmb3IgUnVuR3JlcFRlc3QgZnJvbSAiZGlmZiAtdSIgdG8gImRpZmYgLXViIgogICAgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIGZpbGVzIHRoYXQgZGlmZmVyIG9ubHkgaW4gdGhlaXIgbGluZSB0ZXJtaW5hdG9ycwogICAgY29tcGFyZSBlcXVhbC4gVGhpcyB3b3JrcyBvbiBMaW51eC4KCjE3LiBVbmRlciBjZXJ0YWluIGVycm9yIGNpcmN1bXN0YW5jZXMgcGNyZWdyZXAgbWlnaHQgdHJ5IHRvIGZyZWUgcmFuZG9tIG1lbW9yeQogICAgYXMgaXQgZXhpdGVkLiBUaGlzIGlzIG5vdyBmaXhlZCwgdGhhbmtzIHRvIHZhbGdyaW5kLgoKMTkuIEluIHBjcmV0ZXN0LCBpZiB0aGUgcGF0dGVybiAvKD9tKV4kL2c8YW55PiB3YXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzdHJpbmcKICAgICJhYmNcclxuXHJcbiIsIGl0IGZvdW5kIGFuIHVud2FudGVkIHNlY29uZCBtYXRjaCBhZnRlciB0aGUgc2Vjb25kIFxyLiBUaGlzCiAgICB3YXMgYmVjYXVzZSBpdHMgcnVsZXMgZm9yIGhvdyB0byBhZHZhbmNlIGZvciAvZyBhZnRlciBtYXRjaGluZyBhbiBlbXB0eQogICAgc3RyaW5nIGF0IHRoZSBlbmQgb2YgYSBsaW5lIGRpZCBub3QgYWxsb3cgZm9yIHRoaXMgY2FzZS4gVGhleSBub3cgY2hlY2sgZm9yCiAgICBpdCBzcGVjaWFsbHkuCgoyMC4gcGNyZXRlc3QgaXMgc3VwcG9zZWQgdG8gaGFuZGxlIHBhdHRlcm5zIGFuZCBkYXRhIG9mIGFueSBsZW5ndGgsIGJ5CiAgICBleHRlbmRpbmcgaXRzIGJ1ZmZlcnMgd2hlbiBuZWNlc3NhcnkuIEl0IHdhcyBnZXR0aW5nIHRoaXMgd3Jvbmcgd2hlbiB0aGUKICAgIGJ1ZmZlciBmb3IgYSBkYXRhIGxpbmUgaGFkIHRvIGJlIGV4dGVuZGVkLgoKMjEuIEFkZGVkIFBDUkVfTkVXTElORV9BTllDUkxGIHdoaWNoIGlzIGxpa2UgQU5ZLCBidXQgbWF0Y2hlcyBvbmx5IENSLCBMRiwgb3IKICAgIENSTEYgYXMgYSBuZXdsaW5lIHNlcXVlbmNlLgoKMjIuIENvZGUgZm9yIGhhbmRsaW5nIFVuaWNvZGUgcHJvcGVydGllcyBpbiBwY3JlX2RmYV9leGVjKCkgd2Fzbid0IGJlaW5nIGN1dAogICAgb3V0IGJ5ICNpZmRlZiBTVVBQT1JUX1VDUC4gVGhpcyBkaWQgbm8gaGFybSwgYXMgaXQgY291bGQgbmV2ZXIgYmUgdXNlZCwgYnV0CiAgICBJIGhhdmUgbmV2ZXJ0aGVsZXNzIHRpZGllZCBpdCB1cC4KCjIzLiBBZGRlZCBzb21lIGNhc3RzIHRvIGtpbGwgd2FybmluZ3MgZnJvbSBIUC1VWCBpYTY0IGNvbXBpbGVyLgoKMjQuIEFkZGVkIGEgbWFuIHBhZ2UgZm9yIHBjcmUtY29uZmlnLgoKClZlcnNpb24gNy4wIDE5LURlYy0wNgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAxLiBGaXhlZCBhIHNpZ25lZC91bnNpZ25lZCBjb21waWxlciB3YXJuaW5nIGluIHBjcmVfY29tcGlsZS5jLCBzaG93biB1cCBieQogICAgbW92aW5nIHRvIGdjYyA0LjEuMS4KCiAyLiBUaGUgLVMgb3B0aW9uIGZvciBwY3JldGVzdCB1c2VzIHNldHJsaW1pdCgpOyBJIGhhZCBvbWl0dGVkIHRvICNpbmNsdWRlCiAgICBzeXMvdGltZS5oLCB3aGljaCBpcyBkb2N1bWVudGVkIGFzIG5lZWRlZCBmb3IgdGhpcyBmdW5jdGlvbi4gSXQgZG9lc24ndAogICAgc2VlbSB0byBtYXR0ZXIgb24gTGludXgsIGJ1dCBpdCBzaG93ZWQgdXAgb24gc29tZSByZWxlYXNlcyBvZiBPUyBYLgoKIDMuIEl0IHNlZW1zIHRoYXQgdGhlcmUgYXJlIHN5c3RlbXMgd2hlcmUgYnl0ZXMgd2hvc2UgdmFsdWVzIGFyZSBncmVhdGVyIHRoYW4KICAgIDEyNyBtYXRjaCBpc3ByaW50KCkgaW4gdGhlICJDIiBsb2NhbGUuIFRoZSAiQyIgbG9jYWxlIHNob3VsZCBiZSB0aGUKICAgIGRlZmF1bHQgd2hlbiBhIEMgcHJvZ3JhbSBzdGFydHMgdXAuIEluIG1vc3Qgc3lzdGVtcywgb25seSBBU0NJSSBwcmludGluZwogICAgY2hhcmFjdGVycyBtYXRjaCBpc3ByaW50KCkuIFRoaXMgZGlmZmVyZW5jZSBjYXVzZWQgdGhlIG91dHB1dCBmcm9tIHBjcmV0ZXN0CiAgICB0byB2YXJ5LCBtYWtpbmcgc29tZSBvZiB0aGUgdGVzdHMgZmFpbC4gSSBoYXZlIGNoYW5nZWQgcGNyZXRlc3Qgc28gdGhhdDoKCiAgICAoYSkgV2hlbiBpdCBpcyBvdXRwdXR0aW5nIHRleHQgaW4gdGhlIGNvbXBpbGVkIHZlcnNpb24gb2YgYSBwYXR0ZXJuLCBieXRlcwogICAgICAgIG90aGVyIHRoYW4gMzItMTI2IGFyZSBhbHdheXMgc2hvd24gYXMgaGV4IGVzY2FwZXMuCgogICAgKGIpIFdoZW4gaXQgaXMgb3V0cHV0dGluZyB0ZXh0IHRoYXQgaXMgYSBtYXRjaGVkIHBhcnQgb2YgYSBzdWJqZWN0IHN0cmluZywKICAgICAgICBpdCBkb2VzIHRoZSBzYW1lLCB1bmxlc3MgYSBkaWZmZXJlbnQgbG9jYWxlIGhhcyBiZWVuIHNldCBmb3IgdGhlIG1hdGNoCiAgICAgICAgKHVzaW5nIHRoZSAvTCBtb2RpZmllcikuIEluIHRoaXMgY2FzZSwgaXQgdXNlcyBpc3ByaW50KCkgdG8gZGVjaWRlLgoKIDQuIEZpeGVkIGEgbWFqb3IgYnVnIHRoYXQgY2F1c2VkIGluY29ycmVjdCBjb21wdXRhdGlvbiBvZiB0aGUgYW1vdW50IG9mIG1lbW9yeQogICAgcmVxdWlyZWQgZm9yIGEgY29tcGlsZWQgcGF0dGVybiB3aGVuIG9wdGlvbnMgdGhhdCBjaGFuZ2VkIHdpdGhpbiB0aGUKICAgIHBhdHRlcm4gYWZmZWN0ZWQgdGhlIGxvZ2ljIG9mIHRoZSBwcmVsaW1pbmFyeSBzY2FuIHRoYXQgZGV0ZXJtaW5lcyB0aGUKICAgIGxlbmd0aC4gVGhlIHJlbGV2YW50IG9wdGlvbnMgYXJlIC14LCBhbmQgLWkgaW4gVVRGLTggbW9kZS4gVGhlIHJlc3VsdCB3YXMKICAgIHRoYXQgdGhlIGNvbXB1dGVkIGxlbmd0aCB3YXMgdG9vIHNtYWxsLiBUaGUgc3ltcHRvbXMgb2YgdGhpcyBidWcgd2VyZQogICAgZWl0aGVyIHRoZSBQQ1JFIGVycm9yICJpbnRlcm5hbCBlcnJvcjogY29kZSBvdmVyZmxvdyIgZnJvbSBwY3JlX2NvbXBpbGUoKSwKICAgIG9yIGEgZ2xpYmMgY3Jhc2ggd2l0aCBhIG1lc3NhZ2Ugc3VjaCBhcyAicGNyZXRlc3Q6IGZyZWUoKTogaW52YWxpZCBuZXh0CiAgICBzaXplIChmYXN0KSIuIEV4YW1wbGVzIG9mIHBhdHRlcm5zIHRoYXQgcHJvdm9rZWQgdGhpcyBidWcgKHNob3duIGluCiAgICBwY3JldGVzdCBmb3JtYXQpIGFyZToKCiAgICAgIC8oPy14OiApL3gKICAgICAgLyg/eCkoPy14OiBccyojXHMqKS8KICAgICAgLygoP2kpW1x4e2MwfV0pLzgKICAgICAgLyg/aTpbXHh7YzB9XSkvOAoKICAgIEhPV0VWRVI6IENoYW5nZSAxNyBiZWxvdyBtYWtlcyB0aGlzIGZpeCBvYnNvbGV0ZSBhcyB0aGUgbWVtb3J5IGNvbXB1dGF0aW9uCiAgICBpcyBub3cgZG9uZSBkaWZmZXJlbnRseS4KCiA1LiBBcHBsaWVkIHBhdGNoZXMgZnJvbSBHb29nbGUgdG86IChhKSBhZGQgYSBRdW90ZU1ldGEgZnVuY3Rpb24gdG8gdGhlIEMrKwogICAgd3JhcHBlciBjbGFzc2VzOyAoYikgaW1wbGVtZW50IGEgbmV3IGZ1bmN0aW9uIGluIHRoZSBDKysgc2Nhbm5lciB0aGF0IGlzCiAgICBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvbGQgd2F5IG9mIGRvaW5nIHRoaW5ncyBiZWNhdXNlIGl0IGF2b2lkcyBsZXZlbHMgb2YKICAgIHJlY3Vyc2lvbiBpbiB0aGUgcmVnZXggbWF0Y2hpbmc7IChjKSBhZGQgYSBwYXJhZ3JhcGggdG8gdGhlIGRvY3VtZW50YXRpb24KICAgIGZvciB0aGUgRnVsbE1hdGNoKCkgZnVuY3Rpb24uCgogNi4gVGhlIGVzY2FwZSBzZXF1ZW5jZSBcbiB3YXMgYmVpbmcgdHJlYXRlZCBhcyB3aGF0ZXZlciB3YXMgZGVmaW5lZCBhcwogICAgIm5ld2xpbmUiLiBOb3Qgb25seSB3YXMgdGhpcyBjb250cmFyeSB0byB0aGUgZG9jdW1lbnRhdGlvbiwgd2hpY2ggc3RhdGVzCiAgICB0aGF0IFxuIGlzIGNoYXJhY3RlciAxMCAoaGV4IDBBKSwgYnV0IGl0IGFsc28gd2VudCBob3JyaWJseSB3cm9uZyB3aGVuCiAgICAibmV3bGluZSIgd2FzIGRlZmluZWQgYXMgQ1JMRi4gVGhpcyBoYXMgYmVlbiBmaXhlZC4KCiA3LiBJbiBwY3JlX2RmYV9leGVjLmMgdGhlIHZhbHVlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgKHRoZSB2YXJpYWJsZSBjYWxsZWQgYykKICAgIHdhcyBiZWluZyBzZXQgdG8gLTEgZm9yIHRoZSAiZW5kIG9mIGxpbmUiIGNhc2UgKHN1cHBvc2VkbHkgYSB2YWx1ZSB0aGF0IG5vCiAgICBjaGFyYWN0ZXIgY2FuIGhhdmUpLiBUaG91Z2ggdGhpcyB2YWx1ZSBpcyBuZXZlciB1c2VkICh0aGUgY2hlY2sgZm9yIGVuZCBvZgogICAgbGluZSBpcyAiemVybyBieXRlcyBpbiBjdXJyZW50IGNoYXJhY3RlciIpLCBpdCBjYXVzZWQgY29tcGlsZXIgY29tcGxhaW50cy4KICAgIEkndmUgY2hhbmdlZCBpdCB0byAweGZmZmZmZmZmLgoKIDguIEluIHBjcmVfdmVyc2lvbi5jLCB0aGUgdmVyc2lvbiBzdHJpbmcgd2FzIGJlaW5nIGJ1aWx0IGJ5IGEgc2VxdWVuY2Ugb2YKICAgIEMgbWFjcm9zIHRoYXQsIGluIHRoZSBldmVudCBvZiBQQ1JFX1BSRVJFTEVBU0UgYmVpbmcgZGVmaW5lZCBhcyBhbiBlbXB0eQogICAgc3RyaW5nIChhcyBpdCBpcyBmb3IgcHJvZHVjdGlvbiByZWxlYXNlcykgY2FsbGVkIGEgbWFjcm8gd2l0aCBhbiBlbXB0eQogICAgYXJndW1lbnQuIFRoZSBDIHN0YW5kYXJkIHNheXMgdGhlIHJlc3VsdCBvZiB0aGlzIGlzIHVuZGVmaW5lZC4gVGhlIGdjYwogICAgY29tcGlsZXIgdHJlYXRzIGl0IGFzIGFuIGVtcHR5IHN0cmluZyAod2hpY2ggd2FzIHdoYXQgd2FzIHdhbnRlZCkgYnV0IGl0IGlzCiAgICByZXBvcnRlZCB0aGF0IFZpc3VhbCBDIGdpdmVzIGFuIGVycm9yLiBUaGUgc291cmNlIGhhcyBiZWVuIGhhY2tlZCBhcm91bmQgdG8KICAgIGF2b2lkIHRoaXMgcHJvYmxlbS4KCiA5LiBPbiB0aGUgYWR2aWNlIG9mIGEgV2luZG93cyB1c2VyLCBpbmNsdWRlZCA8aW8uaD4gYW5kIDxmY250bC5oPiBpbiBXaW5kb3dzCiAgICBidWlsZHMgb2YgcGNyZXRlc3QsIGFuZCBjaGFuZ2VkIHRoZSBjYWxsIHRvIF9zZXRtb2RlKCkgdG8gdXNlIF9PX0JJTkFSWQogICAgaW5zdGVhZCBvZiAweDgwMDAuIE1hZGUgYWxsIHRoZSAjaWZkZWZzIHRlc3QgYm90aCBfV0lOMzIgYW5kIFdJTjMyIChub3QgYWxsCiAgICBvZiB0aGVtIGRpZCkuCgoxMC4gT3JpZ2luYWxseSwgcGNyZXRlc3Qgb3BlbmVkIGl0cyBpbnB1dCBhbmQgb3V0cHV0IHdpdGhvdXQgImIiOyB0aGVuIEkgd2FzCiAgICB0b2xkIHRoYXQgImIiIHdhcyBuZWVkZWQgaW4gc29tZSBlbnZpcm9ubWVudHMsIHNvIGl0IHdhcyBhZGRlZCBmb3IgcmVsZWFzZQogICAgNS4wIHRvIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQuIChJdCBtYWtlcyBubyBkaWZmZXJlbmNlIG9uIFVuaXgtbGlrZQogICAgc3lzdGVtcy4pIExhdGVyIEkgd2FzIHRvbGQgdGhhdCBpdCBpcyB3cm9uZyBmb3IgdGhlIGlucHV0IG9uIFdpbmRvd3MuIEkndmUKICAgIG5vdyBhYnN0cmFjdGVkIHRoZSBtb2RlcyBpbnRvIHR3byBtYWNyb3MsIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGZpZGRsZSB3aXRoCiAgICB0aGVtLCBhbmQgcmVtb3ZlZCAiYiIgZnJvbSB0aGUgaW5wdXQgbW9kZSB1bmRlciBXaW5kb3dzLgoKMTEuIEFkZGVkIHBrZ2NvbmZpZyBzdXBwb3J0IGZvciB0aGUgQysrIHdyYXBwZXIgbGlicmFyeSwgbGlicGNyZWNwcC4KCjEyLiBBZGRlZCAtaGVscCBhbmQgLS1oZWxwIHRvIHBjcmV0ZXN0IGFzIGFuIG9mZmljaWFsIHdheSBvZiBiZWluZyByZW1pbmRlZAogICAgb2YgdGhlIG9wdGlvbnMuCgoxMy4gUmVtb3ZlZCBzb21lIHJlZHVuZGFudCBzZW1pY29sb25zIGFmdGVyIG1hY3JvIGNhbGxzIGluIHBjcmVjcHBhcmcuaC5pbgogICAgYW5kIHBjcmVjcHAuY2MgYmVjYXVzZSB0aGV5IGFubm95IGNvbXBpbGVycyBhdCBoaWdoIHdhcm5pbmcgbGV2ZWxzLgoKMTQuIEEgYml0IG9mIHRpZHlpbmcvcmVmYWN0b3JpbmcgaW4gcGNyZV9leGVjLmMgaW4gdGhlIG1haW4gYnVtcGFsb25nIGxvb3AuCgoxNS4gRml4ZWQgYW4gb2NjdXJyZW5jZSBvZiA9PSBpbiBjb25maWd1cmUuYWMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuID0gKHNoZWxsCiAgICBzY3JpcHRzIGFyZSBub3QgQyBwcm9ncmFtcyA6LSkgYW5kIHdoaWNoIHdhcyBub3Qgbm90aWNlZCBiZWNhdXNlIGl0IHdvcmtzCiAgICBvbiBMaW51eC4KCjE2LiBwY3JldGVzdCBpcyBzdXBwb3NlZCB0byBoYW5kbGUgYW55IGxlbmd0aCBvZiBwYXR0ZXJuIGFuZCBkYXRhIGxpbmUgKGFzIG9uZQogICAgbGluZSBvciBhcyBhIGNvbnRpbnVlZCBzZXF1ZW5jZSBvZiBsaW5lcykgYnkgZXh0ZW5kaW5nIGl0cyBpbnB1dCBidWZmZXIgaWYKICAgIG5lY2Vzc2FyeS4gVGhpcyBmZWF0dXJlIHdhcyBicm9rZW4gZm9yIHZlcnkgbG9uZyBwYXR0ZXJuIGxpbmVzLCBsZWFkaW5nIHRvCiAgICBhIHN0cmluZyBvZiBqdW5rIGJlaW5nIHBhc3NlZCB0byBwY3JlX2NvbXBpbGUoKSBpZiB0aGUgcGF0dGVybiB3YXMgbG9uZ2VyCiAgICB0aGFuIGFib3V0IDUwSy4KCjE3LiBJIGhhdmUgZG9uZSBhIG1ham9yIHJlLWZhY3RvcmluZyBvZiB0aGUgd2F5IHBjcmVfY29tcGlsZSgpIGNvbXB1dGVzIHRoZQogICAgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgZm9yIGEgY29tcGlsZWQgcGF0dGVybi4gUHJldmlvdXNseSwgdGhlcmUgd2FzIGNvZGUKICAgIHRoYXQgbWFkZSBhIHByZWxpbWluYXJ5IHNjYW4gb2YgdGhlIHBhdHRlcm4gaW4gb3JkZXIgdG8gZG8gdGhpcy4gVGhhdCB3YXMKICAgIE9LIHdoZW4gUENSRSB3YXMgbmV3LCBidXQgYXMgdGhlIGZhY2lsaXRpZXMgaGF2ZSBleHBhbmRlZCwgaXQgaGFzIGJlY29tZQogICAgaGFyZGVyIGFuZCBoYXJkZXIgdG8ga2VlcCBpdCBpbiBzdGVwIHdpdGggdGhlIHJlYWwgY29tcGlsZSBwaGFzZSwgYW5kIHRoZXJlCiAgICBoYXZlIGJlZW4gYSBudW1iZXIgb2YgYnVncyAoc2VlIGZvciBleGFtcGxlLCA0IGFib3ZlKS4gSSBoYXZlIG5vdyBmb3VuZCBhCiAgICBjdW5uaW5nIHdheSBvZiBydW5uaW5nIHRoZSByZWFsIGNvbXBpbGUgZnVuY3Rpb24gaW4gYSAiZmFrZSIgbW9kZSB0aGF0CiAgICBlbmFibGVzIGl0IHRvIGNvbXB1dGUgaG93IG11Y2ggbWVtb3J5IGl0IHdvdWxkIG5lZWQsIHdoaWxlIGFjdHVhbGx5IG9ubHkKICAgIGV2ZXIgdXNpbmcgYSBmZXcgaHVuZHJlZCBieXRlcyBvZiB3b3JraW5nIG1lbW9yeSBhbmQgd2l0aG91dCB0b28gbWFueQogICAgdGVzdHMgb2YgdGhlIG1vZGUuIFRoaXMgc2hvdWxkIG1ha2UgZnV0dXJlIG1haW50ZW5hbmNlIGFuZCBkZXZlbG9wbWVudAogICAgZWFzaWVyLiBBIHNpZGUgZWZmZWN0IG9mIHRoaXMgd29yayBpcyB0aGF0IHRoZSBsaW1pdCBvZiAyMDAgb24gdGhlIG5lc3RpbmcKICAgIGRlcHRoIG9mIHBhcmVudGhlc2VzIGhhcyBiZWVuIHJlbW92ZWQgKHRob3VnaCB0aGlzIHdhcyBuZXZlciBhIHNlcmlvdXMKICAgIGxpbWl0YXRpb24sIEkgc3VzcGVjdCkuIEhvd2V2ZXIsIHRoZXJlIGlzIGEgZG93bnNpZGU6IHBjcmVfY29tcGlsZSgpIG5vdwogICAgcnVucyBtb3JlIHNsb3dseSB0aGFuIGJlZm9yZSAoMzAlIG9yIG1vcmUsIGRlcGVuZGluZyBvbiB0aGUgcGF0dGVybikuIEkKICAgIGhvcGUgdGhpcyBpc24ndCBhIGJpZyBpc3N1ZS4gVGhlcmUgaXMgbm8gZWZmZWN0IG9uIHJ1bnRpbWUgcGVyZm9ybWFuY2UuCgoxOC4gRml4ZWQgYSBtaW5vciBidWcgaW4gcGNyZXRlc3Q6IGlmIGEgcGF0dGVybiBsaW5lIHdhcyBub3QgdGVybWluYXRlZCBieSBhCiAgICBuZXdsaW5lIChvbmx5IHBvc3NpYmxlIGZvciB0aGUgbGFzdCBsaW5lIG9mIGEgZmlsZSkgYW5kIGl0IHdhcyBhCiAgICBwYXR0ZXJuIHRoYXQgc2V0IGEgbG9jYWxlIChmb2xsb3dlZCBieSAvTHNvbWV0aGluZyksIHBjcmV0ZXN0IGNyYXNoZWQuCgoxOS4gQWRkZWQgYWRkaXRpb25hbCB0aW1pbmcgZmVhdHVyZXMgdG8gcGNyZXRlc3QuICgxKSBUaGUgLXRtIG9wdGlvbiBub3cgdGltZXMKICAgIG1hdGNoaW5nIG9ubHksIG5vdCBjb21waWxpbmcuICgyKSBCb3RoIC10IGFuZCAtdG0gY2FuIGJlIGZvbGxvd2VkLCBhcyBhCiAgICBzZXBhcmF0ZSBjb21tYW5kIGxpbmUgaXRlbSwgYnkgYSBudW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgogICAgcmVwZWF0cyB0byB1c2Ugd2hlbiB0aW1pbmcuIFRoZSBkZWZhdWx0IGlzIDUwMDAwOyB0aGlzIGdpdmVzIGJldHRlcgogICAgcHJlY2lzaW9uLCBidXQgdGFrZXMgdW5jb21mb3J0YWJseSBsb25nIGZvciB2ZXJ5IGxhcmdlIHBhdHRlcm5zLgoKMjAuIEV4dGVuZGVkIHBjcmVfc3R1ZHkoKSB0byBiZSBtb3JlIGNsZXZlciBpbiBjYXNlcyB3aGVyZSBhIGJyYW5jaCBvZiBhCiAgICBzdWJwYXR0ZXJuIGhhcyBubyBkZWZpbml0ZSBmaXJzdCBjaGFyYWN0ZXIuIEZvciBleGFtcGxlLCAoYSp8YiopW2NkXSB3b3VsZAogICAgcHJldmlvdXNseSBnaXZlIG5vIHJlc3VsdCBmcm9tIHBjcmVfc3R1ZHkoKS4gTm93IGl0IHJlY29nbml6ZXMgdGhhdCB0aGUKICAgIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIGEsIGIsIGMsIG9yIGQuCgoyMS4gVGhlcmUgd2FzIGFuIGluY29ycmVjdCBlcnJvciAicmVjdXJzaXZlIGNhbGwgY291bGQgbG9vcCBpbmRlZmluaXRlbHkiIGlmCiAgICBhIHN1YnBhdHRlcm4gKG9yIHRoZSBlbnRpcmUgcGF0dGVybikgdGhhdCB3YXMgYmVpbmcgdGVzdGVkIGZvciBtYXRjaGluZyBhbgogICAgZW1wdHkgc3RyaW5nIGNvbnRhaW5lZCBvbmx5IG9uZSBub24tZW1wdHkgaXRlbSBhZnRlciBhIG5lc3RlZCBzdWJwYXR0ZXJuLgogICAgRm9yIGV4YW1wbGUsIHRoZSBwYXR0ZXJuICg/Plx4ezEwMH0qKVxkKD9SKSBwcm92b2tlZCB0aGlzIGVycm9yCiAgICBpbmNvcnJlY3RseSwgYmVjYXVzZSB0aGUgXGQgd2FzIGJlaW5nIHNraXBwZWQgaW4gdGhlIGNoZWNrLgoKMjIuIFRoZSBwY3JldGVzdCBwcm9ncmFtIG5vdyBoYXMgYSBuZXcgcGF0dGVybiBvcHRpb24gL0IgYW5kIGEgY29tbWFuZCBsaW5lCiAgICBvcHRpb24gLWIsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gYWRkaW5nIC9CIHRvIGV2ZXJ5IHBhdHRlcm4uIFRoaXMgY2F1c2VzCiAgICBpdCB0byBzaG93IHRoZSBjb21waWxlZCBieXRlY29kZSwgd2l0aG91dCB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0CiAgICAtZCBzaG93cy4gVGhlIGVmZmVjdCBvZiAtZCBpcyBub3cgdGhlIHNhbWUgYXMgLWIgd2l0aCAtaSAoYW5kIHNpbWlsYXJseSwgL0QKICAgIGlzIHRoZSBzYW1lIGFzIC9CL0kpLgoKMjMuIEEgbmV3IG9wdGltaXphdGlvbiBpcyBub3cgYWJsZSBhdXRvbWF0aWNhbGx5IHRvIHRyZWF0IHNvbWUgc2VxdWVuY2VzIHN1Y2gKICAgIGFzIGEqYiBhcyBhKitiLiBNb3JlIHNwZWNpZmljYWxseSwgaWYgc29tZXRoaW5nIHNpbXBsZSAoc3VjaCBhcyBhIGNoYXJhY3RlcgogICAgb3IgYSBzaW1wbGUgY2xhc3MgbGlrZSBcZCkgaGFzIGFuIHVubGltaXRlZCBxdWFudGlmaWVyLCBhbmQgaXMgZm9sbG93ZWQgYnkKICAgIHNvbWV0aGluZyB0aGF0IGNhbm5vdCBwb3NzaWJseSBtYXRjaCB0aGUgcXVhbnRpZmllZCB0aGluZywgdGhlIHF1YW50aWZpZXIKICAgIGlzIGF1dG9tYXRpY2FsbHkgInBvc3Nlc3NpZmllZCIuCgoyNC4gQSByZWN1cnNpdmUgcmVmZXJlbmNlIHRvIGEgc3VicGF0dGVybiB3aG9zZSBudW1iZXIgd2FzIGdyZWF0ZXIgdGhhbiAzOQogICAgd2VudCB3cm9uZyB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgaW4gVVRGLTggbW9kZS4gVGhpcyBidWcgY291bGQgYWxzbwogICAgaGF2ZSBhZmZlY3RlZCB0aGUgb3BlcmF0aW9uIG9mIHBjcmVfc3R1ZHkoKS4KCjI1LiBSZWFsaXplZCB0aGF0IGEgbGl0dGxlIGJpdCBvZiBwZXJmb3JtYW5jZSBjb3VsZCBiZSBoYWQgYnkgcmVwbGFjaW5nCiAgICAoYyAmIDB4YzApID09IDB4YzAgd2l0aCBjID49IDB4YzAgd2hlbiBwcm9jZXNzaW5nIFVURi04IGNoYXJhY3RlcnMuCgoyNi4gVGltaW5nIGRhdGEgZnJvbSBwY3JldGVzdCBpcyBub3cgc2hvd24gdG8gNCBkZWNpbWFsIHBsYWNlcyBpbnN0ZWFkIG9mIDMuCgoyNy4gUG9zc2Vzc2l2ZSBxdWFudGlmaWVycyBzdWNoIGFzIGErKyB3ZXJlIHByZXZpb3VzbHkgaW1wbGVtZW50ZWQgYnkgdHVybmluZwogICAgdGhlbSBpbnRvIGF0b21pYyBncm91cHMgc3VjaCBhcyAoJD5hKykuIE5vdyB0aGV5IGhhdmUgdGhlaXIgb3duIG9wY29kZXMsCiAgICB3aGljaCBpbXByb3ZlcyBwZXJmb3JtYW5jZS4gVGhpcyBpbmNsdWRlcyB0aGUgYXV0b21hdGljYWxseSBjcmVhdGVkIG9uZXMKICAgIGZyb20gMjMgYWJvdmUuCgoyOC4gQSBwYXR0ZXJuIHN1Y2ggYXMgKD89KFx3KykpXDE6IHdoaWNoIHNpbXVsYXRlcyBhbiBhdG9taWMgZ3JvdXAgdXNpbmcgYQogICAgbG9va2FoZWFkIHdhcyBicm9rZW4gaWYgaXQgd2FzIG5vdCBhbmNob3JlZC4gUENSRSB3YXMgbWlzdGFrZW5seSBleHBlY3RpbmcKICAgIHRoZSBmaXJzdCBtYXRjaGVkIGNoYXJhY3RlciB0byBiZSBhIGNvbG9uLiBUaGlzIGFwcGxpZWQgYm90aCB0byBuYW1lZCBhbmQKICAgIG51bWJlcmVkIGdyb3Vwcy4KCjI5LiBUaGUgdWNwaW50ZXJuYWwuaCBoZWFkZXIgZmlsZSB3YXMgbWlzc2luZyBpdHMgaWRlbXBvdGVuY3kgI2lmZGVmLgoKMzAuIEkgd2FzIHNlbnQgYSAicHJvamVjdCIgZmlsZSBjYWxsZWQgbGlicGNyZS5hLmRldiB3aGljaCBJIHVuZGVyc3RhbmQgbWFrZXMKICAgIGJ1aWxkaW5nIFBDUkUgb24gV2luZG93cyBlYXNpZXIsIHNvIEkgaGF2ZSBpbmNsdWRlZCBpdCBpbiB0aGUgZGlzdHJpYnV0aW9uLgoKMzEuIFRoZXJlIGlzIG5vdyBhIGNoZWNrIGluIHBjcmV0ZXN0IGFnYWluc3QgYSByaWRpY3Vsb3VzbHkgbGFyZ2UgbnVtYmVyIGJlaW5nCiAgICByZXR1cm5lZCBieSBwY3JlX2V4ZWMoKSBvciBwY3JlX2RmYV9leGVjKCkuIElmIHRoaXMgaGFwcGVucyBpbiBhIC9nIG9yIC9HCiAgICBsb29wLCB0aGUgbG9vcCBpcyBhYmFuZG9uZWQuCgozMi4gRm9yd2FyZCByZWZlcmVuY2VzIHRvIHN1YnBhdHRlcm5zIGluIGNvbmRpdGlvbnMgc3VjaCBhcyAoPygyKS4uLikgd2hlcmUKICAgIHN1YnBhdHRlcm4gMiBpcyBkZWZpbmVkIGxhdGVyIGNhdXNlIHBjcmVfY29tcGlsZSgpIHRvIHNlYXJjaCBmb3J3YXJkcyBpbgogICAgdGhlIHBhdHRlcm4gZm9yIHRoZSByZWxldmFudCBzZXQgb2YgcGFyZW50aGVzZXMuIFRoaXMgc2VhcmNoIHdlbnQgd3JvbmcKICAgIHdoZW4gdGhlcmUgd2VyZSB1bmVzY2FwZWQgcGFyZW50aGVzZXMgaW4gYSBjaGFyYWN0ZXIgY2xhc3MsIHBhcmVudGhlc2VzCiAgICBlc2NhcGVkIHdpdGggXFEuLi5cRSwgb3IgcGFyZW50aGVzZXMgaW4gYSAjLWNvbW1lbnQgaW4gL3ggbW9kZS4KCjMzLiAiU3Vicm91dGluZSIgY2FsbHMgYW5kIGJhY2tyZWZlcmVuY2VzIHdlcmUgcHJldmlvdXNseSByZXN0cmljdGVkIHRvCiAgICByZWZlcmVuY2luZyBzdWJwYXR0ZXJucyBlYXJsaWVyIGluIHRoZSByZWdleC4gVGhpcyByZXN0cmljdGlvbiBoYXMgbm93CiAgICBiZWVuIHJlbW92ZWQuCgozNC4gQWRkZWQgYSBudW1iZXIgb2YgZXh0cmEgZmVhdHVyZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgaW4gUGVybCA1LjEwLiBPbiB0aGUKICAgIHdob2xlLCB0aGVzZSBhcmUganVzdCBzeW50YWN0aWMgYWx0ZXJuYXRpdmVzIGZvciBmZWF0dXJlcyB0aGF0IFBDUkUgaGFkCiAgICBwcmV2aW91c2x5IGltcGxlbWVudGVkIHVzaW5nIHRoZSBQeXRob24gc3ludGF4IG9yIG15IG93biBpbnZlbnRpb24uIFRoZQogICAgb3RoZXIgZm9ybWF0cyBhcmUgYWxsIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5LgoKICAgIChhKSBOYW1lZCBncm91cHMgY2FuIG5vdyBiZSBkZWZpbmVkIGFzICg/PG5hbWU+Li4uKSBvciAoPyduYW1lJy4uLikgYXMgd2VsbAogICAgICAgIGFzICg/UDxuYW1lPi4uLikuIFRoZSBuZXcgZm9ybXMsIGFzIHdlbGwgYXMgYmVpbmcgaW4gUGVybCA1LjEwLCBhcmUKICAgICAgICBhbHNvIC5ORVQgY29tcGF0aWJsZS4KCiAgICAoYikgQSByZWN1cnNpb24gb3Igc3Vicm91dGluZSBjYWxsIHRvIGEgbmFtZWQgZ3JvdXAgY2FuIG5vdyBiZSBkZWZpbmVkIGFzCiAgICAgICAgKD8mbmFtZSkgYXMgd2VsbCBhcyAoP1A+bmFtZSkuCgogICAgKGMpIEEgYmFja3JlZmVyZW5jZSB0byBhIG5hbWVkIGdyb3VwIGNhbiBub3cgYmUgZGVmaW5lZCBhcyBcazxuYW1lPiBvcgogICAgICAgIFxrJ25hbWUnIGFzIHdlbGwgYXMgKD9QPW5hbWUpLiBUaGUgbmV3IGZvcm1zLCBhcyB3ZWxsIGFzIGJlaW5nIGluIFBlcmwKICAgICAgICA1LjEwLCBhcmUgYWxzbyAuTkVUIGNvbXBhdGlibGUuCgogICAgKGQpIEEgY29uZGl0aW9uYWwgcmVmZXJlbmNlIHRvIGEgbmFtZWQgZ3JvdXAgY2FuIG5vdyB1c2UgdGhlIHN5bnRheAogICAgICAgICg/KDxuYW1lPikgb3IgKD8oJ25hbWUnKSBhcyB3ZWxsIGFzICg/KG5hbWUpLgoKICAgIChlKSBBICJjb25kaXRpb25hbCBncm91cCIgb2YgdGhlIGZvcm0gKD8oREVGSU5FKS4uLikgY2FuIGJlIHVzZWQgdG8gZGVmaW5lCiAgICAgICAgZ3JvdXBzIChuYW1lZCBhbmQgbnVtYmVyZWQpIHRoYXQgYXJlIG5ldmVyIGV2YWx1YXRlZCBpbmxpbmUsIGJ1dCBjYW4gYmUKICAgICAgICBjYWxsZWQgYXMgInN1YnJvdXRpbmVzIiBmcm9tIGVsc2V3aGVyZS4gSW4gZWZmZWN0LCB0aGUgREVGSU5FIGNvbmRpdGlvbgogICAgICAgIGlzIGFsd2F5cyBmYWxzZS4gVGhlcmUgbWF5IGJlIG9ubHkgb25lIGFsdGVybmF0aXZlIGluIHN1Y2ggYSBncm91cC4KCiAgICAoZikgQSB0ZXN0IGZvciByZWN1cnNpb24gY2FuIGJlIGdpdmVuIGFzICg/KFIxKS4uIG9yICg/KFImbmFtZSkuLi4gYXMgd2VsbAogICAgICAgIGFzIHRoZSBzaW1wbGUgKD8oUikuIFRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGlmIHRoZSBtb3N0IHJlY2VudAogICAgICAgIHJlY3Vyc2lvbiBpcyB0aGF0IG9mIHRoZSBnaXZlbiBudW1iZXIgb3IgbmFtZS4gSXQgZG9lcyBub3Qgc2VhcmNoIG91dAogICAgICAgIHRocm91Z2ggdGhlIGVudGlyZSByZWN1cnNpb24gc3RhY2suCgogICAgKGcpIFRoZSBlc2NhcGUgXGdOIG9yIFxne059IGhhcyBiZWVuIGFkZGVkLCB3aGVyZSBOIGlzIGEgcG9zaXRpdmUgb3IKICAgICAgICBuZWdhdGl2ZSBudW1iZXIsIHNwZWNpZnlpbmcgYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgcmVmZXJlbmNlLgoKMzUuIFRpZGllZCB0byBnZXQgcmlkIG9mIHNvbWUgZnVydGhlciBzaWduZWQvdW5zaWduZWQgY29tcGlsZXIgd2FybmluZ3MgYW5kCiAgICBzb21lICJ1bnJlYWNoYWJsZSBjb2RlIiB3YXJuaW5ncy4KCjM2LiBVcGRhdGVkIHRoZSBVbmljb2RlIHByb3BlcnR5IHRhYmxlcyB0byBVbmljb2RlIHZlcnNpb24gNS4wLjAuIEFtb25nc3Qgb3RoZXIKICAgIHRoaW5ncywgdGhpcyBhZGRzIGZpdmUgbmV3IHNjcmlwdHMuCgozNy4gUGVybCBpZ25vcmVzIG9ycGhhbmVkIFxFIGVzY2FwZXMgY29tcGxldGVseS4gUENSRSBub3cgZG9lcyB0aGUgc2FtZS4KICAgIFRoZXJlIHdlcmUgYWxzbyBpbmNvbXBhdGliaWxpdGllcyByZWdhcmRpbmcgdGhlIGhhbmRsaW5nIG9mIFxRLi5cRSBpbnNpZGUKICAgIGNoYXJhY3RlciBjbGFzc2VzLCBmb3IgZXhhbXBsZSB3aXRoIHBhdHRlcm5zIGxpa2UgW1xRYVxFLVxRelxFXSB3aGVyZSB0aGUKICAgIGh5cGhlbiB3YXMgYWRqYWNlbnQgdG8gXFEgb3IgXEUuIEkgaG9wZSBJJ3ZlIGNsZWFyZWQgYWxsIHRoaXMgdXAgbm93LgoKMzguIExpa2UgUGVybCwgUENSRSBkZXRlY3RzIHdoZW4gYW4gaW5kZWZpbml0ZWx5IHJlcGVhdGVkIHBhcmVudGhlc2l6ZWQgZ3JvdXAKICAgIG1hdGNoZXMgYW4gZW1wdHkgc3RyaW5nLCBhbmQgZm9yY2libHkgYnJlYWtzIHRoZSBsb29wLiBUaGVyZSB3ZXJlIGJ1Z3MgaW4KICAgIHRoaXMgY29kZSBpbiBub24tc2ltcGxlIGNhc2VzLiBGb3IgYSBwYXR0ZXJuIHN1Y2ggYXMgIF4oYSgpKikqICBtYXRjaGVkCiAgICBhZ2FpbnN0ICBhYWFhICB0aGUgcmVzdWx0IHdhcyBqdXN0ICJhIiByYXRoZXIgdGhhbiAiYWFhYSIsIGZvciBleGFtcGxlLiBUd28KICAgIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudCBidWdzICh0aGF0IGFmZmVjdGVkIGRpZmZlcmVudCBjYXNlcykgaGF2ZSBiZWVuCiAgICBmaXhlZC4KCjM5LiBSZWZhY3RvcmVkIHRoZSBjb2RlIHRvIGFib2xpc2ggdGhlIHVzZSBvZiBkaWZmZXJlbnQgb3Bjb2RlcyBmb3Igc21hbGwKICAgIGNhcHR1cmluZyBicmFja2V0IG51bWJlcnMuIFRoaXMgaXMgYSB0aWR5IHRoYXQgSSBhdm9pZGVkIGRvaW5nIHdoZW4gSQogICAgcmVtb3ZlZCB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBjYXB0dXJpbmcgYnJhY2tldHMgZm9yIDMuNSBiYWNrIGluIDIwMDEuCiAgICBUaGUgbmV3IGFwcHJvYWNoIGlzIG5vdCBvbmx5IHRpZGllciwgaXQgbWFrZXMgaXQgcG9zc2libGUgdG8gcmVkdWNlIHRoZQogICAgbWVtb3J5IG5lZWRlZCB0byBmaXggdGhlIHByZXZpb3VzIGJ1ZyAoMzgpLgoKNDAuIEltcGxlbWVudGVkIFBDUkVfTkVXTElORV9BTlkgdG8gcmVjb2duaXplIGFueSBvZiB0aGUgVW5pY29kZSBuZXdsaW5lCiAgICBzZXF1ZW5jZXMgKGh0dHA6Ly91bmljb2RlLm9yZy91bmljb2RlL3JlcG9ydHMvdHIxOC8pIGFzICJuZXdsaW5lIiB3aGVuCiAgICBwcm9jZXNzaW5nIGRvdCwgY2lyY3VtZmxleCwgb3IgZG9sbGFyIG1ldGFjaGFyYWN0ZXJzLCBvciAjLWNvbW1lbnRzIGluIC94CiAgICBtb2RlLgoKNDEuIEFkZCBcUiB0byBtYXRjaCBhbnkgVW5pY29kZSBuZXdsaW5lIHNlcXVlbmNlLCBhcyBzdWdnZXN0ZWQgaW4gdGhlIFVuaWNvZGUKICAgIHJlcG9ydC4KCjQyLiBBcHBsaWVkIHBhdGNoLCBvcmlnaW5hbGx5IGZyb20gQXJpIFBvbGxhaywgbW9kaWZpZWQgYnkgR29vZ2xlLCB0byBhbGxvdwogICAgY29weSBjb25zdHJ1Y3Rpb24gYW5kIGFzc2lnbm1lbnQgaW4gdGhlIEMrKyB3cmFwcGVyLgoKNDMuIFVwZGF0ZWQgcGNyZWdyZXAgdG8gc3VwcG9ydCAiLS1uZXdsaW5lPWFueSIuIEluIHRoZSBwcm9jZXNzLCBJIGZpeGVkIGEKICAgIGNvdXBsZSBvZiBidWdzIHRoYXQgY291bGQgaGF2ZSBnaXZlbiB3cm9uZyByZXN1bHRzIGluIHRoZSAiLS1uZXdsaW5lPWNybGYiCiAgICBjYXNlLgoKNDQuIEFkZGVkIGEgbnVtYmVyIG9mIGNhc3RzIGFuZCBkaWQgc29tZSByZW9yZ2FuaXphdGlvbiBvZiBzaWduZWQvdW5zaWduZWQgaW50CiAgICB2YXJpYWJsZXMgZm9sbG93aW5nIHN1Z2dlc3Rpb25zIGZyb20gRGFpciBHcmFudC4gQWxzbyByZW5hbWVkIHRoZSB2YXJpYWJsZQogICAgInRoaXMiIGFzICJpdGVtIiBiZWNhdXNlIGl0IGlzIGEgQysrIGtleXdvcmQuCgo0NS4gQXJyYW5nZWQgZm9yIGRmdGFibGVzIHRvIGFkZAoKICAgICAgI2luY2x1ZGUgInBjcmVfaW50ZXJuYWwuaCIKCiAgICB0byBwY3JlX2NoYXJ0YWJsZXMuYyBiZWNhdXNlIHdpdGhvdXQgaXQsIGdjYyA0LnggbWF5IHJlbW92ZSB0aGUgYXJyYXkKICAgIGRlZmluaXRpb24gZnJvbSB0aGUgZmluYWwgYmluYXJ5IGlmIFBDUkUgaXMgYnVpbHQgaW50byBhIHN0YXRpYyBsaWJyYXJ5IGFuZAogICAgZGVhZCBjb2RlIHN0cmlwcGluZyBpcyBhY3RpdmF0ZWQuCgo0Ni4gRm9yIGFuIHVuYW5jaG9yZWQgcGF0dGVybiwgaWYgYSBtYXRjaCBhdHRlbXB0IGZhaWxzIGF0IHRoZSBzdGFydCBvZiBhCiAgICBuZXdsaW5lIHNlcXVlbmNlLCBhbmQgdGhlIG5ld2xpbmUgc2V0dGluZyBpcyBDUkxGIG9yIEFOWSwgYW5kIHRoZSBuZXh0IHR3bwogICAgY2hhcmFjdGVycyBhcmUgQ1JMRiwgYWR2YW5jZSBieSB0d28gY2hhcmFjdGVycyBpbnN0ZWFkIG9mIG9uZS4KCgpWZXJzaW9uIDYuNyAwNC1KdWwtMDYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogMS4gSW4gb3JkZXIgdG8gaGFuZGxlIHRlc3RzIHdoZW4gaW5wdXQgbGluZXMgYXJlIGVub3Jtb3VzbHkgbG9uZywgcGNyZXRlc3QgaGFzCiAgICBiZWVuIHJlLWZhY3RvcmVkIHNvIHRoYXQgaXQgYXV0b21hdGljYWxseSBleHRlbmRzIGl0cyBidWZmZXJzIHdoZW4KICAgIG5lY2Vzc2FyeS4gVGhlIGNvZGUgaXMgY3J1ZGUsIGJ1dCB0aGlzIF9pc18ganVzdCBhIHRlc3QgcHJvZ3JhbS4gVGhlCiAgICBkZWZhdWx0IHNpemUgaGFzIGJlZW4gaW5jcmVhc2VkIGZyb20gMzJLIHRvIDUwSy4KCiAyLiBUaGUgY29kZSBpbiBwY3JlX3N0dWR5KCkgd2FzIHVzaW5nIHRoZSB2YWx1ZSBvZiB0aGUgcmUgYXJndW1lbnQgYmVmb3JlCiAgICB0ZXN0aW5nIGl0IGZvciBOVUxMLiAoT2YgY291cnNlLCBpbiBhbnkgc2Vuc2libGUgY2FsbCBvZiB0aGUgZnVuY3Rpb24sIGl0CiAgICB3b24ndCBiZSBOVUxMLikKCiAzLiBUaGUgbWVtbW92ZSgpIGVtdWxhdGlvbiBmdW5jdGlvbiBpbiBwY3JlX2ludGVybmFsLmgsIHdoaWNoIGlzIHVzZWQgb24KICAgIHN5c3RlbXMgdGhhdCBsYWNrIGJvdGggbWVtbW92ZSgpIGFuZCBiY29weSgpIC0gdGhhdCBpcywgaGFyZGx5IGV2ZXIgLQogICAgd2FzIG1pc3NpbmcgYSAic3RhdGljIiBzdG9yYWdlIGNsYXNzIHNwZWNpZmllci4KCiA0LiBXaGVuIFVURi04IG1vZGUgd2FzIG5vdCBzZXQsIFBDUkUgbG9vcGVkIHdoZW4gY29tcGlsaW5nIGNlcnRhaW4gcGF0dGVybnMKICAgIGNvbnRhaW5pbmcgYW4gZXh0ZW5kZWQgY2xhc3MgKG9uZSB0aGF0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBieSBhIGJpdG1hcAogICAgYmVjYXVzZSBpdCBjb250YWlucyBoaWdoLXZhbHVlZCBjaGFyYWN0ZXJzIG9yIFVuaWNvZGUgcHJvcGVydHkgaXRlbXMsIGUuZy4KICAgIFtccFpdKS4gQWxtb3N0IGFsd2F5cyBvbmUgd291bGQgc2V0IFVURi04IG1vZGUgd2hlbiBwcm9jZXNzaW5nIHN1Y2ggYQogICAgcGF0dGVybiwgYnV0IFBDUkUgc2hvdWxkIG5vdCBsb29wIGlmIHlvdSBkbyBub3QgKGl0IG5vIGxvbmdlciBkb2VzKS4KICAgIFtEZXRhaWw6IHR3byBjYXNlcyB3ZXJlIGZvdW5kOiAoYSkgYSByZXBlYXRlZCBzdWJwYXR0ZXJuIGNvbnRhaW5pbmcgYW4KICAgIGV4dGVuZGVkIGNsYXNzOyAoYikgYSByZWN1cnNpdmUgcmVmZXJlbmNlIHRvIGEgc3VicGF0dGVybiB0aGF0IGZvbGxvd2VkIGEKICAgIHByZXZpb3VzIGV4dGVuZGVkIGNsYXNzLiBJdCB3YXNuJ3Qgc2tpcHBpbmcgb3ZlciB0aGUgZXh0ZW5kZWQgY2xhc3MKICAgIGNvcnJlY3RseSB3aGVuIFVURi04IG1vZGUgd2FzIG5vdCBzZXQuXQoKIDUuIEEgbmVnYXRlZCBzaW5nbGUtY2hhcmFjdGVyIGNsYXNzIHdhcyBub3QgYmVpbmcgcmVjb2duaXplZCBhcyBmaXhlZC1sZW5ndGgKICAgIGluIGxvb2tiZWhpbmQgYXNzZXJ0aW9ucyBzdWNoIGFzICg/PD1bXmZdKSwgbGVhZGluZyB0byBhbiBpbmNvcnJlY3QKICAgIGNvbXBpbGUgZXJyb3IgImxvb2tiZWhpbmQgYXNzZXJ0aW9uIGlzIG5vdCBmaXhlZCBsZW5ndGgiLgoKIDYuIFRoZSBSdW5QZXJsVGVzdCBhdXhpbGlhcnkgc2NyaXB0IHdhcyBzaG93aW5nIGFuIHVuZXhwZWN0ZWQgZGlmZmVyZW5jZQogICAgYmV0d2VlbiBQQ1JFIGFuZCBQZXJsIGZvciBVVEYtOCB0ZXN0cy4gSXQgdHVybnMgb3V0IHRoYXQgaXQgaXMgaGFyZCB0bwogICAgd3JpdGUgYSBQZXJsIHNjcmlwdCB0aGF0IGNhbiBpbnRlcnByZXQgbGluZXMgb2YgYW4gaW5wdXQgZmlsZSBlaXRoZXIgYXMKICAgIGJ5dGUgY2hhcmFjdGVycyBvciBhcyBVVEYtOCwgd2hpY2ggaXMgd2hhdCAicGVybHRlc3QiIHdhcyBiZWluZyByZXF1aXJlZCB0bwogICAgZG8gZm9yIHRoZSBub24tVVRGLTggYW5kIFVURi04IHRlc3RzLCByZXNwZWN0aXZlbHkuIEVzc2VudGlhbGx5IHdoYXQgeW91CiAgICBjYW4ndCBkbyBpcyBzd2l0Y2ggZWFzaWx5IGF0IHJ1biB0aW1lIGJldHdlZW4gaGF2aW5nIHRoZSAidXNlIHV0Zjg7IiBwcmFnbWEKICAgIG9yIG5vdC4gSW4gdGhlIGVuZCwgSSBmdWRnZWQgaXQgYnkgdXNpbmcgdGhlIFJ1blBlcmxUZXN0IHNjcmlwdCB0byBpbnNlcnQKICAgICJ1c2UgdXRmODsiIGV4cGxpY2l0bHkgZm9yIHRoZSBVVEYtOCB0ZXN0cy4KCiA3LiBJbiBtdWx0aWxpbmUgKC9tKSBtb2RlLCBQQ1JFIHdhcyBtYXRjaGluZyBeIGFmdGVyIGEgdGVybWluYXRpbmcgbmV3bGluZSBhdAogICAgdGhlIGVuZCBvZiB0aGUgc3ViamVjdCBzdHJpbmcsIGNvbnRyYXJ5IHRvIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0byB3aGF0CiAgICBQZXJsIGRvZXMuIFRoaXMgd2FzIHRydWUgb2YgYm90aCBtYXRjaGluZyBmdW5jdGlvbnMuIE5vdyBpdCBtYXRjaGVzIG9ubHkgYXQKICAgIHRoZSBzdGFydCBvZiB0aGUgc3ViamVjdCBhbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgKmludGVybmFsKiBuZXdsaW5lcy4KCiA4LiBBIGNhbGwgb2YgcGNyZV9mdWxsaW5mbygpIGZyb20gcGNyZXRlc3QgdG8gZ2V0IHRoZSBvcHRpb24gYml0cyB3YXMgcGFzc2luZwogICAgYSBwb2ludGVyIHRvIGFuIGludCBpbnN0ZWFkIG9mIGEgcG9pbnRlciB0byBhbiB1bnNpZ25lZCBsb25nIGludC4gVGhpcwogICAgY2F1c2VkIHByb2JsZW1zIG9uIDY0LWJpdCBzeXN0ZW1zLgoKIDkuIEFwcGxpZWQgYSBwYXRjaCBmcm9tIHRoZSBmb2xrcyBhdCBHb29nbGUgdG8gcGNyZWNwcC5jYywgdG8gZml4ICJhbm90aGVyCiAgICBpbnN0YW5jZSBvZiB0aGUgJ3N0YW5kYXJkJyB0ZW1wbGF0ZSBsaWJyYXJ5IG5vdCBiZWluZyBzbyBzdGFuZGFyZCIuCgoxMC4gVGhlcmUgd2FzIG5vIGNoZWNrIG9uIHRoZSBudW1iZXIgb2YgbmFtZWQgc3VicGF0dGVybnMgbm9yIHRoZSBtYXhpbXVtCiAgICBsZW5ndGggb2YgYSBzdWJwYXR0ZXJuIG5hbWUuIFRoZSBwcm9kdWN0IG9mIHRoZXNlIHZhbHVlcyBpcyB1c2VkIHRvIGNvbXB1dGUKICAgIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgYmxvY2sgZm9yIGEgY29tcGlsZWQgcGF0dGVybi4gQnkgc3VwcGx5aW5nIGEgdmVyeQogICAgbG9uZyBzdWJwYXR0ZXJuIG5hbWUgYW5kIGEgbGFyZ2UgbnVtYmVyIG9mIG5hbWVkIHN1YnBhdHRlcm5zLCB0aGUgc2l6ZQogICAgY29tcHV0YXRpb24gY291bGQgYmUgY2F1c2VkIHRvIG92ZXJmbG93LiBUaGlzIGlzIG5vdyBwcmV2ZW50ZWQgYnkgbGltaXRpbmcKICAgIHRoZSBsZW5ndGggb2YgbmFtZXMgdG8gMzIgY2hhcmFjdGVycywgYW5kIHRoZSBudW1iZXIgb2YgbmFtZWQgc3VicGF0dGVybnMKICAgIHRvIDEwLDAwMC4KCjExLiBTdWJwYXR0ZXJucyB0aGF0IGFyZSByZXBlYXRlZCB3aXRoIHNwZWNpZmljIGNvdW50cyBoYXZlIHRvIGJlIHJlcGxpY2F0ZWQgaW4KICAgIHRoZSBjb21waWxlZCBwYXR0ZXJuLiBUaGUgc2l6ZSBvZiBtZW1vcnkgZm9yIHRoaXMgd2FzIGNvbXB1dGVkIGZyb20gdGhlCiAgICBsZW5ndGggb2YgdGhlIHN1YnBhdHRlcm4gYW5kIHRoZSByZXBlYXQgY291bnQuIFRoZSBsYXR0ZXIgaXMgbGltaXRlZCB0bwogICAgNjU1MzUsIGJ1dCB0aGVyZSB3YXMgbm8gbGltaXQgb24gdGhlIGZvcm1lciwgbWVhbmluZyB0aGF0IGludGVnZXIgb3ZlcmZsb3cKICAgIGNvdWxkIGluIHByaW5jaXBsZSBvY2N1ci4gVGhlIGNvbXBpbGVkIGxlbmd0aCBvZiBhIHJlcGVhdGVkIHN1YnBhdHRlcm4gaXMKICAgIG5vdyBsaW1pdGVkIHRvIDMwLDAwMCBieXRlcyBpbiBvcmRlciB0byBwcmV2ZW50IHRoaXMuCgoxMi4gQWRkZWQgdGhlIG9wdGlvbmFsIGZhY2lsaXR5IHRvIGhhdmUgbmFtZWQgc3Vic3RyaW5ncyB3aXRoIHRoZSBzYW1lIG5hbWUuCgoxMy4gQWRkZWQgdGhlIGFiaWxpdHkgdG8gdXNlIGEgbmFtZWQgc3Vic3RyaW5nIGFzIGEgY29uZGl0aW9uLCB1c2luZyB0aGUKICAgIFB5dGhvbiBzeW50YXg6ICg/KG5hbWUpeWVzfG5vKS4gVGhpcyBvdmVybG9hZHMgKD8oUikuLi4gYW5kIG5hbWVzIHRoYXQKICAgIGFyZSBudW1iZXJzIChub3QgcmVjb21tZW5kZWQpLiBGb3J3YXJkIHJlZmVyZW5jZXMgYXJlIHBlcm1pdHRlZC4KCjE0LiBBZGRlZCBmb3J3YXJkIHJlZmVyZW5jZXMgaW4gbmFtZWQgYmFja3JlZmVyZW5jZXMgKGlmIHlvdSBzZWUgd2hhdCBJIG1lYW4pLgoKMTUuIEluIFVURi04IG1vZGUsIHdpdGggdGhlIFBDUkVfRE9UQUxMIG9wdGlvbiBzZXQsIGEgcXVhbnRpZmllZCBkb3QgaW4gdGhlCiAgICBwYXR0ZXJuIGNvdWxkIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgc3ViamVjdC4gRm9yIGV4YW1wbGUsIHRoZSBwYXR0ZXJuCiAgICAiKD9zKSguezEsNX0pIjggZGlkIHRoaXMgd2l0aCB0aGUgc3ViamVjdCAiYWIiLgoKMTYuIElmIFBDUkVfRE9UQUxMIG9yIFBDUkVfTVVMVElMSU5FIHdlcmUgc2V0LCBwY3JlX2RmYV9leGVjKCkgYmVoYXZlZCBhcyBpZgogICAgUENSRV9DQVNFTEVTUyB3YXMgc2V0IHdoZW4gbWF0Y2hpbmcgY2hhcmFjdGVycyB0aGF0IHdlcmUgcXVhbnRpZmllZCB3aXRoID8KICAgIG9yICouCgoxNy4gQSBjaGFyYWN0ZXIgY2xhc3Mgb3RoZXIgdGhhbiBhIHNpbmdsZSBuZWdhdGVkIGNoYXJhY3RlciB0aGF0IGhhZCBhIG1pbmltdW0KICAgIGJ1dCBubyBtYXhpbXVtIHF1YW50aWZpZXIgLSBmb3IgZXhhbXBsZSBbYWJdezYsfSAtIHdhcyBub3QgaGFuZGxlZAogICAgY29ycmVjdGx5IGJ5IHBjZV9kZmFfZXhlYygpLiBJdCB3b3VsZCBtYXRjaCBvbmx5IG9uZSBjaGFyYWN0ZXIuCgoxOC4gQSB2YWxpZCAodGhvdWdoIG9kZCkgcGF0dGVybiB0aGF0IGxvb2tlZCBsaWtlIGEgUE9TSVggY2hhcmFjdGVyCiAgICBjbGFzcyBidXQgdXNlZCBhbiBpbnZhbGlkIGNoYXJhY3RlciBhZnRlciBbIChmb3IgZXhhbXBsZSBbWyxhYmMsXV0pIGNhdXNlZAogICAgcGNyZV9jb21waWxlKCkgdG8gZ2l2ZSB0aGUgZXJyb3IgIkZhaWxlZDogaW50ZXJuYWwgZXJyb3I6IGNvZGUgb3ZlcmZsb3ciIG9yCiAgICBpbiBzb21lIGNhc2VzIHRvIGNyYXNoIHdpdGggYSBnbGliYyBmcmVlKCkgZXJyb3IuIFRoaXMgY291bGQgZXZlbiBoYXBwZW4gaWYKICAgIHRoZSBwYXR0ZXJuIHRlcm1pbmF0ZWQgYWZ0ZXIgW1sgYnV0IHRoZXJlIGp1c3QgaGFwcGVuZWQgdG8gYmUgYSBzZXF1ZW5jZSBvZgogICAgbGV0dGVycywgYSBiaW5hcnkgemVybywgYW5kIGEgY2xvc2luZyBdIGluIHRoZSBtZW1vcnkgdGhhdCBmb2xsb3dlZC4KCjE5LiBQZXJsJ3MgdHJlYXRtZW50IG9mIG9jdGFsIGVzY2FwZXMgaW4gdGhlIHJhbmdlIFw0MDAgdG8gXDc3NyBoYXMgY2hhbmdlZAogICAgb3ZlciB0aGUgeWVhcnMuIE9yaWdpbmFsbHkgKGJlZm9yZSBhbnkgVW5pY29kZSBzdXBwb3J0KSwganVzdCB0aGUgYm90dG9tIDgKICAgIGJpdHMgd2VyZSB0YWtlbi4gVGh1cywgZm9yIGV4YW1wbGUsIFw1MDAgcmVhbGx5IG1lYW50IFwxMDAuIE5vd2FkYXlzIHRoZQogICAgb3V0cHV0IGZyb20gIm1hbiBwZXJsdW5pY29kZSIgaW5jbHVkZXMgdGhpczoKCiAgICAgIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gY29tcGlsZXIgcHJvZHVjZXMgcG9seW1vcnBoaWMgb3Bjb2Rlcy4gIFRoYXQKICAgICAgaXMsIHRoZSBwYXR0ZXJuIGFkYXB0cyB0byB0aGUgZGF0YSBhbmQgYXV0b21hdGljYWxseSBzd2l0Y2hlcyB0bwogICAgICB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgc2NoZW1lIHdoZW4gcHJlc2VudGVkIHdpdGggVW5pY29kZSBkYXRhLS1vcgogICAgICBpbnN0ZWFkIHVzZXMgYSB0cmFkaXRpb25hbCBieXRlIHNjaGVtZSB3aGVuIHByZXNlbnRlZCB3aXRoIGJ5dGUKICAgICAgZGF0YS4KCiAgICBTYWRseSwgYSB3aWRlIG9jdGFsIGVzY2FwZSBkb2VzIG5vdCBjYXVzZSBhIHN3aXRjaCwgYW5kIGluIGEgc3RyaW5nIHdpdGgKICAgIG5vIG90aGVyIG11bHRpYnl0ZSBjaGFyYWN0ZXJzLCB0aGVzZSBvY3RhbCBlc2NhcGVzIGFyZSB0cmVhdGVkIGFzIGJlZm9yZS4KICAgIFRodXMsIGluIFBlcmwsIHRoZSBwYXR0ZXJuICAvXDUwMC8gYWN0dWFsbHkgbWF0Y2hlcyBcMTAwIGJ1dCB0aGUgcGF0dGVybgogICAgL1w1MDB8XHh7MWZmfS8gbWF0Y2hlcyBcNTAwIG9yIFw3NzcgYmVjYXVzZSB0aGUgd2hvbGUgdGhpbmcgaXMgdHJlYXRlZCBhcyBhCiAgICBVbmljb2RlIHN0cmluZy4KCiAgICBJIGhhdmUgbm90IHBlcnBldHJhdGVkIHN1Y2ggY29uZnVzaW9uIGluIFBDUkUuIFVwIHRpbGwgbm93LCBpdCB0b29rIGp1c3QKICAgIHRoZSBib3R0b20gOCBiaXRzLCBhcyBpbiBvbGQgUGVybC4gSSBoYXZlIG5vdyBtYWRlIG9jdGFsIGVzY2FwZXMgd2l0aAogICAgdmFsdWVzIGdyZWF0ZXIgdGhhbiBcMzc3IGlsbGVnYWwgaW4gbm9uLVVURi04IG1vZGUuIEluIFVURi04IG1vZGUgdGhleQogICAgdHJhbnNsYXRlIHRvIHRoZSBhcHByb3ByaWF0ZSBtdWx0aWJ5dGUgY2hhcmFjdGVyLgoKMjkuIEFwcGxpZWQgc29tZSByZWZhY3RvcmluZyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiB3YXJuaW5ncyBmcm9tIE1pY3Jvc29mdAogICAgYW5kIEJvcmxhbmQgY29tcGlsZXJzLiBUaGlzIGhhcyBpbmNsdWRlZCByZW1vdmluZyB0aGUgZnVkZ2UgaW50cm9kdWNlZAogICAgc2V2ZW4geWVhcnMgYWdvIGZvciB0aGUgT1MvMiBjb21waWxlciAoc2VlIDIuMDIvMiBiZWxvdykgYmVjYXVzZSBpdCBjYXVzZWQKICAgIGEgd2FybmluZyBhYm91dCBhbiB1bnVzZWQgdmFyaWFibGUuCgoyMS4gUENSRSBoYXMgbm90IGluY2x1ZGVkIFZUIChjaGFyYWN0ZXIgMHgwYikgaW4gdGhlIHNldCBvZiB3aGl0ZXNwYWNlCiAgICBjaGFyYWN0ZXJzIHNpbmNlIHJlbGVhc2UgNC4wLCBiZWNhdXNlIFBlcmwgKGZyb20gcmVsZWFzZSA1LjAwNCkgZG9lcyBub3QuCiAgICBbT3IgYXQgbGVhc3QsIGlzIGRvY3VtZW50ZWQgbm90IHRvOiBzb21lIHJlbGVhc2VzIHNlZW0gdG8gYmUgaW4gY29uZmxpY3QKICAgIHdpdGggdGhlIGRvY3VtZW50YXRpb24uXSBIb3dldmVyLCB3aGVuIGEgcGF0dGVybiB3YXMgc3R1ZGllZCB3aXRoCiAgICBwY3JlX3N0dWR5KCkgYW5kIGFsbCBpdHMgYnJhbmNoZXMgc3RhcnRlZCB3aXRoIFxzLCBQQ1JFIHN0aWxsIGluY2x1ZGVkIFZUCiAgICBhcyBhIHBvc3NpYmxlIHN0YXJ0aW5nIGNoYXJhY3Rlci4gT2YgY291cnNlLCB0aGlzIGRpZCBubyBoYXJtOyBpdCBqdXN0CiAgICBjYXVzZWQgYW4gdW5uZWNlc3NhcnkgbWF0Y2ggYXR0ZW1wdC4KCjIyLiBSZW1vdmVkIGEgbm93LXJlZHVuZGFudCBpbnRlcm5hbCBmbGFnIGJpdCB0aGF0IHJlY29yZGVkIHRoZSBmYWN0IHRoYXQgY2FzZQogICAgZGVwZW5kZW5jeSBjaGFuZ2VkIHdpdGhpbiB0aGUgcGF0dGVybi4gVGhpcyB3YXMgb25jZSBuZWVkZWQgZm9yICJyZXF1aXJlZAogICAgYnl0ZSIgcHJvY2Vzc2luZywgYnV0IGlzIG5vIGxvbmdlciB1c2VkLiBUaGlzIHJlY292ZXJzIGEgbm93LXNjYXJjZSBvcHRpb25zCiAgICBiaXQuIEFsc28gbW92ZWQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGludGVybmFsIGZsYWcgYml0IHRvIHRoZSBtb3N0LQogICAgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSB3b3JkLCB3aGljaCB3YXMgbm90IHByZXZpb3VzbHkgdXNlZCAoaGFuZ292ZXIgZnJvbQogICAgdGhlIGRheXMgd2hlbiBpdCB3YXMgYW4gaW50IHJhdGhlciB0aGFuIGEgdWludCkgdG8gZnJlZSB1cCBhbm90aGVyIGJpdCBmb3IKICAgIHRoZSBmdXR1cmUuCgoyMy4gQWRkZWQgc3VwcG9ydCBmb3IgQ1JMRiBsaW5lIGVuZGluZ3MgYXMgd2VsbCBhcyBDUiBhbmQgTEYuIEFzIHdlbGwgYXMgdGhlCiAgICBkZWZhdWx0IGJlaW5nIHNlbGVjdGFibGUgYXQgYnVpbGQgdGltZSwgaXQgY2FuIG5vdyBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUKICAgIHZpYSB0aGUgUENSRV9ORVdMSU5FX3h4eCBmbGFncy4gVGhlcmUgYXJlIG5vdyBvcHRpb25zIGZvciBwY3JlZ3JlcCB0bwogICAgc3BlY2lmeSB0aGF0IGl0IGlzIHNjYW5uaW5nIGRhdGEgd2l0aCBub24tZGVmYXVsdCBsaW5lIGVuZGluZ3MuCgoyNC4gQ2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiBDWFhMSU5LIHRvIG1ha2UgaXQgYWdyZWUgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZgogICAgTElOSyBpbiB0aGUgTWFrZWZpbGUsIGJ5IHJlcGxhY2luZyBMREZMQUdTIHRvIENYWEZMQUdTLgoKMjUuIEFwcGxpZWQgSWFuIFRheWxvcidzIHBhdGNoZXMgdG8gYXZvaWQgdXNpbmcgYW5vdGhlciBzdGFjayBmcmFtZSBmb3IgdGFpbAogICAgcmVjdXJzaW9ucy4gVGhpcyBtYWtlcyBhIGJpZyBkaWZmZXJlbnQgdG8gc3RhY2sgdXNhZ2UgZm9yIHNvbWUgcGF0dGVybnMuCgoyNi4gSWYgYSBzdWJwYXR0ZXJuIGNvbnRhaW5pbmcgYSBuYW1lZCByZWN1cnNpb24gb3Igc3Vicm91dGluZSByZWZlcmVuY2Ugc3VjaAogICAgYXMgKD9QPkIpIHdhcyBxdWFudGlmaWVkLCBmb3IgZXhhbXBsZSAoeHh4KD9QPkIpKXszfSwgdGhlIGNhbGN1bGF0aW9uIG9mCiAgICB0aGUgc3BhY2UgcmVxdWlyZWQgZm9yIHRoZSBjb21waWxlZCBwYXR0ZXJuIHdlbnQgd3JvbmcgYW5kIGdhdmUgdG9vIHNtYWxsIGEKICAgIHZhbHVlLiBEZXBlbmRpbmcgb24gdGhlIGVudmlyb25tZW50LCB0aGlzIGNvdWxkIGxlYWQgdG8gIkZhaWxlZDogaW50ZXJuYWwKICAgIGVycm9yOiBjb2RlIG92ZXJmbG93IGF0IG9mZnNldCA0OSIgb3IgImdsaWJjIGRldGVjdGVkIGRvdWJsZSBmcmVlIG9yCiAgICBjb3JydXB0aW9uIiBlcnJvcnMuCgoyNy4gQXBwbGllZCBwYXRjaGVzIGZyb20gR29vZ2xlIChhKSB0byBzdXBwb3J0IHRoZSBuZXcgbmV3bGluZSBtb2RlcyBhbmQgKGIpIHRvCiAgICBhZHZhbmNlIG92ZXIgbXVsdGlieXRlIFVURi04IGNoYXJhY3RlcnMgaW4gR2xvYmFsUmVwbGFjZS4KCjI4LiBDaGFuZ2UgZnJlZSgpIHRvIHBjcmVfZnJlZSgpIGluIHBjcmVkZW1vLmMuIEFwcGFyZW50bHkgdGhpcyBtYWtlcyBhCiAgICBkaWZmZXJlbmNlIGZvciBzb21lIGltcGxlbWVudGF0aW9uIG9mIFBDUkUgaW4gc29tZSBXaW5kb3dzIHZlcnNpb24uCgoyOS4gQWRkZWQgc29tZSBleHRyYSB0ZXN0aW5nIGZhY2lsaXRpZXMgdG8gcGNyZXRlc3Q6CgogICAgXHE8bnVtYmVyPiAgIGluIGEgZGF0YSBsaW5lIHNldHMgdGhlICJtYXRjaCBsaW1pdCIgdmFsdWUKICAgIFxRPG51bWJlcj4gICBpbiBhIGRhdGEgbGluZSBzZXRzIHRoZSAibWF0Y2ggcmVjdXJzaW9uIGxpbXQiIHZhbHVlCiAgICAtUyA8bnVtYmVyPiAgc2V0cyB0aGUgc3RhY2sgc2l6ZSwgd2hlcmUgPG51bWJlcj4gaXMgaW4gbWVnYWJ5dGVzCgogICAgVGhlIC1TIG9wdGlvbiBpc24ndCBhdmFpbGFibGUgZm9yIFdpbmRvd3MuCgoKVmVyc2lvbiA2LjYgMDYtRmViLTA2Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIDEuIENoYW5nZSAxNihhKSBmb3IgNi41IGJyb2tlIHRoaW5ncywgYmVjYXVzZSBQQ1JFX0RBVEFfU0NPUEUgd2FzIG5vdCBkZWZpbmVkCiAgICBpbiBwY3JlcG9zaXguaC4gSSBoYXZlIGNvcGllZCB0aGUgZGVmaW5pdGlvbiBmcm9tIHBjcmUuaC4KCiAyLiBDaGFuZ2UgMjUgZm9yIDYuNSBicm9rZSBjb21waWxhdGlvbiBpbiBhIGJ1aWxkIGRpcmVjdG9yeSBvdXQtb2YtdHJlZQogICAgYmVjYXVzZSBwY3JlLmggaXMgbm8gbG9uZ2VyIGEgYnVpbHQgZmlsZS4KCiAzLiBBZGRlZCBKZWZmIEZyaWVkbCdzIGFkZGl0aW9uYWwgZGVidWdnaW5nIHBhdGNoZXMgdG8gcGNyZWdyZXAuIFRoZXNlIGFyZQogICAgbm90IG5vcm1hbGx5IGluY2x1ZGVkIGluIHRoZSBjb21waWxlZCBjb2RlLgoKClZlcnNpb24gNi41IDAxLUZlYi0wNgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAxLiBXaGVuIHVzaW5nIHRoZSBwYXJ0aWFsIG1hdGNoIGZlYXR1cmUgd2l0aCBwY3JlX2RmYV9leGVjKCksIGl0IHdhcyBub3QKICAgIGFuY2hvcmluZyB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHBhcnRpYWwgbWF0Y2hlcyBhdCB0aGUgbmV3IHN0YXJ0aW5nCiAgICBwb2ludC4gVGhpcyBjb3VsZCBsZWFkIHRvIGluY29ycmVjdCByZXN1bHRzLiBGb3IgZXhhbXBsZSwgd2l0aCB0aGUgcGF0dGVybgogICAgLzEyMzQvLCBwYXJ0aWFsbHkgbWF0Y2hpbmcgYWdhaW5zdCAiMTIzIiBhbmQgdGhlbiAiYTQiIGdhdmUgYSBtYXRjaC4KCiAyLiBDaGFuZ2VzIHRvIHBjcmVncmVwOgoKICAgIChhKSBBbGwgbm9uLW1hdGNoIHJldHVybnMgZnJvbSBwY3JlX2V4ZWMoKSB3ZXJlIGJlaW5nIHRyZWF0ZWQgYXMgZmFpbHVyZXMKICAgICAgICB0byBtYXRjaCB0aGUgbGluZS4gTm93LCB1bmxlc3MgdGhlIGVycm9yIGlzIFBDUkVfRVJST1JfTk9NQVRDSCwgYW4KICAgICAgICBlcnJvciBtZXNzYWdlIGlzIG91dHB1dC4gU29tZSBleHRyYSBpbmZvcm1hdGlvbiBpcyBnaXZlbiBmb3IgdGhlCiAgICAgICAgUENSRV9FUlJPUl9NQVRDSExJTUlUIGFuZCBQQ1JFX0VSUk9SX1JFQ1VSU0lPTkxJTUlUIGVycm9ycywgd2hpY2ggYXJlCiAgICAgICAgcHJvYmFibHkgdGhlIG9ubHkgZXJyb3JzIHRoYXQgYXJlIGxpa2VseSB0byBiZSBjYXVzZWQgYnkgdXNlcnMgKGJ5CiAgICAgICAgc3BlY2lmeWluZyBhIHJlZ2V4IHRoYXQgaGFzIG5lc3RlZCBpbmRlZmluaXRlIHJlcGVhdHMsIGZvciBpbnN0YW5jZSkuCiAgICAgICAgSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAyMCBvZiB0aGVzZSBlcnJvcnMsIHBjcmVncmVwIGlzIGFiYW5kb25lZC4KCiAgICAoYikgQSBiaW5hcnkgemVybyB3YXMgdHJlYXRlZCBhcyBkYXRhIHdoaWxlIG1hdGNoaW5nLCBidXQgdGVybWluYXRlZCB0aGUKICAgICAgICBvdXRwdXQgbGluZSBpZiBpdCB3YXMgd3JpdHRlbiBvdXQuIFRoaXMgaGFzIGJlZW4gZml4ZWQ6IGJpbmFyeSB6ZXJvZXMKICAgICAgICBhcmUgbm93IG5vIGRpZmZlcmVudCB0byBhbnkgb3RoZXIgZGF0YSBieXRlcy4KCiAgICAoYykgV2hpY2hldmVyIG9mIHRoZSBMQ19BTEwgb3IgTENfQ1RZUEUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGlzIHNldCBpcwogICAgICAgIHVzZWQgdG8gc2V0IGEgbG9jYWxlIGZvciBtYXRjaGluZy4gVGhlIC0tbG9jYWxlPXh4eHggbG9uZyBvcHRpb24gaGFzCiAgICAgICAgYmVlbiBhZGRlZCAobm8gc2hvcnQgZXF1aXZhbGVudCkgdG8gc3BlY2lmeSBhIGxvY2FsZSBleHBsaWNpdGx5IG9uIHRoZQogICAgICAgIHBjcmVncmVwIGNvbW1hbmQsIG92ZXJyaWRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KCiAgICAoZCkgV2hlbiAtQiB3YXMgdXNlZCB3aXRoIC1uLCBzb21lIGxpbmUgbnVtYmVycyBpbiB0aGUgb3V0cHV0IHdlcmUgb25lIGxlc3MKICAgICAgICB0aGFuIHRoZXkgc2hvdWxkIGhhdmUgYmVlbi4KCiAgICAoZSkgQWRkZWQgdGhlIC1vICgtLW9ubHktbWF0Y2hpbmcpIG9wdGlvbi4KCiAgICAoZikgSWYgLUEgb3IgLUMgd2FzIHVzZWQgd2l0aCAtYyAoY291bnQgb25seSksIHNvbWUgbGluZXMgb2YgY29udGV4dCB3ZXJlCiAgICAgICAgYWNjaWRlbnRhbGx5IHByaW50ZWQgZm9yIHRoZSBmaW5hbCBtYXRjaC4KCiAgICAoZykgQWRkZWQgdGhlIC1IICgtLXdpdGgtZmlsZW5hbWUpIG9wdGlvbi4KCiAgICAoaCkgVGhlIGNvbWJpbmF0aW9uIG9mIG9wdGlvbnMgLXJoIGZhaWxlZCB0byBzdXBwcmVzcyBmaWxlIG5hbWVzIGZvciBmaWxlcwogICAgICAgIHRoYXQgd2VyZSBmb3VuZCBmcm9tIGRpcmVjdG9yeSBhcmd1bWVudHMuCgogICAgKGkpIEFkZGVkIHRoZSAtRCAoLS1kZXZpY2VzKSBhbmQgLWQgKC0tZGlyZWN0b3JpZXMpIG9wdGlvbnMuCgogICAgKGopIEFkZGVkIHRoZSAtRiAoLS1maXhlZC1zdHJpbmdzKSBvcHRpb24uCgogICAgKGspIEFsbG93ICItIiB0byBiZSB1c2VkIGFzIGEgZmlsZSBuYW1lIGZvciAtZiBhcyB3ZWxsIGFzIGZvciBhIGRhdGEgZmlsZS4KCiAgICAobCkgQWRkZWQgdGhlIC0tY29sbyh1KXIgb3B0aW9uLgoKICAgIChtKSBBZGRlZCBKZWZmcmV5IEZyaWVkbCdzIC1TIHRlc3Rpbmcgb3B0aW9uLCBidXQgd2l0aGluICNpZmRlZnMgc28gdGhhdCBpdAogICAgICAgIGlzIG5vdCBwcmVzZW50IGJ5IGRlZmF1bHQuCgogMy4gQSBuYXN0eSBidWcgd2FzIGRpc2NvdmVyZWQgaW4gdGhlIGhhbmRsaW5nIG9mIHJlY3Vyc2l2ZSBwYXR0ZXJucywgdGhhdCBpcywKICAgIGl0ZW1zIHN1Y2ggYXMgKD9SKSBvciAoPzEpLCB3aGVuIHRoZSByZWN1cnNpb24gY291bGQgbWF0Y2ggYSBudW1iZXIgb2YKICAgIGFsdGVybmF0aXZlcy4gSWYgaXQgbWF0Y2hlZCBvbmUgb2YgdGhlIGFsdGVybmF0aXZlcywgYnV0IHN1YnNlcXVlbnRseSwKICAgIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgdGhlcmUgd2FzIGEgZmFpbHVyZSwgdGhlIGNvZGUgdHJpZWQgdG8gYmFjayB1cCBpbnRvCiAgICB0aGUgcmVjdXJzaW9uLiBIb3dldmVyLCBiZWNhdXNlIG9mIHRoZSB3YXkgUENSRSBpcyBpbXBsZW1lbnRlZCwgdGhpcyBpcyBub3QKICAgIHBvc3NpYmxlLCBhbmQgdGhlIHJlc3VsdCB3YXMgYW4gaW5jb3JyZWN0IHJlc3VsdCBmcm9tIHRoZSBtYXRjaC4KCiAgICBJbiBvcmRlciB0byBwcmV2ZW50IHRoaXMgaGFwcGVuaW5nLCB0aGUgc3BlY2lmaWNhdGlvbiBvZiByZWN1cnNpb24gaGFzCiAgICBiZWVuIGNoYW5nZWQgc28gdGhhdCBhbGwgc3VjaCBzdWJwYXR0ZXJucyBhcmUgYXV0b21hdGljYWxseSB0cmVhdGVkIGFzCiAgICBhdG9taWMgZ3JvdXBzLiBUaHVzLCBmb3IgZXhhbXBsZSwgKD9SKSBpcyB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgKD8+KD9SKSkuCgogNC4gSSBoYWQgb3Zlcmxvb2tlZCB0aGUgZmFjdCB0aGF0LCBpbiBzb21lIGxvY2FsZXMsIHRoZXJlIGFyZSBjaGFyYWN0ZXJzIGZvcgogICAgd2hpY2ggaXNhbHBoYSgpIGlzIHRydWUgYnV0IG5laXRoZXIgaXN1cHBlcigpIG5vciBpc2xvd2VyKCkgYXJlIHRydWUuIEluCiAgICB0aGUgZnJfRlIgbG9jYWxlLCBmb3IgaW5zdGFuY2UsIHRoZSBceEFBIGFuZCBceEJBIGNoYXJhY3RlcnMgKG9yZG1hc2N1bGluZQogICAgYW5kIG9yZGZlbWluaW5lKSBhcmUgbGlrZSB0aGlzLiBUaGlzIGFmZmVjdGVkIHRoZSB0cmVhdG1lbnQgb2YgXHcgYW5kIFxXCiAgICB3aGVuIHRoZXkgYXBwZWFyZWQgaW4gY2hhcmFjdGVyIGNsYXNzZXMsIGJ1dCBub3Qgd2hlbiB0aGV5IGFwcGVhcmVkIG91dHNpZGUKICAgIGEgY2hhcmFjdGVyIGNsYXNzLiBUaGUgYml0IG1hcCBmb3IgIndvcmQiIGNoYXJhY3RlcnMgaXMgbm93IGNyZWF0ZWQKICAgIHNlcGFyYXRlbHkgZnJvbSB0aGUgcmVzdWx0cyBvZiBpc2FsbnVtKCkgaW5zdGVhZCBvZiBqdXN0IHRha2luZyBpdCBmcm9tIHRoZQogICAgdXBwZXIsIGxvd2VyLCBhbmQgZGlnaXQgbWFwcy4gKFBsdXMgdGhlIHVuZGVyc2NvcmUgY2hhcmFjdGVyLCBvZiBjb3Vyc2UuKQoKIDUuIFRoZSBhYm92ZSBidWcgYWxzbyBhZmZlY3RlZCB0aGUgaGFuZGxpbmcgb2YgUE9TSVggY2hhcmFjdGVyIGNsYXNzZXMgc3VjaCBhcwogICAgW1s6YWxwaGE6XV0gYW5kIFtbOmFsbnVtOl1dLiBUaGVzZSBkbyBub3QgaGF2ZSB0aGVpciBvd24gYml0IG1hcHMgaW4gUENSRSdzCiAgICBwZXJtYW5lbnQgdGFibGVzLiBJbnN0ZWFkLCB0aGUgYml0IG1hcHMgZm9yIHN1Y2ggYSBjbGFzcyB3ZXJlIHByZXZpb3VzbHkKICAgIGNyZWF0ZWQgYXMgdGhlIGFwcHJvcHJpYXRlIHVuaW9ucyBvZiB0aGUgdXBwZXIsIGxvd2VyLCBhbmQgZGlnaXQgYml0bWFwcy4KICAgIE5vdyB0aGV5IGFyZSBjcmVhdGVkIGJ5IHN1YnRyYWN0aW9uIGZyb20gdGhlIFtbOndvcmQ6XV0gY2xhc3MsIHdoaWNoIGhhcwogICAgaXRzIG93biBiaXRtYXAuCgogNi4gVGhlIFtbOmJsYW5rOl1dIGNoYXJhY3RlciBjbGFzcyBtYXRjaGVzIGhvcml6b250YWwsIGJ1dCBub3QgdmVydGljYWwgc3BhY2UuCiAgICBJdCBpcyBjcmVhdGVkIGJ5IHN1YnRyYWN0aW5nIHRoZSB2ZXJ0aWNhbCBzcGFjZSBjaGFyYWN0ZXJzIChceDA5LCBceDBhLAogICAgXHgwYiwgXHgwYykgZnJvbSB0aGUgW1s6c3BhY2U6XV0gYml0bWFwLiBQcmV2aW91c2x5LCBob3dldmVyLCB0aGUKICAgIHN1YnRyYWN0aW9uIHdhcyBkb25lIGluIHRoZSBvdmVyYWxsIGJpdG1hcCBmb3IgYSBjaGFyYWN0ZXIgY2xhc3MsIG1lYW5pbmcKICAgIHRoYXQgYSBjbGFzcyBzdWNoIGFzIFtceDBjWzpibGFuazpdXSB3YXMgaW5jb3JyZWN0IGJlY2F1c2UgXHgwYyB3b3VsZCBub3QKICAgIGJlIHJlY29nbml6ZWQuIFRoaXMgYnVnIGhhcyBiZWVuIGZpeGVkLgoKIDcuIFBhdGNoZXMgZnJvbSB0aGUgZm9sa3MgYXQgR29vZ2xlOgoKICAgICAgKGEpIHBjcmVjcHAuY2M6ICJ0byBoYW5kbGUgYSBjb3JuZXIgY2FzZSB0aGF0IG1heSBvciBtYXkgbm90IGhhcHBlbiBpbgogICAgICByZWFsIGxpZmUsIGJ1dCBpcyBzdGlsbCB3b3J0aCBwcm90ZWN0aW5nIGFnYWluc3QiLgoKICAgICAgKGIpIHBjcmVjcHAuY2M6ICJjb3JyZWN0cyBhIGJ1ZyB3aGVuIG5lZ2F0aXZlIHJhZGl4ZXMgYXJlIHVzZWQgd2l0aAogICAgICByZWd1bGFyIGV4cHJlc3Npb25zIi4KCiAgICAgIChjKSBwY3JlX3NjYW5uZXIuY2M6IGF2b2lkIHVzZSBvZiBzdGQ6OmNvdW50KCkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMKICAgICAgaGF2ZSBpdC4KCiAgICAgIChkKSBTcGxpdCBvZmYgcGNyZWNwcGFyZy5oIGZyb20gcGNyZWNwcC5oIGFuZCBoYWQgdGhlIGZvcm1lciBidWlsdCBieQogICAgICAiY29uZmlndXJlIiBhbmQgdGhlIGxhdHRlciBub3QsIGluIG9yZGVyIHRvIGZpeCBhIHByb2JsZW0gc29tZWJvZHkgaGFkCiAgICAgIHdpdGggY29tcGlsaW5nIHRoZSBBcmcgY2xhc3Mgb24gSFAtVVguCgogICAgICAoZSkgSW1wcm92ZSB0aGUgZXJyb3ItaGFuZGxpbmcgb2YgdGhlIEMrKyB3cmFwcGVyIGEgbGl0dGxlIGJpdC4KCiAgICAgIChmKSBOZXcgdGVzdHMgZm9yIGNoZWNraW5nIHJlY3Vyc2lvbiBsaW1pdGluZy4KCiA4LiBUaGUgcGNyZV9tZW1tb3ZlKCkgZnVuY3Rpb24sIHdoaWNoIGlzIHVzZWQgb25seSBpZiB0aGUgZW52aXJvbm1lbnQgZG9lcyBub3QKICAgIGhhdmUgYSBzdGFuZGFyZCBtZW1tb3ZlKCkgZnVuY3Rpb24gKGFuZCBpcyB0aGVyZWZvcmUgcmFyZWx5IGNvbXBpbGVkKSwKICAgIGNvbnRhaW5lZCB0d28gYnVnczogKGEpIHVzZSBvZiBpbnQgaW5zdGVhZCBvZiBzaXplX3QsIGFuZCAoYikgaXQgd2FzIG5vdAogICAgcmV0dXJuaW5nIGEgcmVzdWx0ICh0aG91Z2ggUENSRSBuZXZlciBhY3R1YWxseSB1c2VzIHRoZSByZXN1bHQpLgoKIDkuIEluIHRoZSBQT1NJWCByZWdleGVjKCkgaW50ZXJmYWNlLCBpZiBubWF0Y2ggaXMgc3BlY2lmaWVkIGFzIGEgcmlkaWN1bG91c2x5CiAgICBsYXJnZSBudW1iZXIgLSBncmVhdGVyIHRoYW4gSU5UX01BWC8oMypzaXplb2YoaW50KSkgLSBSRUdfRVNQQUNFIGlzCiAgICByZXR1cm5lZCBpbnN0ZWFkIG9mIGNhbGxpbmcgbWFsbG9jKCkgd2l0aCBhbiBvdmVyZmxvd2luZyBudW1iZXIgdGhhdCB3b3VsZAogICAgbW9zdCBsaWtlbHkgY2F1c2Ugc3Vic2VxdWVudCBjaGFvcy4KCjEwLiBUaGUgZGVidWdnaW5nIG9wdGlvbiBvZiBwY3JldGVzdCB3YXMgbm90IHNob3dpbmcgdGhlIE5PX0FVVE9fQ0FQVFVSRSBmbGFnLgoKMTEuIFRoZSBQT1NJWCBmbGFnIFJFR19OT1NVQiBpcyBub3cgc3VwcG9ydGVkLiBXaGVuIGEgcGF0dGVybiB0aGF0IHdhcyBjb21waWxlZAogICAgd2l0aCB0aGlzIG9wdGlvbiBpcyBtYXRjaGVkLCB0aGUgbm1hdGNoIGFuZCBwbWF0Y2ggb3B0aW9ucyBvZiByZWdleGVjKCkgYXJlCiAgICBpZ25vcmVkLgoKMTIuIEFkZGVkIFJFR19VVEY4IHRvIHRoZSBQT1NJWCBpbnRlcmZhY2UuIFRoaXMgaXMgbm90IGRlZmluZWQgYnkgUE9TSVgsIGJ1dCBpcwogICAgcHJvdmlkZWQgaW4gY2FzZSBhbnlvbmUgd2FudHMgdG8gdGhlIHRoZSBQT1NJWCBpbnRlcmZhY2Ugd2l0aCBVVEYtOAogICAgc3RyaW5ncy4KCjEzLiBBZGRlZCBDWFhMREZMQUdTIHRvIHRoZSBNYWtlZmlsZSBwYXJhbWV0ZXJzIHRvIHByb3ZpZGUgc2V0dGluZ3Mgb25seSBvbiB0aGUKICAgIEMrKyBsaW5raW5nIChuZWVkZWQgZm9yIHNvbWUgSFAtVVggZW52aXJvbm1lbnRzKS4KCjE0LiBBdm9pZCBjb21waWxlciB3YXJuaW5ncyBpbiBnZXRfdWNwbmFtZSgpIHdoZW4gY29tcGlsZWQgd2l0aG91dCBVQ1Agc3VwcG9ydAogICAgKHVudXNlZCBwYXJhbWV0ZXIpIGFuZCBpbiB0aGUgcGNyZV9wcmludGludCgpIGZ1bmN0aW9uIChvbWl0dGVkICJkZWZhdWx0IgogICAgc3dpdGNoIGxhYmVsIHdoZW4gdGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZykuCgoxNS4gQWRkZWQgc29tZSBjb2RlIHRvIG1ha2UgaXQgcG9zc2libGUsIHdoZW4gUENSRSBpcyBjb21waWxlZCBhcyBhIEMrKwogICAgbGlicmFyeSwgdG8gcmVwbGFjZSBzdWJqZWN0IHBvaW50ZXJzIGZvciBwY3JlX2V4ZWMoKSB3aXRoIGEgc21hcnQgcG9pbnRlcgogICAgY2xhc3MsIHRodXMgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHByb2Nlc3MgZGlzY29udGludW91cyBzdHJpbmdzLgoKMTYuIFRoZSB0d28gbWFjcm9zIFBDUkVfRVhQT1JUIGFuZCBQQ1JFX0RBVEFfU0NPUEUgYXJlIGNvbmZ1c2luZywgYW5kIHBlcmZvcm0KICAgIG11Y2ggdGhlIHNhbWUgZnVuY3Rpb24uIFRoZXkgd2VyZSBhZGRlZCBieSBkaWZmZXJlbnQgcGVvcGxlIHdobyB3ZXJlIHRyeWluZwogICAgdG8gbWFrZSBQQ1JFIGVhc3kgdG8gY29tcGlsZSBvbiBub24tVW5peCBzeXN0ZW1zLiBJdCBoYXMgYmVlbiBzdWdnZXN0ZWQKICAgIHRoYXQgUENSRV9FWFBPUlQgYmUgYWJvbGlzaGVkIG5vdyB0aGF0IHRoZXJlIGlzIG1vcmUgYXV0b21hdGljIGFwcGFyYXR1cwogICAgZm9yIGNvbXBpbGluZyBvbiBXaW5kb3dzIHN5c3RlbXMuIEkgaGF2ZSB0aGVyZWZvcmUgcmVwbGFjZWQgaXQgd2l0aAogICAgUENSRV9EQVRBX1NDT1BFLiBUaGlzIGlzIHNldCBhdXRvbWF0aWNhbGx5IGZvciBXaW5kb3dzOyBpZiBub3Qgc2V0IGl0CiAgICBkZWZhdWx0cyB0byAiZXh0ZXJuIiBmb3IgQyBvciAiZXh0ZXJuIEMiIGZvciBDKyssIHdoaWNoIHdvcmtzIGZpbmUgb24KICAgIFVuaXgtbGlrZSBzeXN0ZW1zLiBJdCBpcyBub3cgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlIG9mIFBDUkVfREFUQV8KICAgIFNDT1BFIHdpdGggc29tZXRoaW5nIGV4cGxpY2l0IGluIGNvbmZpZy5oLiBJbiBhZGRpdGlvbjoKCiAgICAoYSkgcGNyZXBvc2l4Lmggc3RpbGwgaGFkIGp1c3QgImV4dGVybiIgaW5zdGVhZCBvZiBlaXRoZXIgb2YgdGhlc2UgbWFjcm9zOwogICAgICAgIEkgaGF2ZSByZXBsYWNlZCBpdCB3aXRoIFBDUkVfREFUQV9TQ09QRS4KCiAgICAoYikgRnVuY3Rpb25zIHN1Y2ggYXMgX3BjcmVfeGNsYXNzKCksIHdoaWNoIGFyZSBpbnRlcm5hbCB0byB0aGUgbGlicmFyeSwKICAgICAgICBidXQgZXh0ZXJuYWwgaW4gdGhlIEMgc2Vuc2UsIGFsbCBoYWQgUENSRV9FWFBPUlQgaW4gdGhlaXIgZGVmaW5pdGlvbnMuCiAgICAgICAgVGhpcyBpcyBhcHBhcmVudGx5IHdyb25nIGZvciB0aGUgV2luZG93cyBjYXNlLCBzbyBJIGhhdmUgcmVtb3ZlZCBpdC4KICAgICAgICAoSXQgbWFrZXMgbm8gZGlmZmVyZW5jZSBvbiBVbml4LWxpa2Ugc3lzdGVtcy4pCgoxNy4gQWRkZWQgYSBuZXcgbGltaXQsIE1BVENIX0xJTUlUX1JFQ1VSU0lPTiwgd2hpY2ggbGltaXRzIHRoZSBkZXB0aCBvZiBuZXN0aW5nCiAgICBvZiByZWN1cnNpdmUgY2FsbHMgdG8gbWF0Y2goKS4gVGhpcyBpcyBkaWZmZXJlbnQgdG8gTUFUQ0hfTElNSVQgYmVjYXVzZQogICAgdGhhdCBsaW1pdHMgdGhlIHRvdGFsIG51bWJlciBvZiBjYWxscyB0byBtYXRjaCgpLCBub3QgYWxsIG9mIHdoaWNoIGluY3JlYXNlCiAgICB0aGUgZGVwdGggb2YgcmVjdXJzaW9uLiBMaW1pdGluZyB0aGUgcmVjdXJzaW9uIGRlcHRoIGxpbWl0cyB0aGUgYW1vdW50IG9mCiAgICBzdGFjayAob3IgaGVhcCBpZiBOT19SRUNVUlNFIGlzIHNldCkgdGhhdCBpcyB1c2VkLiBUaGUgZGVmYXVsdCBjYW4gYmUgc2V0CiAgICB3aGVuIFBDUkUgaXMgY29tcGlsZWQsIGFuZCBjaGFuZ2VkIGF0IHJ1biB0aW1lLiBBIHBhdGNoIGZyb20gR29vZ2xlIGFkZHMKICAgIHRoaXMgZnVuY3Rpb25hbGl0eSB0byB0aGUgQysrIGludGVyZmFjZS4KCjE4LiBDaGFuZ2VzIHRvIHRoZSBoYW5kbGluZyBvZiBVbmljb2RlIGNoYXJhY3RlciBwcm9wZXJ0aWVzOgoKICAgIChhKSBVcGRhdGVkIHRoZSB0YWJsZSB0byBVbmljb2RlIDQuMS4wLgoKICAgIChiKSBSZWNvZ25pemUgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgaW4gdGhlIHRhYmxlIGFzICJDbiIgKHVuZGVmaW5lZCkuCgogICAgKGMpIEkgcmV2aXNlZCB0aGUgd2F5IHRoZSB0YWJsZSBpcyBpbXBsZW1lbnRlZCB0byBhIG11Y2ggaW1wcm92ZWQgZm9ybWF0CiAgICAgICAgd2hpY2ggaW5jbHVkZXMgcmVjb2duaXRpb24gb2YgcmFuZ2VzLiBJdCBub3cgc3VwcG9ydHMgdGhlIHJhbmdlcyB0aGF0CiAgICAgICAgYXJlIGRlZmluZWQgaW4gVW5pY29kZURhdGEudHh0LCBhbmQgaXQgYWxzbyBhbWFsZ2FtYXRlcyBvdGhlcgogICAgICAgIGNoYXJhY3RlcnMgaW50byByYW5nZXMuIFRoaXMgaGFzIHJlZHVjZWQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZQogICAgICAgIHRhYmxlIGZyb20gYXJvdW5kIDE2LDAwMCB0byBhcm91bmQgMywwMDAsIHRodXMgcmVkdWNpbmcgaXRzIHNpemUKICAgICAgICBjb25zaWRlcmFibHkuIEkgcmVhbGl6ZWQgSSBkaWQgbm90IG5lZWQgdG8gdXNlIGEgdHJlZSBzdHJ1Y3R1cmUgYWZ0ZXIKICAgICAgICBhbGwgLSBhIGJpbmFyeSBjaG9wIHNlYXJjaCBpcyBqdXN0IGFzIGVmZmljaWVudC4gSGF2aW5nIHJlZHVjZWQgdGhlCiAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMsIEkgZXh0ZW5kZWQgdGhlaXIgc2l6ZSBmcm9tIDYgYnl0ZXMgdG8gOCBieXRlcyB0bwogICAgICAgIGFsbG93IGZvciBtb3JlIGRhdGEuCgogICAgKGQpIEFkZGVkIHN1cHBvcnQgZm9yIFVuaWNvZGUgc2NyaXB0IG5hbWVzIHZpYSBwcm9wZXJ0aWVzIHN1Y2ggYXMgXHB7SGFufS4KCjE5LiBJbiBVVEYtOCBtb2RlLCBhIGJhY2tzbGFzaCBmb2xsb3dlZCBieSBhIG5vbi1Bc2NpaSBjaGFyYWN0ZXIgd2FzIG5vdAogICAgbWF0Y2hpbmcgdGhhdCBjaGFyYWN0ZXIuCgoyMC4gV2hlbiBtYXRjaGluZyBhIHJlcGVhdGVkIFVuaWNvZGUgcHJvcGVydHkgd2l0aCBhIG1pbmltdW0gZ3JlYXRlciB0aGFuIHplcm8sCiAgICAoZm9yIGV4YW1wbGUgXHBMezIsfSksIFBDUkUgY291bGQgbG9vayBwYXN0IHRoZSBlbmQgb2YgdGhlIHN1YmplY3QgaWYgaXQKICAgIHJlYWNoZWQgaXQgd2hpbGUgc2Vla2luZyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycy4gVGhpcyBjb3VsZAogICAgaGFwcGVuIG9ubHkgaWYgc29tZSBvZiB0aGUgY2hhcmFjdGVycyB3ZXJlIG1vcmUgdGhhbiBvbmUgYnl0ZSBsb25nLCBiZWNhdXNlCiAgICB0aGVyZSBpcyBhIGNoZWNrIGZvciBhdCBsZWFzdCB0aGUgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMuCgoyMS4gUmVmYWN0b3JlZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgXHAgYW5kIFxQIHNvIGFzIHRvIGJlIG1vcmUgZ2VuZXJhbCwgdG8KICAgIGFsbG93IGZvciBtb3JlIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9wZXJ0eSBpbiBmdXR1cmUuIFRoaXMgaGFzIGNoYW5nZWQgdGhlCiAgICBjb21waWxlZCBmb3JtIGluY29tcGF0aWJseS4gQW55Ym9keSB3aXRoIHNhdmVkIGNvbXBpbGVkIHBhdHRlcm5zIHRoYXQgdXNlCiAgICBccCBvciBcUCB3aWxsIGhhdmUgdG8gcmVjb21waWxlIHRoZW0uCgoyMi4gQWRkZWQgIkFueSIgYW5kICJMJiIgdG8gdGhlIHN1cHBvcnRlZCBwcm9wZXJ0eSB0eXBlcy4KCjIzLiBSZWNvZ25pemUgXHh7Li4ufSBhcyBhIGNvZGUgcG9pbnQgc3BlY2lmaWVyLCBldmVuIHdoZW4gbm90IGluIFVURi04IG1vZGUsCiAgICBidXQgZ2l2ZSBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDB4ZmYuCgoyNC4gVGhlIG1hbiBwYWdlcyBmb3IgcGNyZXBhcnRpYWwsIHBjcmVwcmVjb21waWxlLCBhbmQgcGNyZV9jb21waWxlMiB3ZXJlCiAgICBhY2NpZGVudGFsbHkgbm90IGJlaW5nIGluc3RhbGxlZCBvciB1bmluc3RhbGxlZC4KCjI1LiBUaGUgcGNyZS5oIGZpbGUgd2FzIGJ1aWx0IGZyb20gcGNyZS5oLmluLCBidXQgdGhlIG9ubHkgY2hhbmdlcyB0aGF0IHdlcmUKICAgIG1hZGUgd2VyZSB0byBpbnNlcnQgdGhlIGN1cnJlbnQgcmVsZWFzZSBudW1iZXIuIFRoaXMgc2VlbWVkIHNpbGx5LCBiZWNhdXNlCiAgICBpdCBtYWRlIHRoaW5ncyBoYXJkZXIgZm9yIHBlb3BsZSBidWlsZGluZyBQQ1JFIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBydW4KICAgICJjb25maWd1cmUiLiBJIGhhdmUgdHVybmVkIHBjcmUuaCBpbnRvIGEgZGlzdHJpYnV0ZWQgZmlsZSwgbm8gbG9uZ2VyIGJ1aWx0CiAgICBieSAiY29uZmlndXJlIiwgd2l0aCB0aGUgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiBkaXJlY3RseSBpbmNsdWRlZC4gVGhlcmUgaXMKICAgIG5vIGxvbmdlciBhIHBjcmUuaC5pbiBmaWxlLgoKICAgIEhvd2V2ZXIsIHRoaXMgY2hhbmdlIG5lY2Vzc2l0YXRlZCBhIGNoYW5nZSB0byB0aGUgcGNyZS1jb25maWcgc2NyaXB0IGFzCiAgICB3ZWxsLiBJdCBpcyBidWlsdCBmcm9tIHBjcmUtY29uZmlnLmluLCBhbmQgb25lIG9mIHRoZSBzdWJzdGl0dXRpb25zIHdhcyB0aGUKICAgIHJlbGVhc2UgbnVtYmVyLiBJIGhhdmUgdXBkYXRlZCBjb25maWd1cmUuYWMgc28gdGhhdCAuL2NvbmZpZ3VyZSBub3cgZmluZHMKICAgIHRoZSByZWxlYXNlIG51bWJlciBieSBncmVwcGluZyBwY3JlLmguCgoyNi4gQWRkZWQgdGhlIGFiaWxpdHkgdG8gcnVuIHRoZSB0ZXN0cyB1bmRlciB2YWxncmluZC4KCgpWZXJzaW9uIDYuNCAwNS1TZXAtMDUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogMS4gQ2hhbmdlIDYuMC8xMC8obCkgdG8gcGNyZWdyZXAgaW50cm9kdWNlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBzZXBhcmF0b3IgbGluZXMKICAgICItLSIgdG8gYmUgcHJpbnRlZCB3aGVuIG11bHRpcGxlIGZpbGVzIHdlcmUgc2Nhbm5lZCwgZXZlbiB3aGVuIG5vbmUgb2YgdGhlCiAgICAtQSwgLUIsIG9yIC1DIG9wdGlvbnMgd2VyZSB1c2VkLiBUaGlzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggR251IGdyZXAsIHNvIEkKICAgIGNvbnNpZGVyIGl0IHRvIGJlIGEgYnVnLCBhbmQgaGF2ZSByZXN0b3JlZCB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLgoKIDIuIEEgY291cGxlIG9mIGNvZGUgdGlkaWVzIHRvIGdldCByaWQgb2YgY29tcGlsZXIgd2FybmluZ3MuCgogMy4gVGhlIHBjcmV0ZXN0IHByb2dyYW0gdXNlZCB0byBjaGVhdCBieSByZWZlcnJpbmcgdG8gc3ltYm9scyBpbiB0aGUgbGlicmFyeQogICAgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBfcGNyZV8uIFRoZXNlIGFyZSBpbnRlcm5hbCBzeW1ib2xzIHRoYXQgYXJlIG5vdAogICAgcmVhbGx5IHN1cHBvc2VkIHRvIGJlIHZpc2libGUgZXh0ZXJuYWxseSwgYW5kIGluIHNvbWUgZW52aXJvbm1lbnRzIGl0IGlzCiAgICBwb3NzaWJsZSB0byBzdXBwcmVzcyB0aGVtLiBUaGUgY2hlYXRpbmcgaXMgbm93IGNvbmZpbmVkIHRvIGluY2x1ZGluZwogICAgY2VydGFpbiBmaWxlcyBmcm9tIHRoZSBsaWJyYXJ5J3Mgc291cmNlLCB3aGljaCBpcyBhIGJpdCBjbGVhbmVyLgoKIDQuIFJlbmFtZWQgcGNyZS5pbiBhcyBwY3JlLmguaW4gdG8gZ28gd2l0aCBwY3JlY3BwLmguaW47IGl0IGFsc28gbWFrZXMgdGhlCiAgICBmaWxlJ3MgcHVycG9zZSBjbGVhcmVyLgoKIDUuIFJlb3JnYW5pemVkIHBjcmVfdWNwX2ZpbmRjaGFyKCkuCgoKVmVyc2lvbiA2LjMgMTUtQXVnLTA1Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIDEuIFRoZSBmaWxlIGxpYnBjcmUucGMuaW4gZGlkIG5vdCBoYXZlIGdlbmVyYWwgcmVhZCBwZXJtaXNzaW9uIGluIHRoZSB0YXJiYWxsLgoKIDIuIFRoZXJlIHdlcmUgc29tZSBwcm9ibGVtcyB3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgQysrIHN1cHBvcnQ6CgogICAgKGEpIElmIEMrKyBzdXBwb3J0IHdhcyBub3QgYnVpbHQsICJtYWtlIGluc3RhbGwiIGFuZCAibWFrZSB0ZXN0IiBzdGlsbAogICAgICAgIHRyaWVkIHRvIHRlc3QgaXQuCgogICAgKGIpIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2hlbiB0aGUgdmFsdWUgb2YgQ1hYIHdhcyBleHBsaWNpdGx5IHNldC4gU29tZQogICAgICAgIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gdHJ5IHRvIGZpeCB0aGVzZSwgYW5kIC4uLgoKICAgIChjKSAtLWRpc2FibGUtY3BwIGNhbiBub3cgYmUgdXNlZCB0byBleHBsaWNpdGx5IGRpc2FibGUgQysrIHN1cHBvcnQuCgogICAgKGQpIFRoZSB1c2Ugb2YgQENQUF9PQkpAIGRpcmVjdGx5IGNhdXNlZCBhIGJsYW5rIGxpbmUgcHJlY2VkZWQgYnkgYQogICAgICAgIGJhY2tzbGFzaCBpbiBhIHRhcmdldCB3aGVuIEMrKyB3YXMgZGlzYWJsZWQuIFRoaXMgY29uZnVzZXMgc29tZQogICAgICAgIHZlcnNpb25zIG9mICJtYWtlIiwgYXBwYXJlbnRseS4gVXNpbmcgYW4gaW50ZXJtZWRpYXRlIHZhcmlhYmxlIHNvbHZlcwogICAgICAgIHRoaXMuIChTYW1lIGZvciBDUFBfTE9CSi4pCgogMy4gJChMSU5LX0ZPUl9CVUlMRCkgbm93IGluY2x1ZGVzICQoQ0ZMQUdTX0ZPUl9CVUlMRCkgYW5kICQoTElOSykKICAgIChub24tV2luZG93cykgbm93IGluY2x1ZGVzICQoQ0ZMQUdTKSBiZWNhdXNlIHRoZXNlIGZsYWdzIGFyZSBzb21ldGltZXMKICAgIG5lY2Vzc2FyeSBvbiBjZXJ0YWluIGFyY2hpdGVjdHVyZXMuCgogNC4gQWRkZWQgYSBzZXR0aW5nIG9mIC1leHBvcnQtc3ltYm9scy1yZWdleCB0byB0aGUgbGluayBjb21tYW5kIHRvIHJlbW92ZQogICAgdGhvc2Ugc3ltYm9scyB0aGF0IGFyZSBleHBvcnRlZCBpbiB0aGUgQyBzZW5zZSwgYnV0IGFjdHVhbGx5IGFyZSBsb2NhbAogICAgd2l0aGluIHRoZSBsaWJyYXJ5LCBhbmQgbm90IGRvY3VtZW50ZWQuIFRoZWlyIG5hbWVzIGFsbCBiZWdpbiB3aXRoCiAgICAiX3BjcmVfIi4gVGhpcyBpcyBub3QgYSBwZXJmZWN0IGpvYiwgYmVjYXVzZSAoYSkgd2UgaGF2ZSB0byBleGNlcHQgc29tZQogICAgc3ltYm9scyB0aGF0IHBjcmV0ZXN0ICgiaWxsZWdhbGx5IikgdXNlcywgYW5kIChiKSB0aGUgZmFjaWxpdHkgaXNuJ3QgYWx3YXlzCiAgICBhdmFpbGFibGUgKGFuZCBuZXZlciBmb3Igc3RhdGljIGxpYnJhcmllcykuIEkgaGF2ZSBtYWRlIGEgbm90ZSB0byB0cnkgdG8KICAgIGZpbmQgYSB3YXkgcm91bmQgKGEpIGluIHRoZSBmdXR1cmUuCgoKVmVyc2lvbiA2LjIgMDEtQXVnLTA1Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIDEuIFRoZXJlIHdhcyBubyB0ZXN0IGZvciBpbnRlZ2VyIG92ZXJmbG93IG9mIHF1YW50aWZpZXIgdmFsdWVzLiBBIGNvbnN0cnVjdGlvbgogICAgc3VjaCBhcyB7MTExMTExMTExMTExMTExMX0gd291bGQgZ2l2ZSB1bmRlZmluZWQgcmVzdWx0cy4gV2hhdCBpcyB3b3JzZSwgaWYKICAgIGEgbWluaW11bSBxdWFudGlmaWVyIGZvciBhIHBhcmVudGhlc2l6ZWQgc3VicGF0dGVybiBvdmVyZmxvd2VkIGFuZCBiZWNhbWUKICAgIG5lZ2F0aXZlLCB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIG1lbW9yeSBzaXplIHdlbnQgd3JvbmcuIFRoaXMgY291bGQgaGF2ZQogICAgbGVkIHRvIG1lbW9yeSBvdmVyd3JpdGluZy4KCiAyLiBCdWlsZGluZyBQQ1JFIHVzaW5nIFZQQVRIIHdhcyBicm9rZW4uIEhvcGVmdWxseSBpdCBpcyBub3cgZml4ZWQuCgogMy4gQWRkZWQgImIiIHRvIHRoZSAybmQgYXJndW1lbnQgb2YgZm9wZW4oKSBpbiBkZnRhYmxlcy5jLCBmb3Igbm9uLVVuaXgtbGlrZQogICAgb3BlcmF0aW5nIGVudmlyb25tZW50cyB3aGVyZSB0aGlzIG1hdHRlcnMuCgogNC4gQXBwbGllZCBHaXVzZXBwZSBNYXhpYSdzIHBhdGNoIHRvIGFkZCBhZGRpdGlvbmFsIGZlYXR1cmVzIGZvciBjb250cm9sbGluZwogICAgUENSRSBvcHRpb25zIGZyb20gd2l0aGluIHRoZSBDKysgd3JhcHBlci4KCiA1LiBOYW1lZCBjYXB0dXJpbmcgc3VicGF0dGVybnMgd2VyZSBub3QgYmVpbmcgY29ycmVjdGx5IGNvdW50ZWQgd2hlbiBhIHBhdHRlcm4KICAgIHdhcyBjb21waWxlZC4gVGhpcyBjYXVzZWQgdHdvIHByb2JsZW1zOiAoYSkgSWYgdGhlcmUgd2VyZSBtb3JlIHRoYW4gMTAwCiAgICBzdWNoIHN1YnBhdHRlcm5zLCB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIG1lbW9yeSBuZWVkZWQgZm9yIHRoZSB3aG9sZQogICAgY29tcGlsZWQgcGF0dGVybiB3ZW50IHdyb25nLCBsZWFkaW5nIHRvIGFuIG92ZXJmbG93IGVycm9yLiAoYikgTnVtZXJpY2FsCiAgICBiYWNrIHJlZmVyZW5jZXMgb2YgdGhlIGZvcm0gXDEyLCB3aGVyZSB0aGUgbnVtYmVyIHdhcyBncmVhdGVyIHRoYW4gOSwgd2VyZQogICAgbm90IHJlY29nbml6ZWQgYXMgYmFjayByZWZlcmVuY2VzLCBldmVuIHRob3VnaCB0aGVyZSB3ZXJlIHN1ZmZpY2llbnQKICAgIHByZXZpb3VzIHN1YnBhdHRlcm5zLgoKIDYuIFR3byBtaW5vciBwYXRjaGVzIHRvIHBjcmVjcHAuY2MgaW4gb3JkZXIgdG8gYWxsb3cgaXQgdG8gY29tcGlsZSBvbiBvbGRlcgogICAgdmVyc2lvbnMgb2YgZ2NjLCBlLmcuIDIuOTUuNC4KCgpWZXJzaW9uIDYuMSAyMS1KdW4tMDUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogMS4gVGhlcmUgd2FzIG9uZSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlICJwb3NpeCIgaW4gcGNyZXRlc3QuYyB0aGF0IHdhcyBub3QKICAgIHN1cnJvdW5kZWQgYnkgIiNpZiAhZGVmaW5lZCBOT1BPU0lYIi4KCiAyLiBNYWtlIGl0IHBvc3NpYmxlIHRvIGNvbXBpbGUgcGNyZXRlc3Qgd2l0aG91dCBERkEgc3VwcG9ydCwgVVRGOCBzdXBwb3J0LCBvcgogICAgdGhlIGNyb3NzLWNoZWNrIG9uIHRoZSBvbGQgcGNyZV9pbmZvKCkgZnVuY3Rpb24sIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUKICAgIGN1dC1kb3duIHZlcnNpb24gb2YgUENSRSB0aGF0IGlzIGN1cnJlbnRseSBpbXBvcnRlZCBpbnRvIEV4aW0uCgogMy4gQSAoc2lsbHkpIHBhdHRlcm4gc3RhcnRpbmcgd2l0aCAoP2kpKD8taSkgY2F1c2VkIGFuIGludGVybmFsIHNwYWNlCiAgICBhbGxvY2F0aW9uIGVycm9yLiBJJ3ZlIGRvbmUgdGhlIGVhc3kgZml4LCB3aGljaCB3YXN0ZXMgMiBieXRlcyBmb3Igc2Vuc2libGUKICAgIHBhdHRlcm5zIHRoYXQgc3RhcnQgKD9pKSBidXQgSSBkb24ndCB0aGluayB0aGF0IG1hdHRlcnMuIFRoZSB1c2Ugb2YgKD9pKSBpcwogICAganVzdCBhbiBleGFtcGxlOyB0aGlzIGFsbCBhcHBsaWVzIHRvIHRoZSBvdGhlciBvcHRpb25zIGFzIHdlbGwuCgogNC4gU2luY2UgbGlidG9vbCBzZWVtcyB0byBlY2hvIHRoZSBjb21waWxlIGNvbW1hbmRzIGl0IGlzIGlzc3VpbmcsIHRoZSBvdXRwdXQKICAgIGZyb20gIm1ha2UiIGNhbiBiZSByZWR1Y2VkIGEgYml0IGJ5IHB1dHRpbmcgIkAiIGluIGZyb250IG9mIGVhY2ggbGlidG9vbAogICAgY29tcGlsZSBjb21tYW5kLgoKIDUuIFBhdGNoIGZyb20gdGhlIGZvbGtzIGF0IEdvb2dsZSBmb3IgY29uZmlndXJlLmluIHRvIGJlIGEgYml0IG1vcmUgdGhvcm91Z2gKICAgIGluIGNoZWNraW5nIGZvciBhIHN1aXRhYmxlIEMrKyBpbnN0YWxsYXRpb24gYmVmb3JlIHRyeWluZyB0byBjb21waWxlIHRoZQogICAgQysrIHN0dWZmLiBUaGlzIHNob3VsZCBmaXggYSByZXBvcnRlZCBwcm9ibGVtIHdoZW4gYSBjb21waWxlciB3YXMgcHJlc2VudCwKICAgIGJ1dCBubyBzdWl0YWJsZSBoZWFkZXJzLgoKIDYuIFRoZSBtYW4gcGFnZXMgYWxsIGhhZCBqdXN0ICJQQ1JFIiBhcyB0aGVpciB0aXRsZS4gSSBoYXZlIGNoYW5nZWQgdGhlbSB0bwogICAgYmUgdGhlIHJlbGV2YW50IGZpbGUgbmFtZS4gSSBoYXZlIGFsc28gYXJyYW5nZWQgdGhhdCB0aGVzZSBuYW1lcyBhcmUKICAgIHJldGFpbmVkIGluIHRoZSBmaWxlIGRvYy9wY3JlLnR4dCwgd2hpY2ggaXMgYSBjb25jYXRlbmF0aW9uIGluIHRleHQgZm9ybWF0CiAgICBvZiBhbGwgdGhlIG1hbiBwYWdlcyBleGNlcHQgdGhlIGxpdHRsZSBpbmRpdmlkdWFsIG9uZXMgZm9yIGVhY2ggZnVuY3Rpb24uCgogNy4gVGhlIE5PTi1VTklYLVVTRSBmaWxlIGhhZCBub3QgYmVlbiB1cGRhdGVkIGZvciB0aGUgZGlmZmVyZW50IHNldCBvZiBzb3VyY2UKICAgIGZpbGVzIHRoYXQgY29tZSB3aXRoIHJlbGVhc2UgNi4gSSBhbHNvIGFkZGVkIGEgZmV3IGNvbW1lbnRzIGFib3V0IHRoZSBDKysKICAgIHdyYXBwZXIuCgoKVmVyc2lvbiA2LjAgMDctSnVuLTA1Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIDEuIFNvbWUgbWlub3IgaW50ZXJuYWwgcmUtb3JnYW5pemF0aW9uIHRvIGhlbHAgd2l0aCBteSBERkEgZXhwZXJpbWVudHMuCgogMi4gU29tZSBtaXNzaW5nICNpZmRlZiBTVVBQT1JUX1VDUCBjb25kaXRpb25hbHMgaW4gcGNyZXRlc3QgYW5kIHByaW50aW50IHRoYXQKICAgIGRpZG4ndCBtYXR0ZXIgZm9yIHRoZSBsaWJyYXJ5IGl0c2VsZiB3aGVuIGZ1bGx5IGNvbmZpZ3VyZWQsIGJ1dCBkaWQgbWF0dGVyCiAgICB3aGVuIGNvbXBpbGluZyB3aXRob3V0IFVDUCBzdXBwb3J0LCBvciB3aXRoaW4gRXhpbSwgd2hlcmUgdGhlIHVjcCBmaWxlcyBhcmUKICAgIG5vdCBpbXBvcnRlZC4KCiAzLiBSZWZhY3RvcmluZyBvZiB0aGUgbGlicmFyeSBjb2RlIHRvIHNwbGl0IHVwIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBpbnRvCiAgICBkaWZmZXJlbnQgc291cmNlIG1vZHVsZXMuIFRoZSBhZGRpdGlvbiBvZiB0aGUgbmV3IERGQSBtYXRjaGluZyBjb2RlIChzZWUKICAgIGJlbG93KSB0byBhIHNpbmdsZSBtb25vbGl0aGljIHNvdXJjZSB3b3VsZCBoYXZlIG1hZGUgaXQgcmVhbGx5IHRvbwogICAgdW53aWVsZHksIHF1aXRlIGFwYXJ0IGZyb20gY2F1c2luZyBhbGwgdGhlIGNvZGUgdG8gYmUgaW5jbHVkZSBpbiBhCiAgICBzdGF0aWNhbGx5IGxpbmtlZCBhcHBsaWNhdGlvbiwgd2hlbiBvbmx5IHNvbWUgZnVuY3Rpb25zIGFyZSB1c2VkLiBUaGlzIGlzCiAgICByZWxldmFudCBldmVuIHdpdGhvdXQgdGhlIERGQSBhZGRpdGlvbiBub3cgdGhhdCBwYXR0ZXJucyBjYW4gYmUgY29tcGlsZWQgaW4KICAgIG9uZSBhcHBsaWNhdGlvbiBhbmQgbWF0Y2hlZCBpbiBhbm90aGVyLgoKICAgIFRoZSBkb3duc2lkZSBvZiBzcGxpdHRpbmcgdXAgaXMgdGhhdCB0aGVyZSBoYXZlIHRvIGJlIHNvbWUgZXh0ZXJuYWwKICAgIGZ1bmN0aW9ucyBhbmQgZGF0YSB0YWJsZXMgdGhhdCBhcmUgdXNlZCBpbnRlcm5hbGx5IGluIGRpZmZlcmVudCBtb2R1bGVzIG9mCiAgICB0aGUgbGlicmFyeSBidXQgd2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSBBUEkuIFRoZXNlIGhhdmUgYWxsIGhhZCB0aGVpcgogICAgbmFtZXMgY2hhbmdlZCB0byBzdGFydCB3aXRoICJfcGNyZV8iIHNvIHRoYXQgdGhleSBhcmUgdW5saWtlbHkgdG8gY2xhc2gKICAgIHdpdGggb3RoZXIgZXh0ZXJuYWwgbmFtZXMuCgogNC4gQWRkZWQgYW4gYWx0ZXJuYXRlIG1hdGNoaW5nIGZ1bmN0aW9uLCBwY3JlX2RmYV9leGVjKCksIHdoaWNoIG1hdGNoZXMgdXNpbmcKICAgIGEgZGlmZmVyZW50IChERkEpIGFsZ29yaXRobS4gQWx0aG91Z2ggaXQgaXMgc2xvd2VyIHRoYW4gdGhlIG9yaWdpbmFsCiAgICBmdW5jdGlvbiwgaXQgZG9lcyBoYXZlIHNvbWUgYWR2YW50YWdlcyBmb3IgY2VydGFpbiB0eXBlcyBvZiBtYXRjaGluZwogICAgcHJvYmxlbS4KCiA1LiBVcGdyYWRlcyB0byBwY3JldGVzdCBpbiBvcmRlciB0byB0ZXN0IHRoZSBmZWF0dXJlcyBvZiBwY3JlX2RmYV9leGVjKCksCiAgICBpbmNsdWRpbmcgcmVzdGFydGluZyBhZnRlciBhIHBhcnRpYWwgbWF0Y2guCgogNi4gQSBwYXRjaCBmb3IgcGNyZWdyZXAgdGhhdCBkZWZpbmVzIElOVkFMSURfRklMRV9BVFRSSUJVVEVTIGlmIGl0IGlzIG5vdAogICAgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyBmb3IgV2luZG93cyB3YXMgc2VudCB0byBtZS4gSSBoYXZlIHB1dCBpdCBpbnRvIHRoZQogICAgY29kZSwgdGhvdWdoIEkgaGF2ZSBubyBtZWFucyBvZiB0ZXN0aW5nIG9yIHZlcmlmeWluZyBpdC4KCiA3LiBBZGRlZCB0aGUgcGNyZV9yZWZjb3VudCgpIGF1eGlsaWFyeSBmdW5jdGlvbi4KCiA4LiBBZGRlZCB0aGUgUENSRV9GSVJTVExJTkUgb3B0aW9uLiBUaGlzIGNvbnN0cmFpbnMgYW4gdW5hbmNob3JlZCBwYXR0ZXJuIHRvCiAgICBtYXRjaCBiZWZvcmUgb3IgYXQgdGhlIGZpcnN0IG5ld2xpbmUgaW4gdGhlIHN1YmplY3Qgc3RyaW5nLiBJbiBwY3JldGVzdCwKICAgIHRoZSAvZiBvcHRpb24gb24gYSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHNldCB0aGlzLgoKIDkuIEEgcmVwZWF0ZWQgXHcgd2hlbiB1c2VkIGluIFVURi04IG1vZGUgd2l0aCBjaGFyYWN0ZXJzIGdyZWF0ZXIgdGhhbiAyNTYKICAgIHdvdWxkIGJlaGF2ZSB3cm9uZ2x5LiBUaGlzIGhhcyBiZWVuIHByZXNlbnQgaW4gUENSRSBzaW5jZSByZWxlYXNlIDQuMC4KCjEwLiBBIG51bWJlciBvZiBjaGFuZ2VzIHRvIHRoZSBwY3JlZ3JlcCBjb21tYW5kOgoKICAgIChhKSBSZWZhY3RvcmVkIGhvdyAteCB3b3JrczsgaW5zZXJ0IF4oLi4uKSQgaW5zdGVhZCBvZiBzZXR0aW5nCiAgICAgICAgUENSRV9BTkNIT1JFRCBhbmQgY2hlY2tpbmcgdGhlIGxlbmd0aCwgaW4gcHJlcGFyYXRpb24gZm9yIGFkZGluZwogICAgICAgIHNvbWV0aGluZyBzaW1pbGFyIGZvciAtdy4KCiAgICAoYikgQWRkZWQgdGhlIC13IChtYXRjaCBhcyBhIHdvcmQpIG9wdGlvbi4KCiAgICAoYykgUmVmYWN0b3JlZCB0aGUgd2F5IGxpbmVzIGFyZSByZWFkIGFuZCBidWZmZXJlZCBzbyBhcyB0byBoYXZlIG1vcmUKICAgICAgICB0aGFuIG9uZSBhdCBhIHRpbWUgYXZhaWxhYmxlLgoKICAgIChkKSBJbXBsZW1lbnRlZCBhIHBjcmVncmVwIHRlc3Qgc2NyaXB0LgoKICAgIChlKSBBZGRlZCB0aGUgLU0gKG11bHRpbGluZSBtYXRjaCkgb3B0aW9uLiBUaGlzIGFsbG93cyBwYXR0ZXJucyB0byBtYXRjaAogICAgICAgIG92ZXIgc2V2ZXJhbCBsaW5lcyBvZiB0aGUgc3ViamVjdC4gVGhlIGJ1ZmZlcmluZyBlbnN1cmVzIHRoYXQgYXQgbGVhc3QKICAgICAgICA4Sywgb3IgdGhlIHJlc3Qgb2YgdGhlIGRvY3VtZW50ICh3aGljaGV2ZXIgaXMgdGhlIHNob3J0ZXIpIGlzIGF2YWlsYWJsZQogICAgICAgIGZvciBtYXRjaGluZyAoYW5kIHNpbWlsYXJseSB0aGUgcHJldmlvdXMgOEsgZm9yIGxvb2tiZWhpbmQgYXNzZXJ0aW9ucykuCgogICAgKGYpIENoYW5nZWQgdGhlIC0taGVscCBvdXRwdXQgc28gdGhhdCBpdCBub3cgc2F5cwoKICAgICAgICAgIC13LCAtLXdvcmQtcmVnZXgocCkKCiAgICAgICAgaW5zdGVhZCBvZiB0d28gbGluZXMsIG9uZSB3aXRoICJyZWdleCIgYW5kIHRoZSBvdGhlciB3aXRoICJyZWdleHAiCiAgICAgICAgYmVjYXVzZSB0aGF0IGNvbmZ1c2VkIGF0IGxlYXN0IG9uZSBwZXJzb24gc2luY2UgdGhlIHNob3J0IGZvcm1zIGFyZSB0aGUKICAgICAgICBzYW1lLiAoVGhpcyByZXF1aXJlZCBhIGJpdCBvZiBjb2RlLCBhcyB0aGUgb3V0cHV0IGlzIGdlbmVyYXRlZAogICAgICAgIGF1dG9tYXRpY2FsbHkgZnJvbSBhIHRhYmxlLiBJdCB3YXNuJ3QganVzdCBhIHRleHQgY2hhbmdlLikKCiAgICAoZykgLS0gY2FuIGJlIHVzZWQgdG8gdGVybWluYXRlIHBjcmVncmVwIG9wdGlvbnMgaWYgdGhlIG5leHQgdGhpbmcgaXNuJ3QgYW4KICAgICAgICBvcHRpb24gYnV0IHN0YXJ0cyB3aXRoIGEgaHlwaGVuLiBDb3VsZCBiZSBhIHBhdHRlcm4gb3IgYSBwYXRoIG5hbWUKICAgICAgICBzdGFydGluZyB3aXRoIGEgaHlwaGVuLCBmb3IgaW5zdGFuY2UuCgogICAgKGgpICItIiBjYW4gYmUgZ2l2ZW4gYXMgYSBmaWxlIG5hbWUgdG8gcmVwcmVzZW50IHN0ZGluLgoKICAgIChpKSBXaGVuIGZpbGUgbmFtZXMgYXJlIGJlaW5nIHByaW50ZWQsICIoc3RhbmRhcmQgaW5wdXQpIiBpcyB1c2VkIGZvcgogICAgICAgIHRoZSBzdGFuZGFyZCBpbnB1dCwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBHTlUgZ3JlcC4gUHJldmlvdXNseQogICAgICAgICI8c3RkaW4+IiB3YXMgdXNlZC4KCiAgICAoaikgVGhlIG9wdGlvbiAtLWxhYmVsPXh4eCBjYW4gYmUgdXNlZCB0byBzdXBwbHkgYSBuYW1lIHRvIGJlIHVzZWQgZm9yCiAgICAgICAgc3RkaW4gd2hlbiBmaWxlIG5hbWVzIGFyZSBiZWluZyBwcmludGVkLiBUaGVyZSBpcyBubyBzaG9ydCBmb3JtLgoKICAgIChrKSBSZS1mYWN0b3JlZCB0aGUgb3B0aW9ucyBkZWNvZGluZyBsb2dpYyBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBhZGQKICAgICAgICB0d28gbW9yZSBvcHRpb25zIHRoYXQgdGFrZSBkYXRhLiBTdWNoIG9wdGlvbnMgY2FuIG5vdyBiZSBnaXZlbiBpbiBmb3VyCiAgICAgICAgZGlmZmVyZW50IHdheXMsIGUuZy4gIi1mbmFtZSIsICItZiBuYW1lIiwgIi0tZmlsZT1uYW1lIiwgIi0tZmlsZSBuYW1lIi4KCiAgICAobCkgQWRkZWQgdGhlIC1BLCAtQiwgYW5kIC1DIG9wdGlvbnMgZm9yIHJlcXVlc3RpbmcgdGhhdCBsaW5lcyBvZiBjb250ZXh0CiAgICAgICAgYXJvdW5kIG1hdGNoZXMgYmUgcHJpbnRlZC4KCiAgICAobSkgQWRkZWQgdGhlIC1MIG9wdGlvbiB0byBwcmludCB0aGUgbmFtZXMgb2YgZmlsZXMgdGhhdCBkbyBub3QgY29udGFpbgogICAgICAgIGFueSBtYXRjaGluZyBsaW5lcywgdGhhdCBpcywgdGhlIGNvbXBsZW1lbnQgb2YgLWwuCgogICAgKG4pIFRoZSByZXR1cm4gY29kZSBpcyAyIGlmIGFueSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQsIGJ1dCBwY3JlZ3JlcCBkb2VzCiAgICAgICAgY29udGludWUgdG8gc2NhbiBvdGhlciBmaWxlcy4KCiAgICAobykgVGhlIC1zIG9wdGlvbiB3YXMgaW5jb3JyZWN0bHkgaW1wbGVtZW50ZWQuIEZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKICAgICAgICBncmVwcywgaXQgbm93IHN1cHByZXNzZXMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIGEgbm9uLWV4aXN0ZW50IG9yIG5vbi0KICAgICAgICBhY2Nlc3NpYmxlIGZpbGUgKGJ1dCBub3QgdGhlIHJldHVybiBjb2RlKS4gVGhlcmUgaXMgYSBuZXcgb3B0aW9uIGNhbGxlZAogICAgICAgIC1xIHRoYXQgc3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIG1hdGNoaW5nIGxpbmVzLCB3aGljaCB3YXMgd2hhdCAtcyB3YXMKICAgICAgICBwcmV2aW91c2x5IGRvaW5nLgoKICAgIChwKSBBZGRlZCAtLWluY2x1ZGUgYW5kIC0tZXhjbHVkZSBvcHRpb25zIHRvIHNwZWNpZnkgZmlsZXMgZm9yIGluY2x1c2lvbgogICAgICAgIGFuZCBleGNsdXNpb24gd2hlbiByZWN1cnNpbmcuCgoxMS4gVGhlIE1ha2VmaWxlIHdhcyBub3QgdXNpbmcgdGhlIEF1dG9jb25mLXN1cHBvcnRlZCBMREZMQUdTIG1hY3JvIHByb3Blcmx5LgogICAgSG9wZWZ1bGx5LCBpdCBub3cgZG9lcy4KCjEyLiBNaXNzaW5nIGNhc3QgaW4gcGNyZV9zdHVkeSgpLgoKMTMuIEFkZGVkIGFuICJ1bmluc3RhbGwiIHRhcmdldCB0byB0aGUgbWFrZWZpbGUuCgoxNC4gUmVwbGFjZWQgImV4dGVybiIgaW4gdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgaW4gTWFrZWZpbGUuaW4gd2l0aAogICAgIlBDUkVfREFUQV9TQ09QRSIsIHdoaWNoIGRlZmF1bHRzIHRvICdleHRlcm4nIG9yICdleHRlcm4gIkMiJyBpbiB0aGUgVW5peAogICAgd29ybGQsIGJ1dCBpcyBzZXQgZGlmZmVyZW50bHkgZm9yIFdpbmRvd3MuCgoxNS4gQWRkZWQgYSBzZWNvbmQgY29tcGlsaW5nIGZ1bmN0aW9uIGNhbGxlZCBwY3JlX2NvbXBpbGUyKCkuIFRoZSBvbmx5CiAgICBkaWZmZXJlbmNlIGlzIHRoYXQgaXQgaGFzIGFuIGV4dHJhIGFyZ3VtZW50LCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gYW4KICAgIGludGVnZXIgZXJyb3IgY29kZS4gV2hlbiB0aGVyZSBpcyBhIGNvbXBpbGUtdGltZSBmYWlsdXJlLCB0aGlzIGlzIHNldAogICAgbm9uLXplcm8sIGluIGFkZGl0aW9uIHRvIHRoZSBlcnJvciB0ZXN0IHBvaW50ZXIgYmVpbmcgc2V0IHRvIHBvaW50IHRvIGFuCiAgICBlcnJvciBtZXNzYWdlLiBUaGUgbmV3IGFyZ3VtZW50IG1heSBiZSBOVUxMIGlmIG5vIGVycm9yIG51bWJlciBpcyByZXF1aXJlZAogICAgKGJ1dCB0aGVuIHlvdSBtYXkgYXMgd2VsbCBjYWxsIHBjcmVfY29tcGlsZSgpLCB3aGljaCBpcyBub3cganVzdCBhCiAgICB3cmFwcGVyKS4gVGhpcyBmYWNpbGl0eSBpcyBwcm92aWRlZCBiZWNhdXNlIHNvbWUgYXBwbGljYXRpb25zIG5lZWQgYQogICAgbnVtZXJpYyBlcnJvciBpbmRpY2F0aW9uLCBidXQgaXQgaGFzIGFsc28gZW5hYmxlZCBtZSB0byB0aWR5IHVwIHRoZSB3YXkKICAgIGNvbXBpbGUtdGltZSBlcnJvcnMgYXJlIGhhbmRsZWQgaW4gdGhlIFBPU0lYIHdyYXBwZXIuCgoxNi4gQWRkZWQgVlBBVEg9LmxpYnMgdG8gdGhlIG1ha2VmaWxlOyB0aGlzIHNob3VsZCBoZWxwIHdoZW4gYnVpbGRpbmcgd2l0aCBvbmUKICAgIHByZWZpeCBwYXRoIGFuZCBpbnN0YWxsaW5nIHdpdGggYW5vdGhlci4gKE9yIHNvIEknbSB0b2xkIGJ5IHNvbWVvbmUgd2hvCiAgICBrbm93cyBtb3JlIGFib3V0IHRoaXMgc3R1ZmYgdGhhbiBJIGRvLikKCjE3LiBBZGRlZCBhIG5ldyBvcHRpb24sIFJFR19ET1RBTEwsIHRvIHRoZSBQT1NJWCBmdW5jdGlvbiByZWdjb21wKCkuIFRoaXMKICAgIHBhc3NlcyBQQ1JFX0RPVEFMTCB0byB0aGUgcGNyZV9jb21waWxlKCkgZnVuY3Rpb24sIG1ha2luZyB0aGUgIi4iIGNoYXJhY3RlcgogICAgbWF0Y2ggZXZlcnl0aGluZywgaW5jbHVkaW5nIG5ld2xpbmVzLiBUaGlzIGlzIG5vdCBQT1NJWC1jb21wYXRpYmxlLCBidXQKICAgIHNvbWVib2R5IHdhbnRlZCB0aGUgZmVhdHVyZS4gRnJvbSBwY3JldGVzdCBpdCBjYW4gYmUgYWN0aXZhdGVkIGJ5IHVzaW5nCiAgICBib3RoIHRoZSBQIGFuZCB0aGUgcyBmbGFncy4KCjE4LiBBQ19QUk9HX0xJQlRPT0wgYXBwZWFyZWQgdHdpY2UgaW4gTWFrZWZpbGUuaW4uIFJlbW92ZWQgb25lLgoKMTkuIGxpYnBjcmUucGMgd2FzIGJlaW5nIGluY29ycmVjdGx5IGluc3RhbGxlZCBhcyBleGVjdXRhYmxlLgoKMjAuIEEgY291cGxlIG9mIHBsYWNlcyBpbiBwY3JldGVzdCBjaGVjayBmb3IgZW5kLW9mLWxpbmUgYnkgbG9va2luZyBmb3IgJ1xuJzsKICAgIGl0IG5vdyBhbHNvIGxvb2tzIGZvciAnXHInIHNvIHRoYXQgaXQgd2lsbCB3b3JrIHVubW9kaWZpZWQgb24gV2luZG93cy4KCjIxLiBBZGRlZCBHb29nbGUncyBjb250cmlidXRlZCBDKysgd3JhcHBlciB0byB0aGUgZGlzdHJpYnV0aW9uLgoKMjIuIEFkZGVkIHNvbWUgdW50aWR5IG1pc3NpbmcgbWVtb3J5IGZyZWUoKSBjYWxscyBpbiBwY3JldGVzdCwgdG8ga2VlcAogICAgRWxlY3RyaWMgRmVuY2UgaGFwcHkgd2hlbiB0ZXN0aW5nLgoKCgpWZXJzaW9uIDUuMCAxMy1TZXAtMDQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogMS4gSW50ZXJuYWwgY2hhbmdlOiBsaXRlcmFsIGNoYXJhY3RlcnMgYXJlIG5vIGxvbmdlciBwYWNrZWQgdXAgaW50byBpdGVtcwogICAgY29udGFpbmluZyBtdWx0aXBsZSBjaGFyYWN0ZXJzIGluIGEgc2luZ2xlIGJ5dGUtc3RyaW5nLiBFYWNoIGNoYXJhY3RlcgogICAgaXMgbm93IG1hdGNoZWQgdXNpbmcgYSBzZXBhcmF0ZSBvcGNvZGUuIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lCiAgICBieXRlIGluIHRoZSBjaGFyYWN0ZXIgaW4gVVRGLTggbW9kZS4KCiAyLiBUaGUgcGNyZV9jYWxsb3V0X2Jsb2NrIHN0cnVjdHVyZSBoYXMgdHdvIG5ldyBmaWVsZHM6IHBhdHRlcm5fcG9zaXRpb24gYW5kCiAgICBuZXh0X2l0ZW1fbGVuZ3RoLiBUaGVzZSBjb250YWluIHRoZSBvZmZzZXQgaW4gdGhlIHBhdHRlcm4gdG8gdGhlIG5leHQgbWF0Y2gKICAgIGl0ZW0sIGFuZCBpdHMgbGVuZ3RoLCByZXNwZWN0aXZlbHkuCgogMy4gVGhlIFBDUkVfQVVUT19DQUxMT1VUIG9wdGlvbiBmb3IgcGNyZV9jb21waWxlKCkgcmVxdWVzdHMgdGhlIGF1dG9tYXRpYwogICAgaW5zZXJ0aW9uIG9mIGNhbGxvdXRzIGJlZm9yZSBlYWNoIHBhdHRlcm4gaXRlbS4gQWRkZWQgdGhlIC9DIG9wdGlvbiB0bwogICAgcGNyZXRlc3QgdG8gbWFrZSB1c2Ugb2YgdGhpcy4KCiA0LiBPbiB0aGUgYWR2aWNlIG9mIGEgV2luZG93cyB1c2VyLCB0aGUgbGluZXMKCiAgICAgICNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChXSU4zMikKICAgICAgX3NldG1vZGUoIF9maWxlbm8oIHN0ZG91dCApLCAweDgwMDAgKTsKICAgICAgI2VuZGlmICAvKiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChXSU4zMikgKi8KCiAgICBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHNvdXJjZSBvZiBwY3JldGVzdC4gVGhpcyBhcHBhcmVudGx5IGRvZXMgdXNlZnVsCiAgICBtYWdpYyBpbiByZWxhdGlvbiB0byBsaW5lIHRlcm1pbmF0b3JzLgoKIDUuIENoYW5nZWQgInIiIGFuZCAidyIgaW4gdGhlIGNhbGxzIHRvIGZvcGVuKCkgaW4gcGNyZXRlc3QgdG8gInJiIiBhbmQgIndiIgogICAgZm9yIHRoZSBiZW5lZml0IG9mIHRob3NlIGVudmlyb25tZW50cyB3aGVyZSB0aGUgImIiIG1ha2VzIGEgZGlmZmVyZW5jZS4KCiA2LiBUaGUgaWNjIGNvbXBpbGVyIGhhcyB0aGUgc2FtZSBvcHRpb25zIGFzIGdjYywgYnV0ICJjb25maWd1cmUiIGRvZXNuJ3Qgc2VlbQogICAgdG8ga25vdyBhYm91dCBpdC4gSSBoYXZlIHB1dCBhIGhhY2sgaW50byBjb25maWd1cmUuaW4gdGhhdCBhZGRzIGluIGNvZGUKICAgIHRvIHNldCBHQ0M9eWVzIGlmIENDPWljYy4gVGhpcyBzZWVtcyB0byBlbmQgdXAgYXQgYSBwb2ludCBpbiB0aGUKICAgIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0IHRoYXQgaXMgZWFybHkgZW5vdWdoIHRvIGFmZmVjdCB0aGUgc2V0dGluZyBvZgogICAgY29tcGlsZXIgb3B0aW9ucywgd2hpY2ggaXMgd2hhdCBpcyBuZWVkZWQsIGJ1dCBJIGhhdmUgbm8gbWVhbnMgb2YgdGVzdGluZwogICAgd2hldGhlciBpdCByZWFsbHkgd29ya3MuIChUaGUgdXNlciB3aG8gcmVwb3J0ZWQgdGhpcyBoYWQgcGF0Y2hlZCB0aGUKICAgIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0LCB3aGljaCBvZiBjb3Vyc2UgSSBjYW5ub3QgZG8uKQoKICAgIExBVEVSOiBBZnRlciBjaGFuZ2UgMjIgYmVsb3cgKG5ldyBsaWJ0b29sIGZpbGVzKSwgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICAgIHNlZW1zIHRvIGtub3cgYWJvdXQgaWNjIChhbmQgYWxzbyBlY2MpLiBUaGVyZWZvcmUsIEkgaGF2ZSBjb21tZW50ZWQgb3V0CiAgICB0aGlzIGhhY2sgaW4gY29uZmlndXJlLmluLgoKIDcuIEFkZGVkIHN1cHBvcnQgZm9yIHBrZy1jb25maWcgKDIgcGF0Y2hlcyB3ZXJlIHNlbnQgaW4pLgoKIDguIE5lZ2F0ZWQgUE9TSVggY2hhcmFjdGVyIGNsYXNzZXMgdGhhdCB1c2VkIGEgY29tYmluYXRpb24gb2YgaW50ZXJuYWwgdGFibGVzCiAgICB3ZXJlIGNvbXBsZXRlbHkgYnJva2VuLiBUaGVzZSB3ZXJlIFtbOl5hbHBoYTpdXSwgW1s6XmFsbnVtOl1dLCBhbmQKICAgIFtbOl5hc2NpaV1dLiBUeXBpY2FsbHksIHRoZXkgd291bGQgbWF0Y2ggYWxtb3N0IGFueSBjaGFyYWN0ZXJzLiBUaGUgb3RoZXIKICAgIFBPU0lYIGNsYXNzZXMgd2VyZSBub3QgYnJva2VuIGluIHRoaXMgd2F5LgoKIDkuIE1hdGNoaW5nIHRoZSBwYXR0ZXJuICJcYi4qPyIgYWdhaW5zdCAiYWIgY2QiLCBzdGFydGluZyBhdCBvZmZzZXQgMSwgZmFpbGVkCiAgICB0byBmaW5kIHRoZSBtYXRjaCwgYXMgUENSRSB3YXMgZGVsdWRlZCBpbnRvIHRoaW5raW5nIHRoYXQgdGhlIG1hdGNoIGhhZCB0bwogICAgc3RhcnQgYXQgdGhlIHN0YXJ0IHBvaW50IG9yIGZvbGxvd2luZyBhIG5ld2xpbmUuIFRoZSBzYW1lIGJ1ZyBhcHBsaWVkIHRvCiAgICBwYXR0ZXJucyB3aXRoIG5lZ2F0aXZlIGZvcndhcmQgYXNzZXJ0aW9ucyBvciBhbnkgYmFja3dhcmQgYXNzZXJ0aW9ucwogICAgcHJlY2VkaW5nICIuKiIgYXQgdGhlIHN0YXJ0LCB1bmxlc3MgdGhlIHBhdHRlcm4gcmVxdWlyZWQgYSBmaXhlZCBmaXJzdAogICAgY2hhcmFjdGVyLiBUaGlzIHdhcyBhIGZhaWxpbmcgcGF0dGVybjogIig/IS5iY2QpLioiLiBUaGUgYnVnIGlzIG5vdyBmaXhlZC4KCjEwLiBJbiBVVEYtOCBtb2RlLCB3aGVuIG1vdmluZyBmb3J3YXJkcyBpbiB0aGUgc3ViamVjdCBhZnRlciBhIGZhaWxlZCBtYXRjaAogICAgc3RhcnRpbmcgYXQgdGhlIGxhc3Qgc3ViamVjdCBjaGFyYWN0ZXIsIGJ5dGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBzdWJqZWN0CiAgICBzdHJpbmcgd2VyZSByZWFkLgoKMTEuIFJlbmFtZWQgdGhlIHZhcmlhYmxlICJjbGFzcyIgYXMgImNsYXNzYml0cyIgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgQysrCiAgICB1c2Vycy4gKFByZXZpb3VzbHkgdGhlcmUgd2FzIGEgbWFjcm8gZGVmaW5pdGlvbiwgYnV0IGl0IGFwcGFyZW50bHkgd2Fzbid0CiAgICBlbm91Z2guKQoKMTIuIEFkZGVkIHRoZSBuZXcgZmllbGQgInRhYmxlcyIgdG8gdGhlIGV4dHJhIGRhdGEgc28gdGhhdCB0YWJsZXMgY2FuIGJlIHBhc3NlZAogICAgaW4gYXQgZXhlYyB0aW1lLCBvciB0aGUgaW50ZXJuYWwgdGFibGVzIGNhbiBiZSByZS1zZWxlY3RlZC4gVGhpcyBhbGxvd3MKICAgIGEgY29tcGlsZWQgcmVnZXggdG8gYmUgc2F2ZWQgYW5kIHJlLXVzZWQgYXQgYSBsYXRlciB0aW1lIGJ5IGEgZGlmZmVyZW50CiAgICBwcm9ncmFtIHRoYXQgbWlnaHQgaGF2ZSBldmVyeXRoaW5nIGF0IGRpZmZlcmVudCBhZGRyZXNzZXMuCgoxMy4gTW9kaWZpZWQgdGhlIHBjcmUtY29uZmlnIHNjcmlwdCBzbyB0aGF0LCB3aGVuIHJ1biBvbiBTb2xhcmlzLCBpdCBzaG93cyBhCiAgICAtUiBsaWJyYXJ5IGFzIHdlbGwgYXMgYSAtTCBsaWJyYXJ5LgoKMTQuIFRoZSBkZWJ1Z2dpbmcgb3B0aW9ucyBvZiBwY3JldGVzdCAoLWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBEIG9uIGEKICAgIHBhdHRlcm4pIHNob3dlZCBpbmNvcnJlY3Qgb3V0cHV0IGZvciBhbnl0aGluZyBmb2xsb3dpbmcgYW4gZXh0ZW5kZWQgY2xhc3MKICAgIHRoYXQgY29udGFpbmVkIG11bHRpYnl0ZSBjaGFyYWN0ZXJzIGFuZCB3aGljaCB3YXMgZm9sbG93ZWQgYnkgYSBxdWFudGlmaWVyLgoKMTUuIEFkZGVkIG9wdGlvbmFsIHN1cHBvcnQgZm9yIGdlbmVyYWwgY2F0ZWdvcnkgVW5pY29kZSBjaGFyYWN0ZXIgcHJvcGVydGllcwogICAgdmlhIHRoZSBccCwgXFAsIGFuZCBcWCBlc2NhcGVzLiBVbmljb2RlIHByb3BlcnR5IHN1cHBvcnQgaW1wbGllcyBVVEYtOAogICAgc3VwcG9ydC4gSXQgYWRkcyBhYm91dCA5MEsgdG8gdGhlIHNpemUgb2YgdGhlIGxpYnJhcnkuIFRoZSBtZWFuaW5ncyBvZiB0aGUKICAgIGluYnVpbHQgY2xhc3MgZXNjYXBlcyBzdWNoIGFzIFxkIGFuZCBccyBoYXZlIE5PVCBiZWVuIGNoYW5nZWQuCgoxNi4gVXBkYXRlZCBwY3JlZGVtby5jIHRvIGluY2x1ZGUgY2FsbHMgdG8gZnJlZSgpIHRvIHJlbGVhc2UgdGhlIG1lbW9yeSBmb3IgdGhlCiAgICBjb21waWxlZCBwYXR0ZXJuLgoKMTcuIFRoZSBnZW5lcmF0ZWQgZmlsZSBjaGFydGFibGVzLmMgd2FzIGJlaW5nIGNyZWF0ZWQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkKICAgIGluc3RlYWQgb2YgaW4gdGhlIGJ1aWxkaW5nIGRpcmVjdG9yeS4gVGhpcyBjYXVzZWQgdGhlIGJ1aWxkIHRvIGZhaWwgaWYgdGhlCiAgICBzb3VyY2UgZGlyZWN0b3J5IHdhcyBkaWZmZXJlbnQgZnJvbSB0aGUgYnVpbGRpbmcgZGlyZWN0b3J5LCBhbmQgd2FzCiAgICByZWFkLW9ubHkuCgoxOC4gQWRkZWQgc29tZSBzYW1wbGUgV2luIGNvbW1hbmRzIGZyb20gTWFyayBUZXRyb2RlIGludG8gdGhlIE5PTi1VTklYLVVTRQogICAgZmlsZS4gTm8gZG91YnQgc29tZWJvZHkgd2lsbCB0ZWxsIG1lIGlmIHRoZXkgZG9uJ3QgbWFrZSBzZW5zZS4uLiBBbHNvIGFkZGVkCiAgICBEYW4gTW9vbmV5J3MgY29tbWVudHMgYWJvdXQgYnVpbGRpbmcgb24gT3BlblZNUy4KCjE5LiBBZGRlZCBzdXBwb3J0IGZvciBwYXJ0aWFsIG1hdGNoaW5nIHZpYSB0aGUgUENSRV9QQVJUSUFMIG9wdGlvbiBmb3IKICAgIHBjcmVfZXhlYygpIGFuZCB0aGUgXFAgZGF0YSBlc2NhcGUgaW4gcGNyZXRlc3QuCgoyMC4gRXh0ZW5kZWQgcGNyZXRlc3Qgd2l0aCAzIG5ldyBwYXR0ZXJuIGZlYXR1cmVzOgoKICAgIChpKSAgIEEgcGF0dGVybiBvcHRpb24gb2YgdGhlIGZvcm0gIj5yZXN0LW9mLWxpbmUiIGNhdXNlcyBwY3JldGVzdCB0bwogICAgICAgICAgd3JpdGUgdGhlIGNvbXBpbGVkIHBhdHRlcm4gdG8gdGhlIGZpbGUgd2hvc2UgbmFtZSBpcyAicmVzdC1vZi1saW5lIi4KICAgICAgICAgIFRoaXMgaXMgYSBzdHJhaWdodCBiaW5hcnkgZHVtcCBvZiB0aGUgZGF0YSwgd2l0aCB0aGUgc2F2ZWQgcG9pbnRlciB0bwogICAgICAgICAgdGhlIGNoYXJhY3RlciB0YWJsZXMgZm9yY2VkIHRvIGJlIE5VTEwuIFRoZSBzdHVkeSBkYXRhLCBpZiBhbnksIGlzCiAgICAgICAgICB3cml0dGVuIHRvby4gQWZ0ZXIgd3JpdGluZywgcGNyZXRlc3QgcmVhZHMgYSBuZXcgcGF0dGVybi4KCiAgICAoaWkpICBJZiwgaW5zdGVhZCBvZiBhIHBhdHRlcm4sICI8cmVzdC1vZi1saW5lIiBpcyBnaXZlbiwgcGNyZXRlc3QgcmVhZHMgYQogICAgICAgICAgY29tcGlsZWQgcGF0dGVybiBmcm9tIHRoZSBnaXZlbiBmaWxlLiBUaGVyZSBtdXN0IG5vdCBiZSBhbnkKICAgICAgICAgIG9jY3VycmVuY2VzIG9mICI8IiBpbiB0aGUgZmlsZSBuYW1lIChwcmV0dHkgdW5saWtlbHkpOyBpZiB0aGVyZSBhcmUsCiAgICAgICAgICBwY3JldGVzdCB3aWxsIGluc3RlYWQgdHJlYXQgdGhlIGluaXRpYWwgIjwiIGFzIGEgcGF0dGVybiBkZWxpbWl0ZXIuCiAgICAgICAgICBBZnRlciByZWFkaW5nIGluIHRoZSBwYXR0ZXJuLCBwY3JldGVzdCBnb2VzIG9uIHRvIHJlYWQgZGF0YSBsaW5lcyBhcwogICAgICAgICAgdXN1YWwuCgogICAgKGlpaSkgVGhlIEYgcGF0dGVybiBvcHRpb24gY2F1c2VzIHBjcmV0ZXN0IHRvIGZsaXAgdGhlIGJ5dGVzIGluIHRoZSAzMi1iaXQKICAgICAgICAgIGFuZCAxNi1iaXQgZmllbGRzIGluIGEgY29tcGlsZWQgcGF0dGVybiwgdG8gc2ltdWxhdGUgYSBwYXR0ZXJuIHRoYXQKICAgICAgICAgIHdhcyBjb21waWxlZCBvbiBhIGhvc3Qgb2Ygb3Bwb3NpdGUgZW5kaWFubmVzcy4KCjIxLiBUaGUgcGNyZS1leGVjKCkgZnVuY3Rpb24gY2FuIG5vdyBjb3BlIHdpdGggcGF0dGVybnMgdGhhdCB3ZXJlIGNvbXBpbGVkIG9uCiAgICBob3N0cyBvZiBvcHBvc2l0ZSBlbmRpYW5uZXNzLCB3aXRoIHRoaXMgcmVzdHJpY3Rpb246CgogICAgICBBcyBmb3IgYW55IGNvbXBpbGVkIGV4cHJlc3Npb24gdGhhdCBpcyBzYXZlZCBhbmQgdXNlZCBsYXRlciwgdGhlIHRhYmxlcwogICAgICBwb2ludGVyIGZpZWxkIGNhbm5vdCBiZSBwcmVzZXJ2ZWQ7IHRoZSBleHRyYV9kYXRhIGZpZWxkIGluIHRoZSBhcmd1bWVudHMKICAgICAgdG8gcGNyZV9leGVjKCkgc2hvdWxkIGJlIHVzZWQgdG8gcGFzcyBpbiBhIHRhYmxlcyBhZGRyZXNzIGlmIGEgdmFsdWUKICAgICAgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBpbnRlcm5hbCB0YWJsZXMgd2VyZSB1c2VkIGF0IGNvbXBpbGUgdGltZS4KCjIyLiBDYWxsaW5nIHBjcmVfZXhlYygpIHdpdGggYSBuZWdhdGl2ZSB2YWx1ZSBvZiB0aGUgIm92ZWNzaXplIiBwYXJhbWV0ZXIgaXMKICAgIG5vdyBkaWFnbm9zZWQgYXMgYW4gZXJyb3IuIFByZXZpb3VzbHksIG1vc3Qgb2YgdGhlIHRpbWUsIGEgbmVnYXRpdmUgbnVtYmVyCiAgICB3b3VsZCBoYXZlIGJlZW4gdHJlYXRlZCBhcyB6ZXJvLCBidXQgaWYgaW4gYWRkaXRpb24gIm92ZWN0b3IiIHdhcyBwYXNzZWQgYXMKICAgIE5VTEwsIGEgY3Jhc2ggY291bGQgb2NjdXIuCgoyMy4gVXBkYXRlZCB0aGUgZmlsZXMgbHRtYWluLnNoLCBjb25maWcuc3ViLCBjb25maWcuZ3Vlc3MsIGFuZCBhY2xvY2FsLm00IHdpdGgKICAgIG5ldyB2ZXJzaW9ucyBmcm9tIHRoZSBsaWJ0b29sIDEuNSBkaXN0cmlidXRpb24gKHRoZSBsYXN0IG9uZSBpcyBhIGNvcHkgb2YKICAgIGEgZmlsZSBjYWxsZWQgbGlidG9vbC5tNCkuIFRoaXMgc2VlbXMgdG8gaGF2ZSBmaXhlZCB0aGUgbmVlZCB0byBwYXRjaAogICAgImNvbmZpZ3VyZSIgdG8gc3VwcG9ydCBEYXJ3aW4gMS4zICh3aGljaCBJIHVzZWQgdG8gZG8pLiBIb3dldmVyLCBJIHN0aWxsCiAgICBoYWQgdG8gcGF0Y2ggbHRtYWluLnNoIHRvIGVuc3VyZSB0aGF0ICR7U0VEfSBpcyBzZXQgKGl0IGlzbid0IG9uIG15CiAgICB3b3Jrc3RhdGlvbikuCgoyNC4gQ2hhbmdlZCB0aGUgUENSRSBsaWNlbmNlIHRvIGJlIHRoZSBtb3JlIHN0YW5kYXJkICJCU0QiIGxpY2VuY2UuCgoKVmVyc2lvbiA0LjUgMDEtRGVjLTAzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIDEuIFRoZXJlIGhhcyBiZWVuIHNvbWUgcmUtYXJyYW5nZW1lbnQgb2YgdGhlIGNvZGUgZm9yIHRoZSBtYXRjaCgpIGZ1bmN0aW9uIHNvCiAgICB0aGF0IGl0IGNhbiBiZSBjb21waWxlZCBpbiBhIHZlcnNpb24gdGhhdCBkb2VzIG5vdCBjYWxsIGl0c2VsZiByZWN1cnNpdmVseS4KICAgIEluc3RlYWQsIGl0IGtlZXBzIHRob3NlIGxvY2FsIHZhcmlhYmxlcyB0aGF0IG5lZWQgc2VwYXJhdGUgaW5zdGFuY2VzIGZvcgogICAgZWFjaCAicmVjdXJzaW9uIiBpbiBhIGZyYW1lIG9uIHRoZSBoZWFwLCBhbmQgZ2V0cy9mcmVlcyBmcmFtZXMgd2hlbmV2ZXIgaXQKICAgIG5lZWRzIHRvICJyZWN1cnNlIi4gS2VlcGluZyB0cmFjayBvZiB3aGVyZSBjb250cm9sIG11c3QgZ28gaXMgZG9uZSBieSBtZWFucwogICAgb2Ygc2V0am1wL2xvbmdqbXAuIFRoZSB3aG9sZSB0aGluZyBpcyBpbXBsZW1lbnRlZCBieSBhIHNldCBvZiBtYWNyb3MgdGhhdAogICAgaGlkZSBtb3N0IG9mIHRoZSBkZXRhaWxzIGZyb20gdGhlIG1haW4gY29kZSwgYW5kIG9wZXJhdGVzIG9ubHkgaWYKICAgIE5PX1JFQ1VSU0UgaXMgZGVmaW5lZCB3aGlsZSBjb21waWxpbmcgcGNyZS5jLiBJZiBQQ1JFIGlzIGJ1aWx0IHVzaW5nIHRoZQogICAgImNvbmZpZ3VyZSIgbWVjaGFuaXNtLCAiLS1kaXNhYmxlLXN0YWNrLWZvci1yZWN1cnNpb24iIHR1cm5zIG9uIHRoaXMgd2F5IG9mCiAgICBvcGVyYXRpbmcuCgogICAgVG8gbWFrZSBpdCBlYXNpZXIgZm9yIGNhbGxlcnMgdG8gcHJvdmlkZSBzcGVjaWFsbHkgdGFpbG9yZWQgZ2V0L2ZyZWUKICAgIGZ1bmN0aW9ucyBmb3IgdGhpcyB1c2FnZSwgdHdvIG5ldyBmdW5jdGlvbnMsIHBjcmVfc3RhY2tfbWFsbG9jLCBhbmQKICAgIHBjcmVfc3RhY2tfZnJlZSwgYXJlIHVzZWQuIFRoZXkgYXJlIGFsd2F5cyBjYWxsZWQgaW4gc3RyaWN0IHN0YWNraW5nIG9yZGVyLAogICAgYW5kIHRoZSBzaXplIG9mIGJsb2NrIHJlcXVlc3RlZCBpcyBhbHdheXMgdGhlIHNhbWUuCgogICAgVGhlIFBDUkVfQ09ORklHX1NUQUNLUkVDVVJTRSBpbmZvIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBmaW5kIG91dCB3aGV0aGVyCiAgICBQQ1JFIGhhcyBiZWVuIGNvbXBpbGVkIHRvIHVzZSB0aGUgc3RhY2sgb3IgdGhlIGhlYXAgZm9yIHJlY3Vyc2lvbi4gVGhlCiAgICAtQyBvcHRpb24gb2YgcGNyZXRlc3QgdXNlcyB0aGlzIHRvIHNob3cgd2hpY2ggdmVyc2lvbiBpcyBjb21waWxlZC4KCiAgICBBIG5ldyBkYXRhIGVzY2FwZSBcUywgaXMgYWRkZWQgdG8gcGNyZXRlc3Q7IGl0IGNhdXNlcyB0aGUgYW1vdW50cyBvZiBzdG9yZQogICAgb2J0YWluZWQgYW5kIGZyZWVkIGJ5IGJvdGgga2luZHMgb2YgbWFsbG9jL2ZyZWUgYXQgbWF0Y2ggdGltZSB0byBiZSBhZGRlZAogICAgdG8gdGhlIG91dHB1dC4KCiAyLiBDaGFuZ2VkIHRoZSBsb2NhbGUgdGVzdCB0byB1c2UgImZyX0ZSIiBpbnN0ZWFkIG9mICJmciIgYmVjYXVzZSB0aGF0J3MKICAgIHdoYXQncyBhdmFpbGFibGUgb24gbXkgY3VycmVudCBMaW51eCBkZXNrdG9wIG1hY2hpbmUuCgogMy4gV2hlbiBtYXRjaGluZyBhIFVURi04IHN0cmluZywgdGhlIHRlc3QgZm9yIGEgdmFsaWQgc3RyaW5nIGF0IHRoZSBzdGFydCBoYXMKICAgIGJlZW4gZXh0ZW5kZWQuIElmIHN0YXJ0X29mZnNldCBpcyBub3QgemVybywgUENSRSBub3cgY2hlY2tzIHRoYXQgaXQgcG9pbnRzCiAgICB0byBhIGJ5dGUgdGhhdCBpcyB0aGUgc3RhcnQgb2YgYSBVVEYtOCBjaGFyYWN0ZXIuIElmIG5vdCwgaXQgcmV0dXJucwogICAgUENSRV9FUlJPUl9CQURVVEY4X09GRlNFVCAoLTExKS4gTm90ZTogdGhlIHdob2xlIHN0cmluZyBpcyBzdGlsbCBjaGVja2VkOwogICAgdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGVyZSBtYXkgYmUgYmFja3dhcmQgYXNzZXJ0aW9ucyBpbiB0aGUgcGF0dGVybi4KICAgIFdoZW4gbWF0Y2hpbmcgdGhlIHNhbWUgc3ViamVjdCBzZXZlcmFsIHRpbWVzLCBpdCBtYXkgc2F2ZSByZXNvdXJjZXMgdG8gdXNlCiAgICBQQ1JFX05PX1VURjhfQ0hFQ0sgb24gYWxsIGJ1dCB0aGUgZmlyc3QgY2FsbCBpZiB0aGUgc3RyaW5nIGlzIGxvbmcuCgogNC4gVGhlIGNvZGUgZm9yIGNoZWNraW5nIHRoZSB2YWxpZGl0eSBvZiBVVEYtOCBzdHJpbmdzIGhhcyBiZWVuIHRpZ2h0ZW5lZCBzbwogICAgdGhhdCBpdCByZWplY3RzIChhKSBzdHJpbmdzIGNvbnRhaW5pbmcgMHhmZSBvciAweGZmIGJ5dGVzIGFuZCAoYikgc3RyaW5ncwogICAgY29udGFpbmluZyAib3Zlcmxvbmcgc2VxdWVuY2VzIi4KCiA1LiBGaXhlZCBhIGJ1ZyAoYXBwZWFyaW5nIHR3aWNlKSB0aGF0IEkgY291bGQgbm90IGZpbmQgYW55IHdheSBvZiBleHBsb2l0aW5nIQogICAgSSBoYWQgd3JpdHRlbiAiaWYgKChkaWdpdGFiWypwKytdICYmIGNodGFiX2RpZ2l0KSA9PSAwKSIgd2hlcmUgdGhlICImJiIKICAgIHNob3VsZCBoYXZlIGJlZW4gIiYiLCBidXQgaXQganVzdCBzbyBoYXBwZW5lZCB0aGF0IGFsbCB0aGUgY2FzZXMgdGhpcyBsZXQKICAgIHRocm91Z2ggYnkgbWlzdGFrZSB3ZXJlIHBpY2tlZCB1cCBsYXRlciBpbiB0aGUgZnVuY3Rpb24uCgogNi4gSSBoYWQgdXNlZCBhIHZhcmlhYmxlIGNhbGxlZCAiaXNibGFuayIgLSB0aGlzIGlzIGEgQzk5IGZ1bmN0aW9uLCBjYXVzaW5nCiAgICBzb21lIGNvbXBpbGVycyB0byB3YXJuLiBUbyBhdm9pZCB0aGlzLCBJIHJlbmFtZWQgaXQgKGFzICJibGFua2NsYXNzIikuCgogNy4gQ29zbWV0aWM6IChhKSBvbmx5IG91dHB1dCBhbm90aGVyIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiBwY3JldGVzdCBpZiBpdCBpcwogICAgcHJvbXB0aW5nOyAoYikgcnVuICIuL3BjcmV0ZXN0IC9kZXYvbnVsbCIgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0IHNjcmlwdAogICAgc28gdGhlIHZlcnNpb24gaXMgc2hvd247IChjKSBzdG9wICJtYWtlIHRlc3QiIGVjaG9pbmcgIi4vUnVuVGVzdCIuCgogOC4gQWRkZWQgcGF0Y2hlcyBmcm9tIERhdmlkIEJ1cmdlc3MgdG8gZW5hYmxlIFBDUkUgdG8gcnVuIG9uIEVCQ0RJQyBzeXN0ZW1zLgoKIDkuIFRoZSBwcm90b3R5cGUgZm9yIG1lbW1vdmUoKSBmb3Igc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgaXQgd2FzIHVzaW5nCiAgICBzaXplX3QsIGJ1dCB0aGUgaW5jbHVzaW9uIG9mIHRoZSBoZWFkZXIgdGhhdCBkZWZpbmVzIHNpemVfdCB3YXMgbGF0ZXIuIEkndmUKICAgIG1vdmVkIHRoZSAjaW5jbHVkZXMgZm9yIHRoZSBDIGhlYWRlcnMgZWFybGllciB0byBhdm9pZCB0aGlzLgoKMTAuIEFkZGVkIHNvbWUgYWRqdXN0bWVudHMgdG8gdGhlIGNvZGUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gY29tcGlsZXIgb24gY2VydGFpbgogICAgc3BlY2lhbCBzeXN0ZW1zOgoKICAgICAgKGEpIFNvbWUgImNvbnN0IiBxdWFsaWZpZXJzIHdlcmUgbWlzc2luZy4KICAgICAgKGIpIEFkZGVkIHRoZSBtYWNybyBFWFBPUlQgYmVmb3JlIGFsbCBleHBvcnRlZCBmdW5jdGlvbnM7IGJ5IGRlZmF1bHQgdGhpcwogICAgICAgICAgaXMgZGVmaW5lZCB0byBiZSBlbXB0eS4KICAgICAgKGMpIENoYW5nZWQgdGhlIGRmdGFibGVzIGF1eGlsaWFyeSBwcm9ncmFtICh0aGF0IGJ1aWxkcyBjaGFydGFibGVzLmMpIHNvCiAgICAgICAgICB0aGF0IGl0IHJlYWRzIGl0cyBvdXRwdXQgZmlsZSBuYW1lIGFzIGFuIGFyZ3VtZW50IGluc3RlYWQgb2Ygd3JpdGluZwogICAgICAgICAgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgYXNzdW1pbmcgdGhpcyBjYW4gYmUgcmVkaXJlY3RlZC4KCjExLiBJbiBVVEYtOCBtb2RlLCBpZiBhIHJlY3Vyc2l2ZSByZWZlcmVuY2UgKGUuZy4gKD8xKSkgZm9sbG93ZWQgYSBjaGFyYWN0ZXIKICAgIGNsYXNzIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB3aXRoIHZhbHVlcyBncmVhdGVyIHRoYW4gMjU1LCBQQ1JFIGNvbXBpbGF0aW9uCiAgICB3ZW50IGludG8gYSBsb29wLgoKMTIuIEEgcmVjdXJzaXZlIHJlZmVyZW5jZSB0byBhIHN1YnBhdHRlcm4gdGhhdCB3YXMgd2l0aGluIGFub3RoZXIgc3VicGF0dGVybgogICAgdGhhdCBoYWQgYSBtaW5pbXVtIHF1YW50aWZpZXIgb2YgemVybyBjYXVzZWQgUENSRSB0byBjcmFzaC4gRm9yIGV4YW1wbGUsCiAgICAoeCh5KD8yKSl6KT8gcHJvdm9rZWQgdGhpcyBidWcgd2l0aCBhIHN1YmplY3QgdGhhdCBnb3QgYXMgZmFyIGFzIHRoZQogICAgcmVjdXJzaW9uLiBJZiB0aGUgcmVjdXJzaXZlbHktY2FsbGVkIHN1YnBhdHRlcm4gaXRzZWxmIGhhZCBhIHplcm8gcmVwZWF0LAogICAgdGhhdCB3YXMgT0suCgoxMy4gSW4gcGNyZXRlc3QsIHRoZSBidWZmZXIgZm9yIHJlYWRpbmcgYSBkYXRhIGxpbmUgd2FzIHNldCBhdCAzMEssIGJ1dCB0aGUKICAgIGJ1ZmZlciBpbnRvIHdoaWNoIGl0IHdhcyBjb3BpZWQgKGZvciBlc2NhcGUgcHJvY2Vzc2luZykgd2FzIHN0aWxsIHNldCBhdAogICAgMTAyNCwgc28gbG9uZyBsaW5lcyBjYXVzZWQgY3Jhc2hlcy4KCjE0LiBBIHBhdHRlcm4gc3VjaCBhcyAvW2FiXXsxLDN9Ky8gZmFpbGVkIHRvIGNvbXBpbGUsIGdpdmluZyB0aGUgZXJyb3IKICAgICJpbnRlcm5hbCBlcnJvcjogY29kZSBvdmVyZmxvdy4uLiIuIFRoaXMgYXBwbGllZCB0byBhbnkgY2hhcmFjdGVyIGNsYXNzCiAgICB0aGF0IHdhcyBmb2xsb3dlZCBieSBhIHBvc3Nlc3NpdmUgcXVhbnRpZmllci4KCjE1LiBNb2RpZmllZCB0aGUgTWFrZWZpbGUgdG8gYWRkIGxpYnBjcmUubGEgYXMgYSBwcmVyZXF1aXNpdGUgZm9yCiAgICBsaWJwY3JlcG9zaXgubGEgYmVjYXVzZSBJIHdhcyB0b2xkIHRoaXMgaXMgbmVlZGVkIGZvciBhIHBhcmFsbGVsIGJ1aWxkIHRvCiAgICB3b3JrLgoKMTYuIElmIGEgcGF0dGVybiB0aGF0IGNvbnRhaW5lZCAuKiBmb2xsb3dpbmcgb3B0aW9uYWwgaXRlbXMgYXQgdGhlIHN0YXJ0IHdhcwogICAgc3R1ZGllZCwgdGhlIHdyb25nIG9wdGltaXppbmcgZGF0YSB3YXMgZ2VuZXJhdGVkLCBsZWFkaW5nIHRvIG1hdGNoaW5nCiAgICBlcnJvcnMuIEZvciBleGFtcGxlLCBzdHVkeWluZyAvW2FiXSouKmMvIGNvbmNsdWRlZCwgZXJyb25lb3VzbHksIHRoYXQgYW55CiAgICBtYXRjaGluZyBzdHJpbmcgbXVzdCBzdGFydCB3aXRoIGEgb3IgYiBvciBjLiBUaGUgY29ycmVjdCBjb25jbHVzaW9uIGZvcgogICAgdGhpcyBwYXR0ZXJuIGlzIHRoYXQgYSBtYXRjaCBjYW4gc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyLgoKClZlcnNpb24gNC40IDEzLUF1Zy0wMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAxLiBJbiBVVEYtOCBtb2RlLCBhIGNoYXJhY3RlciBjbGFzcyBjb250YWluaW5nIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZXMgYmV0d2VlbgogICAgMTI3IGFuZCAyNTUgd2FzIG5vdCBoYW5kbGVkIGNvcnJlY3RseSBpZiB0aGUgY29tcGlsZWQgcGF0dGVybiB3YXMgc3R1ZGllZC4KICAgIEluIGZpeGluZyB0aGlzLCBJIGhhdmUgYWxzbyBpbXByb3ZlZCB0aGUgc3R1ZHlpbmcgYWxnb3JpdGhtIGZvciBzdWNoCiAgICBjbGFzc2VzIChzbGlnaHRseSkuCgogMi4gVGhyZWUgaW50ZXJuYWwgZnVuY3Rpb25zIGhhZCByZWR1bmRhbnQgYXJndW1lbnRzIHBhc3NlZCB0byB0aGVtLiBSZW1vdmFsCiAgICBtaWdodCBnaXZlIGEgdmVyeSB0ZWVueSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4KCiAzLiBEb2N1bWVudGF0aW9uIGJ1ZzogdGhlIHZhbHVlIG9mIHRoZSBjYXB0dXJlX3RvcCBmaWVsZCBpbiBhIGNhbGxvdXQgaXMgKm9uZQogICAgbW9yZSB0aGFuKiB0aGUgbnVtYmVyIG9mIHRoZSBoaWdodGVzdCBudW1iZXJlZCBjYXB0dXJlZCBzdWJzdHJpbmcuCgogNC4gVGhlIE1ha2VmaWxlIGxpbmtlZCBwY3JldGVzdCBhbmQgcGNyZWdyZXAgd2l0aCAtbHBjcmUsIHdoaWNoIGNvdWxkIHJlc3VsdAogICAgaW4gaW5jb3JyZWN0bHkgbGlua2luZyB3aXRoIGEgcHJldmlvdXNseSBpbnN0YWxsZWQgdmVyc2lvbi4gVGhleSBub3cgbGluawogICAgZXhwbGljaXRseSB3aXRoIGxpYnBjcmUubGEuCgogNS4gY29uZmlndXJlLmluIG5vIGxvbmdlciBuZWVkcyB0byByZWNvZ25pemUgQ3lnd2luIHNwZWNpYWxseS4KCiA2LiBBIHByb2JsZW0gaW4gcGNyZS5pbiBmb3IgV2luZG93cyBwbGF0Zm9ybXMgaXMgZml4ZWQuCgogNy4gSWYgYSBwYXR0ZXJuIHdhcyBzdWNjZXNzZnVsbHkgc3R1ZGllZCwgYW5kIHRoZSAtZCAob3IgL0QpIGZsYWcgd2FzIGdpdmVuIHRvCiAgICBwY3JldGVzdCwgaXQgdXNlZCB0byBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBzdHVkeSBibG9jayBhcyBwYXJ0IG9mIGl0cwogICAgb3V0cHV0LiBVbmZvcnR1bmF0ZWx5LCB0aGUgc3RydWN0dXJlIGNvbnRhaW5zIGEgZmllbGQgdGhhdCBoYXMgYSBkaWZmZXJlbnQKICAgIHNpemUgb24gZGlmZmVyZW50IGhhcmR3YXJlIGFyY2hpdGVjdHVyZXMuIFRoaXMgbWVhbnQgdGhhdCB0aGUgdGVzdHMgdGhhdAogICAgc2hvd2VkIHRoaXMgc2l6ZSBmYWlsZWQuIEFzIHRoZSBibG9jayBpcyBjdXJyZW50bHkgYWx3YXlzIG9mIGEgZml4ZWQgc2l6ZSwKICAgIHRoaXMgaW5mb3JtYXRpb24gaXNuJ3QgYWN0dWFsbHkgcGFydGljdWxhcmx5IHVzZWZ1bCBpbiBwY3JldGVzdCBvdXRwdXQsIHNvCiAgICBJIGhhdmUganVzdCByZW1vdmVkIGl0LgoKIDguIFRocmVlIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBhY2NpZGVudGFsbHkgZGlkIG5vdCBzdGFydCBpbiBjb2x1bW4gMS4KICAgIFNhZGx5LCB0aGVyZSBhcmUgKnN0aWxsKiBjb21waWxlcnMgYXJvdW5kIHRoYXQgY29tcGxhaW4sIGV2ZW4gdGhvdWdoCiAgICBzdGFuZGFyZCBDIGhhcyBub3QgcmVxdWlyZWQgdGhpcyBmb3Igd2VsbCBvdmVyIGEgZGVjYWRlLiBTaWdoLgoKIDkuIEluIHBjcmV0ZXN0LCB0aGUgY29kZSBmb3IgY2hlY2tpbmcgY2FsbG91dHMgcGFzc2VkIHNtYWxsIGludGVnZXJzIGluIHRoZQogICAgY2FsbG91dF9kYXRhIGZpZWxkLCB3aGljaCBpcyBhIHZvaWQgKiBmaWVsZC4gSG93ZXZlciwgc29tZSBwaWNreSBjb21waWxlcnMKICAgIGNvbXBsYWluZWQgYWJvdXQgdGhlIGNhc3RzIGludm9sdmVkIGZvciB0aGlzIG9uIDY0LWJpdCBzeXN0ZW1zLiBOb3cKICAgIHBjcmV0ZXN0IHBhc3NlcyB0aGUgYWRkcmVzcyBvZiB0aGUgc21hbGwgaW50ZWdlciBpbnN0ZWFkLCB3aGljaCBzaG91bGQgZ2V0CiAgICByaWQgb2YgdGhlIHdhcm5pbmdzLgoKMTAuIEJ5IGRlZmF1bHQsIHdoZW4gaW4gVVRGLTggbW9kZSwgUENSRSBub3cgY2hlY2tzIGZvciB2YWxpZCBVVEYtOCBzdHJpbmdzIGF0CiAgICBib3RoIGNvbXBpbGUgYW5kIHJ1biB0aW1lLCBhbmQgZ2l2ZXMgYW4gZXJyb3IgaWYgYW4gaW52YWxpZCBVVEYtOCBzZXF1ZW5jZQogICAgaXMgZm91bmQuIFRoZXJlIGlzIGEgb3B0aW9uIGZvciBkaXNhYmxpbmcgdGhpcyBjaGVjayBpbiBjYXNlcyB3aGVyZSB0aGUKICAgIHN0cmluZyBpcyBrbm93biB0byBiZSBjb3JyZWN0IGFuZC9vciB0aGUgbWF4aW11bSBwZXJmb3JtYW5jZSBpcyB3YW50ZWQuCgoxMS4gSW4gcmVzcG9uc2UgdG8gYSBidWcgcmVwb3J0LCBJIGNoYW5nZWQgb25lIGxpbmUgaW4gTWFrZWZpbGUuaW4gZnJvbQoKICAgICAgICAtV2wsLS1vdXQtaW1wbGliLC5saWJzL2xpYkBXSU5fUFJFRklYQHBjcmVwb3NpeC5kbGwuYSBcCiAgICB0bwogICAgICAgIC1XbCwtLW91dC1pbXBsaWIsLmxpYnMvQFdJTl9QUkVGSVhAbGlicGNyZXBvc2l4LmRsbC5hIFwKCiAgICB0byBsb29rIHNpbWlsYXIgdG8gb3RoZXIgbGluZXMsIGJ1dCBJIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgd2hldGhlciB0aGlzCiAgICBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sIGFzIEkgZG8gbm90IHVzZSBXaW5kb3dzLiBObyBkb3VidCBJJ2xsIGdldCB0b2xkCiAgICBpZiBpdCdzIHdyb25nLi4uCgoKVmVyc2lvbiA0LjMgMjEtTWF5LTAzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gVHdvIGluc3RhbmNlcyBvZiBAV0lOX1BSRUZJWEAgb21pdHRlZCBmcm9tIHRoZSBXaW5kb3dzIHRhcmdldHMgaW4gdGhlCiAgIE1ha2VmaWxlLgoKMi4gU29tZSByZWZhY3RvcmluZyB0byBpbXByb3ZlIHRoZSBxdWFsaXR5IG9mIHRoZSBjb2RlOgoKICAgKGkpICAgVGhlIHV0ZjhfdGFibGUuLi4gdmFyaWFibGVzIGFyZSBub3cgZGVjbGFyZWQgImNvbnN0Ii4KCiAgIChpaSkgIFRoZSBjb2RlIGZvciBcY3gsIHdoaWNoIHVzZWQgdGhlICJjYXNlIGZsaXBwaW5nIiB0YWJsZSB0byB1cHBlciBjYXNlCiAgICAgICAgIGxvd2VyIGNhc2UgbGV0dGVycywgbm93IGp1c3Qgc3Vic3RyYWN0cyAzMi4gVGhpcyBpcyBBU0NJSS1zcGVjaWZpYywKICAgICAgICAgYnV0IHRoZSB3aG9sZSBjb25jZXB0IG9mIFxjeCBpcyBBU0NJSS1zcGVjaWZpYywgc28gaXQgc2VlbXMKICAgICAgICAgcmVhc29uYWJsZS4KCiAgIChpaWkpIFBDUkUgd2FzIHVzaW5nIGl0cyBjaGFyYWN0ZXIgdHlwZXMgdGFibGUgdG8gcmVjb2duaXplIGRlY2ltYWwgYW5kCiAgICAgICAgIGhleGFkZWNpbWFsIGRpZ2l0cyBpbiB0aGUgcGF0dGVybi4gVGhpcyBpcyBzaWxseSwgYmVjYXVzZSBpdCBoYW5kbGVzCiAgICAgICAgIG9ubHkgMC05LCBhLWYsIGFuZCBBLUYsIGJ1dCB0aGUgY2hhcmFjdGVyIHR5cGVzIHRhYmxlIGlzIGxvY2FsZS0KICAgICAgICAgc3BlY2lmaWMsIHdoaWNoIG1lYW5zIHN0cmFuZ2UgdGhpbmdzIG1pZ2h0IGhhcHBlbi4gQSBwcml2YXRlCiAgICAgICAgIHRhYmxlIGlzIG5vdyB1c2VkIGZvciB0aGlzIC0gdGhvdWdoIGl0IGNvc3RzIDI1NiBieXRlcywgYSB0YWJsZSBpcwogICAgICAgICBtdWNoIGZhc3RlciB0aGFuIG11bHRpcGxlIGV4cGxpY2l0IHRlc3RzLiBPZiBjb3Vyc2UsIHRoZSBzdGFuZGFyZAogICAgICAgICBjaGFyYWN0ZXIgdHlwZXMgdGFibGUgaXMgc3RpbGwgdXNlZCBmb3IgbWF0Y2hpbmcgZGlnaXRzIGluIHN1YmplY3QKICAgICAgICAgc3RyaW5ncyBhZ2FpbnN0IFxkLgoKICAgKGl2KSAgU3RyaWN0bHksIHRoZSBpZGVudGlmaWVyIEVTQ190IGlzIHJlc2VydmVkIGJ5IFBPU0lYIChhbGwgaWRlbnRpZmllcnMKICAgICAgICAgZW5kaW5nIGluIF90IGFyZSkuIFNvIEkndmUgcmVuYW1lZCBpdCBhcyBFU0NfdGVlLgoKMy4gVGhlIGZpcnN0IGFyZ3VtZW50IGZvciByZWdleGVjKCkgaW4gdGhlIFBPU0lYIHdyYXBwZXIgc2hvdWxkIGhhdmUgYmVlbgogICBkZWZpbmVkIGFzICJjb25zdCIuCgo0LiBDaGFuZ2VkIHBjcmV0ZXN0IHRvIHVzZSBtYWxsb2MoKSBmb3IgaXRzIGJ1ZmZlcnMgc28gdGhhdCB0aGV5IGNhbiBiZQogICBFbGVjdHJpYyBGZW5jZWQgZm9yIGRlYnVnZ2luZy4KCjUuIFRoZXJlIHdlcmUgc2V2ZXJhbCBwbGFjZXMgaW4gdGhlIGNvZGUgd2hlcmUsIGluIFVURi04IG1vZGUsIFBDUkUgd291bGQgdHJ5CiAgIHRvIHJlYWQgb25lIG9yIG1vcmUgYnl0ZXMgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgc3ViamVjdCBzdHJpbmcuIE9mdGVuIHRoaXMKICAgaGFkIG5vIGVmZmVjdCBvbiBQQ1JFJ3MgYmVoYXZpb3VyLCBidXQgaW4gc29tZSBjaXJjdW1zdGFuY2VzIGl0IGNvdWxkCiAgIHByb3Zva2UgYSBzZWdtZW50YXRpb24gZmF1bHQuCgo2LiBBIGxvb2tiZWhpbmQgYXQgdGhlIHN0YXJ0IG9mIGEgcGF0dGVybiBpbiBVVEYtOCBtb2RlIGNvdWxkIGFsc28gY2F1c2UgUENSRQogICB0byB0cnkgdG8gcmVhZCBvbmUgb3IgbW9yZSBieXRlcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBzdWJqZWN0IHN0cmluZy4KCjcuIEEgbG9va2JlaGluZCBpbiBhIHBhdHRlcm4gbWF0Y2hlZCBpbiBub24tVVRGLTggbW9kZSBvbiBhIFBDUkUgY29tcGlsZWQgd2l0aAogICBVVEYtOCBzdXBwb3J0IGNvdWxkIG1pc2JlaGF2ZSBpbiB2YXJpb3VzIHdheXMgaWYgdGhlIHN1YmplY3Qgc3RyaW5nCiAgIGNvbnRhaW5lZCBieXRlcyB3aXRoIHRoZSAweDgwIGJpdCBzZXQgYW5kIHRoZSAweDQwIGJpdCB1bnNldCBpbiBhIGxvb2tiZWhpbmQKICAgYXJlYS4gKFBDUkUgd2FzIG5vdCBjaGVja2luZyBmb3IgdGhlIFVURi04IG1vZGUgZmxhZywgYW5kIHRyeWluZyB0byBtb3ZlCiAgIGJhY2sgb3ZlciBVVEYtOCBjaGFyYWN0ZXJzLikKCgpWZXJzaW9uIDQuMiAxNC1BcHItMDMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBUeXBvICIjaWYgU1VQUE9SVF9VVEY4IiBpbnN0ZWFkIG9mICIjaWZkZWYgU1VQUE9SVF9VVEY4IiBmaXhlZC4KCjIuIENoYW5nZXMgdG8gdGhlIGJ1aWxkaW5nIHByb2Nlc3MsIHN1cHBsaWVkIGJ5IFJvbmFsZCBMYW5kaGVlci1DaWVzbGFrCiAgICAgW09OX1dJTkRPV1NdOiBuZXcgdmFyaWFibGUsICIjIiBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMKICAgICBbTk9UX09OX1dJTkRPV1NdOiBuZXcgdmFyaWFibGUsICIjIiBvbiBXaW5kb3dzIHBsYXRmb3JtcwogICAgIFtXSU5fUFJFRklYXTogbmV3IHZhcmlhYmxlLCAiY3lnIiBmb3IgQ3lnd2luCiAgICAgKiBNYWtlZmlsZS5pbjogdXNlIGF1dG9jb25mIHN1YnN0aXR1dGlvbiBmb3IgT0JKRVhULCBFWEVFWFQsIEJVSUxEX09CSkVYVAogICAgICAgYW5kIEJVSUxEX0VYRUVYVAogICAgIE5vdGU6IGF1dG9tYXRpYyBzZXR0aW5nIG9mIHRoZSBCVUlMRCB2YXJpYWJsZXMgaXMgbm90IHlldCB3b3JraW5nCiAgICAgc2V0IENQUEZMQUdTIGFuZCBCVUlMRF9DUFBGTEFHUyAoYnV0IGRvbid0IHVzZSB5ZXQpIC0gc2hvdWxkIGJlIHVzZWQgYXQKICAgICAgIGNvbXBpbGUtdGltZSBidXQgbm90IGF0IGxpbmstdGltZQogICAgIFtMSU5LXTogdXNlIGZvciBsaW5raW5nIGV4ZWN1dGFibGVzIG9ubHkKICAgICBtYWtlIGRpZmZlcmVudCB2ZXJzaW9ucyBmb3IgV2luZG93cyBhbmQgbm9uLVdpbmRvd3MKICAgICBbTElOS0xJQl06IG5ldyB2YXJpYWJsZSwgY29weSBvZiBVTklYLXN0eWxlIExJTkssIHVzZWQgZm9yIGxpbmtpbmcKICAgICAgIGxpYnJhcmllcwogICAgIFtMSU5LX0ZPUl9CVUlMRF06IG5ldyB2YXJpYWJsZQogICAgIFtPQkpFWFRdOiB1c2UgdGhyb3VnaG91dAogICAgIFtFWEVFWFRdOiB1c2UgdGhyb3VnaG91dAogICAgIDx3aW5zaGFyZWQ+OiBuZXcgdGFyZ2V0CiAgICAgPHdpbmluc3RhbGw+OiBuZXcgdGFyZ2V0CiAgICAgPGRmdGFibGVzLm8+OiB1c2UgbmF0aXZlIGNvbXBpbGVyCiAgICAgPGRmdGFibGVzPjogdXNlIG5hdGl2ZSBsaW5rZXIKICAgICA8aW5zdGFsbD46IGhhbmRsZSBXaW5kb3dzIHBsYXRmb3JtIGNvcnJlY3RseQogICAgIDxjbGVhbj46IGRpdHRvCiAgICAgPGNoZWNrPjogZGl0dG8KICAgICBjb3B5IERMTCB0byB0b3AgYnVpbGRkaXIgYmVmb3JlIHRlc3RpbmcKCiAgIEFzIHBhcnQgb2YgdGhlc2UgY2hhbmdlcywgLW5vLXVuZGVmaW5lZCB3YXMgcmVtb3ZlZCBhZ2Fpbi4gVGhpcyB3YXMgcmVwb3J0ZWQKICAgdG8gZ2l2ZSB0cm91YmxlIG9uIEhQLVVYIDExLjAsIHNvIGdldHRpbmcgcmlkIG9mIGl0IHNlZW1zIGxpa2UgYSBnb29kIGlkZWEKICAgaW4gYW55IGNhc2UuCgozLiBTb21lIHRpZGllcyB0byBnZXQgcmlkIG9mIGNvbXBpbGVyIHdhcm5pbmdzOgoKICAgLiBJbiB0aGUgbWF0Y2hfZGF0YSBzdHJ1Y3R1cmUsIG1hdGNoX2xpbWl0IHdhcyBhbiB1bnNpZ25lZCBsb25nIGludCwgd2hlcmVhcwogICAgIG1hdGNoX2NhbGxfY291bnQgd2FzIGFuIGludC4gSSd2ZSBtYWRlIHRoZW0gYm90aCB1bnNpZ25lZCBsb25nIGludHMuCgogICAuIEluIHBjcmV0ZXN0IHRoZSBmYWN0IHRoYXQgYSBjb25zdCB1c2NoYXIgKiBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgY2FzdCB0bwogICAgIGEgdm9pZCAqIHByb3Zva2VkIGEgd2FybmluZy4KCiAgIC4gVHVybmluZyBvbiBzb21lIG1vcmUgY29tcGlsZXIgd2FybmluZ3MgdGhyZXcgdXAgc29tZSAic2hhZG93IiB2YXJpYWJsZXMKICAgICBhbmQgYSBmZXcgbW9yZSBtaXNzaW5nIGNhc3RzLgoKNC4gSWYgUENSRSB3YXMgY29tcGxpZWQgd2l0aCBVVEYtOCBzdXBwb3J0LCBidXQgY2FsbGVkIHdpdGhvdXQgdGhlIFBDUkVfVVRGOAogICBvcHRpb24sIGEgY2xhc3MgdGhhdCBjb250YWluZWQgYSBzaW5nbGUgY2hhcmFjdGVyIHdpdGggYSB2YWx1ZSBiZXR3ZWVuIDEyOAogICBhbmQgMjU1IChlLmcuIC9bXHhGRl0vKSBjYXVzZWQgUENSRSB0byBjcmFzaC4KCjUuIElmIFBDUkUgd2FzIGNvbXBpbGVkIHdpdGggVVRGLTggc3VwcG9ydCwgYnV0IGNhbGxlZCB3aXRob3V0IHRoZSBQQ1JFX1VURjgKICAgb3B0aW9uLCBhIGNsYXNzIHRoYXQgY29udGFpbmVkIHNldmVyYWwgY2hhcmFjdGVycywgYnV0IHdpdGggYXQgbGVhc3Qgb25lCiAgIHdob3NlIHZhbHVlIHdhcyBiZXR3ZWVuIDEyOCBhbmQgMjU1IGNhdXNlZCBQQ1JFIHRvIGNyYXNoLgoKClZlcnNpb24gNC4xIDEyLU1hci0wMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuIENvbXBpbGluZyB3aXRoIGdjYyAtcGVkYW50aWMgZm91bmQgYSBjb3VwbGUgb2YgcGxhY2VzIHdoZXJlIGNhc3RzIHdlcmUKbmVlZGVkLCBhbmQgYSBzdHJpbmcgaW4gZGZ0YWJsZXMuYyB0aGF0IHdhcyBsb25nZXIgdGhhbiBzdGFuZGFyZCBjb21waWxlcnMgYXJlCnJlcXVpcmVkIHRvIHN1cHBvcnQuCgoyLiBDb21waWxpbmcgd2l0aCBTdW4ncyBjb21waWxlciBmb3VuZCBhIGZldyBtb3JlIHBsYWNlcyB3aGVyZSB0aGUgY29kZSBjb3VsZApiZSB0aWRpZWQgdXAgaW4gb3JkZXIgdG8gYXZvaWQgd2FybmluZ3MuCgozLiBUaGUgdmFyaWFibGVzIGZvciBjcm9zcy1jb21waWxpbmcgd2VyZSBjYWxsZWQgSE9TVF9DQyBhbmQgSE9TVF9DRkxBR1M7IHRoZQpmaXJzdCBvZiB0aGVzZSBuYW1lcyBpcyBkZXByZWNhdGVkIGluIHRoZSBsYXRlc3QgQXV0b2NvbmYgaW4gZmF2b3VyIG9mIHRoZSBuYW1lCkNDX0ZPUl9CVUlMRCwgYmVjYXVzZSAiaG9zdCIgaXMgdHlwaWNhbGx5IHVzZWQgdG8gbWVhbiB0aGUgc3lzdGVtIG9uIHdoaWNoIHRoZQpjb21waWxlZCBjb2RlIHdpbGwgYmUgcnVuLiBJIGNhbid0IGZpbmQgYSByZWZlcmVuY2UgZm9yIEhPU1RfQ0ZMQUdTLCBidXQgYnkKYW5hbG9neSBJIGhhdmUgY2hhbmdlZCBpdCB0byBDRkxBR1NfRk9SX0JVSUxELgoKNC4gQWRkZWQgLW5vLXVuZGVmaW5lZCB0byB0aGUgbGlua2luZyBjb21tYW5kIGluIHRoZSBNYWtlZmlsZSwgYmVjYXVzZSB0aGlzIGlzCmFwcGFyZW50bHkgaGVscGZ1bCBmb3IgV2luZG93cy4gVG8gbWFrZSBpdCB3b3JrLCBhbHNvIGFkZGVkICItTC4gLWxwY3JlIiB0byB0aGUKbGlua2luZyBzdGVwIGZvciB0aGUgcGNyZXBvc2l4IGxpYnJhcnkuCgo1LiBQQ1JFIHdhcyBmYWlsaW5nIHRvIGRpYWdub3NlIHRoZSBjYXNlIG9mIHR3byBuYW1lZCBncm91cHMgd2l0aCB0aGUgc2FtZQpuYW1lLgoKNi4gQSBwcm9ibGVtIHdpdGggb25lIG9mIFBDUkUncyBvcHRpbWl6YXRpb25zIHdhcyBkaXNjb3ZlcmVkLiBQQ1JFIHJlbWVtYmVycyBhCmxpdGVyYWwgY2hhcmFjdGVyIHRoYXQgaXMgbmVlZGVkIGluIHRoZSBzdWJqZWN0IGZvciBhIG1hdGNoLCBhbmQgc2NhbnMgYWxvbmcgdG8KZW5zdXJlIHRoYXQgaXQgaXMgcHJlc2VudCBiZWZvcmUgZW1iYXJraW5nIG9uIHRoZSBmdWxsIG1hdGNoaW5nIHByb2Nlc3MuIFRoaXMKc2F2ZXMgdGltZSBpbiBjYXNlcyBvZiBuZXN0ZWQgdW5saW1pdGVkIHJlcGVhdHMgdGhhdCBhcmUgbmV2ZXIgZ29pbmcgdG8gbWF0Y2guClByb2JsZW06IHRoZSBzY2FuIGNhbiB0YWtlIGEgbG90IG9mIHRpbWUgaWYgdGhlIHN1YmplY3QgaXMgdmVyeSBsb25nIChlLmcuCm1lZ2FieXRlcyksIHRodXMgcGVuYWxpemluZyBzdHJhaWdodGZvcndhcmQgbWF0Y2hlcy4gSXQgaXMgbm93IGRvbmUgb25seSBpZiB0aGUKYW1vdW50IG9mIHN1YmplY3QgdG8gYmUgc2Nhbm5lZCBpcyBsZXNzIHRoYW4gMTAwMCBieXRlcy4KCjcuIEEgbGVzc2VyIHByb2JsZW0gd2l0aCB0aGUgc2FtZSBvcHRpbWl6YXRpb24gaXMgdGhhdCBpdCB3YXMgcmVjb3JkaW5nIHRoZQpmaXJzdCBjaGFyYWN0ZXIgb2YgYW4gYW5jaG9yZWQgcGF0dGVybiBhcyAibmVlZGVkIiwgdGh1cyBwcm92b2tpbmcgYSBzZWFyY2gKcmlnaHQgYWxvbmcgdGhlIHN1YmplY3QsIGV2ZW4gd2hlbiB0aGUgZmlyc3QgbWF0Y2ggb2YgdGhlIHBhdHRlcm4gd2FzIGdvaW5nIHRvCmZhaWwuIFRoZSAibmVlZGVkIiBjaGFyYWN0ZXIgaXMgbm93IG5vdCBzZXQgZm9yIGFuY2hvcmVkIHBhdHRlcm5zLCB1bmxlc3MgaXQKZm9sbG93cyBzb21ldGhpbmcgaW4gdGhlIHBhdHRlcm4gdGhhdCBpcyBvZiBub24tZml4ZWQgbGVuZ3RoLiBUaHVzLCBpdCBzdGlsbApmdWxmaWxzIGl0cyBvcmlnaW5hbCBwdXJwb3NlIG9mIGZpbmRpbmcgcXVpY2sgbm9uLW1hdGNoZXMgaW4gY2FzZXMgb2YgbmVzdGVkCnVubGltaXRlZCByZXBlYXRzLCBidXQgaXNuJ3QgdXNlZCBmb3Igc2ltcGxlIGFuY2hvcmVkIHBhdHRlcm5zIHN1Y2ggYXMgL15hYmMvLgoKClZlcnNpb24gNC4wIDE3LUZlYi0wMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuIElmIGEgY29tbWVudCBpbiBhbiBleHRlbmRlZCByZWdleCB0aGF0IHN0YXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBtZXRhLWl0ZW0KZXh0ZW5kZWQgdG8gdGhlIGVuZCBvZiBzdHJpbmcsIFBDUkUgY29tcGlsZWQgaW5jb3JyZWN0IGRhdGEuIFRoaXMgY291bGQgbGVhZCB0bwphbGwga2luZHMgb2Ygd2VpcmQgZWZmZWN0cy4gRXhhbXBsZTogLyMvIHdhcyBiYWQ7IC8oKSMvIHdhcyBiYWQ7IC9hIy8gd2FzIG5vdC4KCjIuIE1vdmVkIHRvIGF1dG9jb25mIDIuNTMgYW5kIGxpYnRvb2wgMS40LjIuCgozLiBQZXJsIDUuOCBubyBsb25nZXIgbmVlZHMgInVzZSB1dGY4IiBmb3IgZG9pbmcgVVRGLTggdGhpbmdzLiBDb25zZXF1ZW50bHksCnRoZSBzcGVjaWFsIHBlcmx0ZXN0OCBzY3JpcHQgaXMgbm8gbG9uZ2VyIG5lZWRlZCAtIGFsbCB0aGUgdGVzdHMgY2FuIGJlIHJ1bgpmcm9tIGEgc2luZ2xlIHBlcmx0ZXN0IHNjcmlwdC4KCjQuIEZyb20gNS4wMDQsIFBlcmwgaGFzIG5vdCBpbmNsdWRlZCB0aGUgVlQgY2hhcmFjdGVyICgweDBiKSBpbiB0aGUgc2V0IGRlZmluZWQKYnkgXHMuIEl0IGhhcyBub3cgYmVlbiByZW1vdmVkIGluIFBDUkUuIFRoaXMgbWVhbnMgaXQgaXNuJ3QgcmVjb2duaXplZCBhcwp3aGl0ZXNwYWNlIGluIC94IHJlZ2V4ZXMgdG9vLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBQZXJsLiBOb3RlIHRoYXQgdGhlIFBPU0lYCmNsYXNzIFs6c3BhY2U6XSAqZG9lcyogaW5jbHVkZSBWVCwgdGhlcmVieSBjcmVhdGluZyBhIG1lc3MuCgo1LiBBZGRlZCB0aGUgY2xhc3MgWzpibGFuazpdIChhIEdOVSBleHRlbnNpb24gZnJvbSBQZXJsIDUuOCkgdG8gbWF0Y2ggb25seQpzcGFjZSBhbmQgdGFiLgoKNi4gUGVybCA1LjAwNSB3YXMgYSBsb25nIHRpbWUgYWdvLiBJdCdzIHRpbWUgdG8gYW1hbGdhbWF0ZSB0aGUgdGVzdHMgdGhhdCB1c2UKaXRzIG5ldyBmZWF0dXJlcyBpbnRvIHRoZSBtYWluIHRlc3Qgc2NyaXB0LCByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHNjcmlwdHMuCgo3LiBQZXJsIDUuOCBoYXMgY2hhbmdlZCB0aGUgbWVhbmluZyBvZiBwYXR0ZXJucyBsaWtlIC9hKD9pKWIvLiBFYXJsaWVyIHZlcnNpb25zCndlcmUgYmFja3dhcmQgY29tcGF0aWJsZSwgYW5kIG1hZGUgdGhlICg/aSkgYXBwbHkgdG8gdGhlIHdob2xlIHBhdHRlcm4sIGFzIGlmCi9pIHdlcmUgZ2l2ZW4uIE5vdyBpdCBiZWhhdmVzIG1vcmUgbG9naWNhbGx5LCBhbmQgYXBwbGllcyB0aGUgb3B0aW9uIHNldHRpbmcKb25seSB0byB3aGF0IGZvbGxvd3MuIFBDUkUgaGFzIGJlZW4gY2hhbmdlZCB0byBmb2xsb3cgc3VpdC4gSG93ZXZlciwgaWYgaXQKZmluZHMgb3B0aW9ucyBzZXR0aW5ncyByaWdodCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhdHRlcm4sIGl0IGV4dHJhY3RzIHRoZW0gaW50bwp0aGUgZ2xvYmFsIG9wdGlvbnMsIGFzIGJlZm9yZS4gVGh1cywgdGhleSBzaG93IHVwIGluIHRoZSBpbmZvIGRhdGEuCgo4LiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgXFEuLi5cRSBlc2NhcGUgc2VxdWVuY2UuIENoYXJhY3RlcnMgaW4gYmV0d2VlbiBhcmUKdHJlYXRlZCBhcyBsaXRlcmFscy4gVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBQZXJsIGluIHRoYXQgJCBhbmQgQCBhcmUKYWxzbyBoYW5kbGVkIGFzIGxpdGVyYWxzIGluc2lkZSB0aGUgcXVvdGVzLiBJbiBQZXJsLCB0aGV5IHdpbGwgY2F1c2UgdmFyaWFibGUKaW50ZXJwb2xhdGlvbi4gTm90ZSB0aGUgZm9sbG93aW5nIGV4YW1wbGVzOgoKICAgIFBhdHRlcm4gICAgICAgICAgICBQQ1JFIG1hdGNoZXMgICAgICBQZXJsIG1hdGNoZXMKCiAgICBcUWFiYyR4eXpcRSAgICAgICAgYWJjJHh5eiAgICAgICAgICAgYWJjIGZvbGxvd2VkIGJ5IHRoZSBjb250ZW50cyBvZiAkeHl6CiAgICBcUWFiY1wkeHl6XEUgICAgICAgYWJjXCR4eXogICAgICAgICAgYWJjXCR4eXoKICAgIFxRYWJjXEVcJFxReHl6XEUgICBhYmMkeHl6ICAgICAgICAgICBhYmMkeHl6CgpGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFBlcmwsIFxRLi4uXEUgc2VxdWVuY2VzIGFyZSByZWNvZ25pemVkIGluc2lkZSBjaGFyYWN0ZXIKY2xhc3NlcyBhcyB3ZWxsIGFzIG91dHNpZGUgdGhlbS4KCjkuIFJlLW9yZ2FuaXplZCAzIGNvZGUgc3RhdGVtZW50cyBpbiBwY3JldGVzdCB0byBhdm9pZCAib3ZlcmZsb3cgaW4KZmxvYXRpbmctcG9pbnQgY29uc3RhbnQgYXJpdGhtZXRpYyIgd2FybmluZ3MgZnJvbSBhIE1pY3Jvc29mdCBjb21waWxlci4gQWRkZWQgYQooc2l6ZV90KSBjYXN0IHRvIG9uZSBzdGF0ZW1lbnQgaW4gcGNyZXRlc3QgYW5kIG9uZSBpbiBwY3JlcG9zaXggdG8gYXZvaWQKc2lnbmVkL3Vuc2lnbmVkIHdhcm5pbmdzLgoKMTAuIFN1bk9TNCBkb2Vzbid0IGhhdmUgc3RydG91bCgpLiBUaGlzIHdhcyB1c2VkIG9ubHkgZm9yIHVucGlja2luZyB0aGUgLW8Kb3B0aW9uIGZvciBwY3JldGVzdCwgc28gSSd2ZSByZXBsYWNlZCBpdCBieSBhIHNpbXBsZSBmdW5jdGlvbiB0aGF0IGRvZXMganVzdAp0aGF0IGpvYi4KCjExLiBwY3JlZ3JlcCB3YXMgZW5kaW5nIHdpdGggY29kZSAwIGluc3RlYWQgb2YgMiBmb3IgdGhlIGNvbW1hbmRzICJwY3JlZ3JlcCIgb3IKInBjcmVncmVwIC0iLgoKMTIuIEFkZGVkICJwb3NzZXNzaXZlIHF1YW50aWZpZXJzIiA/KywgKissICsrLCBhbmQgeyx9KyB3aGljaCBjb21lIGZyb20gU3VuJ3MKSmF2YSBwYWNrYWdlLiBUaGlzIHByb3ZpZGVzIHNvbWUgc3ludGFjdGljIHN1Z2FyIGZvciBzaW1wbGUgY2FzZXMgb2Ygd2hhdCBteQpkb2N1bWVudGF0aW9uIGNhbGxzICJvbmNlLW9ubHkgc3VicGF0dGVybnMiLiBBIHBhdHRlcm4gc3VjaCBhcyB4KisgaXMgdGhlIHNhbWUKYXMgKD8+eCopLiBJbiBvdGhlciB3b3JkcywgaWYgd2hhdCBpcyBpbnNpZGUgKD8+Li4uKSBpcyBqdXN0IGEgc2luZ2xlIHJlcGVhdGVkCml0ZW0sIHlvdSBjYW4gdXNlIHRoaXMgc2ltcGxpZmllZCBub3RhdGlvbi4gTm90ZSB0aGF0IG9ubHkgbWFrZXMgc2Vuc2Ugd2l0aApncmVlZHkgcXVhbnRpZmllcnMuIENvbnNlcXVlbnRseSwgdGhlIHVzZSBvZiB0aGUgcG9zc2Vzc2l2ZSBxdWFudGlmaWVyIGZvcmNlcwpncmVlZGluZXNzLCB3aGF0ZXZlciB0aGUgc2V0dGluZyBvZiB0aGUgUENSRV9VTkdSRUVEWSBvcHRpb24uCgoxMy4gQSBjaGFuZ2Ugb2YgZ3JlZWRpbmVzcyBkZWZhdWx0IHdpdGhpbiBhIHBhdHRlcm4gd2FzIG5vdCB0YWtpbmcgZWZmZWN0IGF0CnRoZSBjdXJyZW50IGxldmVsIGZvciBwYXR0ZXJucyBsaWtlIC8oYisoP1UpYSspLy4gSXQgZGlkIGFwcGx5IHRvIHBhcmVudGhlc2l6ZWQKc3VicGF0dGVybnMgdGhhdCBmb2xsb3dlZC4gUGF0dGVybnMgbGlrZSAvYisoP1UpYSsvIHdvcmtlZCBiZWNhdXNlIHRoZSBvcHRpb24Kd2FzIGFic3RyYWN0ZWQgb3V0c2lkZS4KCjE0LiBQQ1JFIG5vdyBzdXBwb3J0cyB0aGUgXEcgYXNzZXJ0aW9uLiBJdCBpcyB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2hpbmcKcG9zaXRpb24gaXMgYXQgdGhlIHN0YXJ0IHBvaW50IG9mIHRoZSBtYXRjaC4gVGhpcyBkaWZmZXJzIGZyb20gXEEgd2hlbiB0aGUKc3RhcnRpbmcgb2Zmc2V0IGlzIG5vbi16ZXJvLiBVc2VkIHdpdGggdGhlIC9nIG9wdGlvbiBvZiBwY3JldGVzdCAob3Igc2ltaWxhcgpjb2RlKSwgaXQgd29ya3MgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IGRvZXMgZm9yIFBlcmwncyAvZyBvcHRpb24uIElmIGFsbAphbHRlcm5hdGl2ZXMgb2YgYSByZWdleCBiZWdpbiB3aXRoIFxHLCB0aGUgZXhwcmVzc2lvbiBpcyBhbmNob3JlZCB0byB0aGUgc3RhcnQKbWF0Y2ggcG9zaXRpb24sIGFuZCB0aGUgImFuY2hvcmVkIiBmbGFnIGlzIHNldCBpbiB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbi4KCjE1LiBTb21lIGJ1Z3MgY29uY2VybmluZyB0aGUgaGFuZGxpbmcgb2YgY2VydGFpbiBvcHRpb24gY2hhbmdlcyB3aXRoaW4gcGF0dGVybnMKaGF2ZSBiZWVuIGZpeGVkLiBUaGVzZSBhcHBsaWVkIHRvIG9wdGlvbnMgb3RoZXIgdGhhbiAoP2ltcykuIEZvciBleGFtcGxlLAoiYSg/eDogYiBjIClkIiBkaWQgbm90IG1hdGNoICJYYWJjZFkiIGJ1dCBkaWQgbWF0Y2ggIlhhIGIgYyBkWSIuIEl0IHNob3VsZCBoYXZlCmJlZW4gdGhlIG90aGVyIHdheSByb3VuZC4gU29tZSBvZiB0aGlzIHdhcyByZWxhdGVkIHRvIGNoYW5nZSA3IGFib3ZlLgoKMTYuIFBDUkUgbm93IGdpdmVzIGVycm9ycyBmb3IgL1sueC5dLyBhbmQgL1s9eD1dLyBhcyB1bnN1cHBvcnRlZCBQT1NJWApmZWF0dXJlcywgYXMgUGVybCBkb2VzLiBQcmV2aW91c2x5LCBQQ1JFIGdhdmUgdGhlIHdhcm5pbmdzIG9ubHkgZm9yIC9bWy54Ll1dLwphbmQgL1tbPXg9XV0vLiBQQ1JFIG5vdyBhbHNvIGdpdmVzIGFuIGVycm9yIGZvciAvWzpuYW1lOl0vIGJlY2F1c2UgaXQgc3VwcG9ydHMKUE9TSVggY2xhc3NlcyBvbmx5IHdpdGhpbiBhIGNsYXNzIChlLmcuIC9bWzphbHBoYTpdXS8pLgoKMTcuIEFkZGVkIHN1cHBvcnQgZm9yIFBlcmwncyBcQyBlc2NhcGUuIFRoaXMgbWF0Y2hlcyBvbmUgYnl0ZSwgZXZlbiBpbiBVVEY4Cm1vZGUuIFVubGlrZSAiLiIsIGl0IGFsd2F5cyBtYXRjaGVzIG5ld2xpbmUsIHdoYXRldmVyIHRoZSBzZXR0aW5nIG9mClBDUkVfRE9UQUxMLiBIb3dldmVyLCBQQ1JFIGRvZXMgbm90IHBlcm1pdCBcQyB0byBhcHBlYXIgaW4gbG9va2JlaGluZAphc3NlcnRpb25zLiBQZXJsIGFsbG93cyBpdCwgYnV0IGl0IGRvZXNuJ3QgKGluIGdlbmVyYWwpIHdvcmsgYmVjYXVzZSBpdCBjYW4ndApjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbG9va2JlaGluZC4gQXQgbGVhc3QsIHRoYXQncyB0aGUgY2FzZSBmb3IgUGVybAo1LjguMCAtIEkndmUgYmVlbiB0b2xkIHRoZXkgYXJlIGdvaW5nIHRvIGRvY3VtZW50IHRoYXQgaXQgZG9lc24ndCB3b3JrIGluCmZ1dHVyZS4KCjE4LiBBZGRlZCBhbiBlcnJvciBkaWFnbm9zaXMgZm9yIGVzY2FwZXMgdGhhdCBQQ1JFIGRvZXMgbm90IHN1cHBvcnQ6IHRoZXNlIGFyZQpcTCwgXGwsIFxOLCBcUCwgXHAsIFxVLCBcdSwgYW5kIFxYLgoKMTkuIEFsdGhvdWdoIGNvcnJlY3RseSBkaWFnbm9zaW5nIGEgbWlzc2luZyAnXScgaW4gYSBjaGFyYWN0ZXIgY2xhc3MsIFBDUkUgd2FzCnJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuIGluIGNhc2VzIHN1Y2ggYXMgL1thYmNkLy4KCjIwLiBQQ1JFIHdhcyBnZXR0aW5nIG1vcmUgbWVtb3J5IHRoYW4gbmVjZXNzYXJ5IGZvciBwYXR0ZXJucyB3aXRoIGNsYXNzZXMgdGhhdApjb250YWluZWQgYm90aCBQT1NJWCBuYW1lZCBjbGFzc2VzIGFuZCBvdGhlciBjaGFyYWN0ZXJzLCBlLmcuIC9bWzpzcGFjZTpdYWJjLy4KCjIxLiBBZGRlZCBzb21lIGNvZGUsIGNvbmRpdGlvbmFsIG9uICNpZmRlZiBWUENPTVBBVCwgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IKY29tcGlsaW5nIFBDUkUgZm9yIHVzZSB3aXRoIFZpcnR1YWwgUGFzY2FsLgoKMjIuIFNtYWxsIGZpeCB0byB0aGUgTWFrZWZpbGUgdG8gbWFrZSBpdCB3b3JrIHByb3Blcmx5IGlmIHRoZSBidWlsZCBpcyBkb25lCm91dHNpZGUgdGhlIHNvdXJjZSB0cmVlLgoKMjMuIEFkZGVkIGEgbmV3IGV4dGVuc2lvbjogYSBjb25kaXRpb24gdG8gZ28gd2l0aCByZWN1cnNpb24uIElmIGEgY29uZGl0aW9uYWwKc3VicGF0dGVybiBzdGFydHMgd2l0aCAoPyhSKSB0aGUgInRydWUiIGJyYW5jaCBpcyB1c2VkIGlmIHJlY3Vyc2lvbiBoYXMKaGFwcGVuZWQsIHdoZXJlYXMgdGhlICJmYWxzZSIgYnJhbmNoIGlzIHVzZWQgb25seSBhdCB0aGUgdG9wIGxldmVsLgoKMjQuIFdoZW4gdGhlcmUgd2FzIGEgdmVyeSBsb25nIHN0cmluZyBvZiBsaXRlcmFsIGNoYXJhY3RlcnMgKG92ZXIgMjU1IGJ5dGVzCndpdGhvdXQgVVRGIHN1cHBvcnQsIG92ZXIgMjUwIGJ5dGVzIHdpdGggVVRGIHN1cHBvcnQpLCB0aGUgY29tcHV0YXRpb24gb2YgaG93Cm11Y2ggbWVtb3J5IHdhcyByZXF1aXJlZCBjb3VsZCBiZSBpbmNvcnJlY3QsIGxlYWRpbmcgdG8gc2VnZmF1bHRzIG9yIG90aGVyCnN0cmFuZ2UgZWZmZWN0cy4KCjI1LiBQQ1JFIHdhcyBpbmNvcnJlY3RseSBhc3N1bWluZyBhbmNob3JpbmcgKGVpdGhlciB0byBzdGFydCBvZiBzdWJqZWN0IG9yIHRvCnN0YXJ0IG9mIGxpbmUgZm9yIGEgbm9uLURPVEFMTCBwYXR0ZXJuKSB3aGVuIGEgcGF0dGVybiBzdGFydGVkIHdpdGggKC4qKSBhbmQKdGhlcmUgd2FzIGEgc3Vic2VxdWVudCBiYWNrIHJlZmVyZW5jZSB0byB0aG9zZSBicmFja2V0cy4gVGhpcyBtZWFudCB0aGF0LCBmb3IKZXhhbXBsZSwgLyguKilcZCtcMS8gZmFpbGVkIHRvIG1hdGNoICJhYmMxMjNiYyIuIFVuZm9ydHVuYXRlbHksIGl0IGlzbid0CnBvc3NpYmxlIHRvIGNoZWNrIGZvciBwcmVjaXNlbHkgdGhpcyBjYXNlLiBBbGwgd2UgY2FuIGRvIGlzIGFiYW5kb24gdGhlCm9wdGltaXphdGlvbiBpZiAuKiBvY2N1cnMgaW5zaWRlIGNhcHR1cmluZyBicmFja2V0cyB3aGVuIHRoZXJlIGFyZSBhbnkgYmFjawpyZWZlcmVuY2VzIHdoYXRzb2V2ZXIuIChTZWUgYmVsb3cgZm9yIGEgYmV0dGVyIGZpeCB0aGF0IGNhbWUgbGF0ZXIuKQoKMjYuIFRoZSBoYW5kbGluZyBvZiB0aGUgb3B0aW1pemF0aW9uIGZvciBmaW5kaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYQpub24tYW5jaG9yZWQgcGF0dGVybiwgYW5kIGZvciBmaW5kaW5nIGEgY2hhcmFjdGVyIHRoYXQgaXMgcmVxdWlyZWQgbGF0ZXIgaW4gdGhlCm1hdGNoIHdlcmUgZmFpbGluZyBpbiBzb21lIGNhc2VzLiBUaGlzIGRpZG4ndCBicmVhayB0aGUgbWF0Y2hpbmc7IGl0IGp1c3QKZmFpbGVkIHRvIG9wdGltaXplIHdoZW4gaXQgY291bGQuIFRoZSB3YXkgdGhpcyBpcyBkb25lIGhhcyBiZWVuIHJlLWltcGxlbWVudGVkLgoKMjcuIEZpeGVkIHR5cG8gaW4gZXJyb3IgbWVzc2FnZSBmb3IgaW52YWxpZCAoP1IgaXRlbSAoaXQgc2FpZCAiKD9wIikuCgoyOC4gQWRkZWQgYSBuZXcgZmVhdHVyZSB0aGF0IHByb3ZpZGVzIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgdGhhdCBQZXJsCnByb3ZpZGVzIHdpdGggKD97Li4ufSkuIFRoZSBmYWNpbGl0eSBpcyB0ZXJtZWQgYSAiY2FsbG91dCIuIFRoZSB3YXkgaXQgaXMgZG9uZQppbiBQQ1JFIGlzIGZvciB0aGUgY2FsbGVyIHRvIHByb3ZpZGUgYW4gb3B0aW9uYWwgZnVuY3Rpb24sIGJ5IHNldHRpbmcKcGNyZV9jYWxsb3V0IHRvIGl0cyBlbnRyeSBwb2ludC4gTGlrZSBwY3JlX21hbGxvYyBhbmQgcGNyZV9mcmVlLCB0aGlzIGlzIGEKZ2xvYmFsIHZhcmlhYmxlLiBCeSBkZWZhdWx0IGl0IGlzIHVuc2V0LCB3aGljaCBkaXNhYmxlcyBhbGwgY2FsbGluZyBvdXQuIFRvIGdldAp0aGUgZnVuY3Rpb24gY2FsbGVkLCB0aGUgcmVnZXggbXVzdCBpbmNsdWRlICg/QykgYXQgYXBwcm9wcmlhdGUgcG9pbnRzLiBUaGlzCmlzLCBpbiBmYWN0LCBlcXVpdmFsZW50IHRvICg/QzApLCBhbmQgYW55IG51bWJlciA8PSAyNTUgbWF5IGJlIGdpdmVuIHdpdGggKD9DKS4KVGhpcyBwcm92aWRlcyBhIG1lYW5zIG9mIGlkZW50aWZ5aW5nIGRpZmZlcmVudCBjYWxsb3V0IHBvaW50cy4gV2hlbiBQQ1JFCnJlYWNoZXMgc3VjaCBhIHBvaW50IGluIHRoZSByZWdleCwgaWYgcGNyZV9jYWxsb3V0IGhhcyBiZWVuIHNldCwgdGhlIGV4dGVybmFsCmZ1bmN0aW9uIGlzIGNhbGxlZC4gSXQgaXMgcHJvdmlkZWQgd2l0aCBkYXRhIGluIGEgc3RydWN0dXJlIGNhbGxlZApwY3JlX2NhbGxvdXRfYmxvY2ssIHdoaWNoIGlzIGRlZmluZWQgaW4gcGNyZS5oLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyAwLAptYXRjaGluZyBjb250aW51ZXM7IGlmIGl0IHJldHVybnMgYSBub24temVybyB2YWx1ZSwgdGhlIG1hdGNoIGF0IHRoZSBjdXJyZW50CnBvaW50IGZhaWxzLiBIb3dldmVyLCBiYWNrdHJhY2tpbmcgd2lsbCBvY2N1ciBpZiBwb3NzaWJsZS4gW1RoaXMgd2FzIGNoYW5nZWQKbGF0ZXIgYW5kIG90aGVyIGZlYXR1cmVzIGFkZGVkIC0gc2VlIGl0ZW0gNDkgYmVsb3cuXQoKMjkuIHBjcmV0ZXN0IGlzIHVwZ3JhZGVkIHRvIHRlc3QgdGhlIGNhbGxvdXQgZnVuY3Rpb25hbGl0eS4gSXQgcHJvdmlkZXMgYQpjYWxsb3V0IGZ1bmN0aW9uIHRoYXQgZGlzcGxheXMgaW5mb3JtYXRpb24uIEJ5IGRlZmF1bHQsIGl0IHNob3dzIHRoZSBzdGFydCBvZgp0aGUgbWF0Y2ggYW5kIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSB0ZXh0LiBUaGVyZSBhcmUgc29tZSBuZXcgZGF0YSBlc2NhcGVzCnRvIHZhcnkgd2hhdCBoYXBwZW5zOgoKICAgIFxDKyAgICAgICAgIGluIGFkZGl0aW9uLCBzaG93IGN1cnJlbnQgY29udGVudHMgb2YgY2FwdHVyZWQgc3Vic3RyaW5ncwogICAgXEMtICAgICAgICAgZG8gbm90IHN1cHBseSBhIGNhbGxvdXQgZnVuY3Rpb24KICAgIFxDIW4gICAgICAgIHJldHVybiAxIHdoZW4gY2FsbG91dCBudW1iZXIgbiBpcyByZWFjaGVkCiAgICBcQyFuIW0gICAgICByZXR1cm4gMSB3aGVuIGNhbGxvdXQgbnVtYmVyIG4gaXMgcmVhY2hlZCBmb3IgdGhlIG10aCB0aW1lCgozMC4gSWYgcGNyZWdyZXAgd2FzIGNhbGxlZCB3aXRoIHRoZSAtbCBvcHRpb24gYW5kIGp1c3QgYSBzaW5nbGUgZmlsZSBuYW1lLCBpdApvdXRwdXQgIjxzdGRpbj4iIGlmIGEgbWF0Y2ggd2FzIGZvdW5kLCBpbnN0ZWFkIG9mIHRoZSBmaWxlIG5hbWUuCgozMS4gSW1wcm92ZSB0aGUgZWZmaWNpZW5jeSBvZiB0aGUgUE9TSVggQVBJIHRvIFBDUkUuIElmIHRoZSBudW1iZXIgb2YgY2FwdHVyaW5nCnNsb3RzIGlzIGxlc3MgdGhhbiBQT1NJWF9NQUxMT0NfVEhSRVNIT0xELCB1c2UgYSBibG9jayBvbiB0aGUgc3RhY2sgdG8gcGFzcyB0bwpwY3JlX2V4ZWMoKS4gVGhpcyBzYXZlcyBhIG1hbGxvYy9mcmVlIHBlciBjYWxsLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZgpQT1NJWF9NQUxMT0NfVEhSRVNIT0xEIGlzIDEwOyBpdCBjYW4gYmUgY2hhbmdlZCBieSAtLXdpdGgtcG9zaXgtbWFsbG9jLXRocmVzaG9sZAp3aGVuIGNvbmZpZ3VyaW5nLgoKMzIuIFRoZSBkZWZhdWx0IG1heGltdW0gc2l6ZSBvZiBhIGNvbXBpbGVkIHBhdHRlcm4gaXMgNjRLLiBUaGVyZSBoYXZlIGJlZW4gYQpmZXcgY2FzZXMgb2YgcGVvcGxlIGhpdHRpbmcgdGhpcyBsaW1pdC4gVGhlIGNvZGUgbm93IHVzZXMgbWFjcm9zIHRvIGhhbmRsZSB0aGUKc3RvcmluZyBvZiBsaW5rcyBhcyBvZmZzZXRzIHdpdGhpbiB0aGUgY29tcGlsZWQgcGF0dGVybi4gSXQgZGVmYXVsdHMgdG8gMi1ieXRlCmxpbmtzLCBidXQgdGhpcyBjYW4gYmUgY2hhbmdlZCB0byAzIG9yIDQgYnl0ZXMgYnkgLS13aXRoLWxpbmstc2l6ZSB3aGVuCmNvbmZpZ3VyaW5nLiBUZXN0cyAyIGFuZCA1IHdvcmsgb25seSB3aXRoIDItYnl0ZSBsaW5rcyBiZWNhdXNlIHRoZXkgb3V0cHV0CmRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dCBjb21waWxlZCBwYXR0ZXJucy4KCjMzLiBJbnRlcm5hbCBjb2RlIHJlLWFycmFuZ2VtZW50czoKCihhKSBNb3ZlZCB0aGUgZGVidWdnaW5nIGZ1bmN0aW9uIGZvciBwcmludGluZyBvdXQgYSBjb21waWxlZCByZWdleCBpbnRvCiAgICBpdHMgb3duIHNvdXJjZSBmaWxlIChwcmludGludC5jKSBhbmQgdXNlZCAjaW5jbHVkZSB0byBwdWxsIGl0IGludG8KICAgIHBjcmV0ZXN0LmMgYW5kLCB3aGVuIERFQlVHIGlzIGRlZmluZWQsIGludG8gcGNyZS5jLCBpbnN0ZWFkIG9mIGhhdmluZyB0d28KICAgIHNlcGFyYXRlIGNvcGllcy4KCihiKSBEZWZpbmVkIHRoZSBsaXN0IG9mIG9wLWNvZGUgbmFtZXMgZm9yIGRlYnVnZ2luZyBhcyBhIG1hY3JvIGluCiAgICBpbnRlcm5hbC5oIHNvIHRoYXQgaXQgaXMgbmV4dCB0byB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgb3Bjb2Rlcy4KCihjKSBEZWZpbmVkIGEgdGFibGUgb2Ygb3AtY29kZSBsZW5ndGhzIGZvciBzaW1wbGVyIHNraXBwaW5nIGFsb25nIGNvbXBpbGVkCiAgICBjb2RlLiBUaGlzIGlzIGFnYWluIGEgbWFjcm8gaW4gaW50ZXJuYWwuaCBzbyB0aGF0IGl0IGlzIG5leHQgdG8gdGhlCiAgICBkZWZpbml0aW9uIG9mIHRoZSBvcGNvZGVzLgoKMzQuIEFkZGVkIHN1cHBvcnQgZm9yIHJlY3Vyc2l2ZSBjYWxscyB0byBpbmRpdmlkdWFsIHN1YnBhdHRlcm5zLCBhbG9uZyB0aGUKbGluZXMgb2YgUm9iaW4gSG91c3RvbidzIHBhdGNoIChidXQgaW1wbGVtZW50ZWQgc29tZXdoYXQgZGlmZmVyZW50bHkpLgoKMzUuIEZ1cnRoZXIgbW9kcyB0byB0aGUgTWFrZWZpbGUgdG8gaGVscCBXaW4zMi4gQWxzbywgYWRkZWQgY29kZSB0byBwY3JlZ3JlcCB0bwphbGxvdyBpdCB0byByZWFkIGFuZCBwcm9jZXNzIHdob2xlIGRpcmVjdG9yaWVzIGluIFdpbjMyLiBUaGlzIGNvZGUgd2FzCmNvbnRyaWJ1dGVkIGJ5IExpb25lbCBGb3VycXVhdXg7IGl0IGhhcyBub3QgYmVlbiB0ZXN0ZWQgYnkgbWUuCgozNi4gQWRkZWQgc3VwcG9ydCBmb3IgbmFtZWQgc3VicGF0dGVybnMuIFRoZSBQeXRob24gc3ludGF4ICg/UDxuYW1lPi4uLikgaXMKdXNlZCB0byBuYW1lIGEgZ3JvdXAuIE5hbWVzIGNvbnNpc3Qgb2YgYWxwaGFudW1lcmljcyBhbmQgdW5kZXJzY29yZXMsIGFuZCBtdXN0CmJlIHVuaXF1ZS4gQmFjayByZWZlcmVuY2VzIHVzZSB0aGUgc3ludGF4ICg/UD1uYW1lKSBhbmQgcmVjdXJzaXZlIGNhbGxzIHVzZQooP1A+bmFtZSkgd2hpY2ggaXMgYSBQQ1JFIGV4dGVuc2lvbiB0byB0aGUgUHl0aG9uIGV4dGVuc2lvbi4gR3JvdXBzIHN0aWxsIGhhdmUKbnVtYmVycy4gVGhlIGZ1bmN0aW9uIHBjcmVfZnVsbGluZm8oKSBjYW4gYmUgdXNlZCBhZnRlciBjb21waWxhdGlvbiB0byBleHRyYWN0CmEgbmFtZS9udW1iZXIgbWFwLiBUaGVyZSBhcmUgdGhyZWUgcmVsZXZhbnQgY2FsbHM6CgogIFBDUkVfSU5GT19OQU1FRU5UUllTSVpFICAgICAgICB5aWVsZHMgdGhlIHNpemUgb2YgZWFjaCBlbnRyeSBpbiB0aGUgbWFwCiAgUENSRV9JTkZPX05BTUVDT1VOVCAgICAgICAgICAgIHlpZWxkcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMKICBQQ1JFX0lORk9fTkFNRVRBQkxFICAgICAgICAgICAgeWllbGRzIGEgcG9pbnRlciB0byB0aGUgbWFwLgoKVGhlIG1hcCBpcyBhIHZlY3RvciBvZiBmaXhlZC1zaXplIGVudHJpZXMuIFRoZSBzaXplIG9mIGVhY2ggZW50cnkgZGVwZW5kcyBvbgp0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IG5hbWUgdXNlZC4gVGhlIGZpcnN0IHR3byBieXRlcyBvZiBlYWNoIGVudHJ5IGFyZSB0aGUKZ3JvdXAgbnVtYmVyLCBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QuIFRoZXJlIGZvbGxvd3MgdGhlIGNvcnJlc3BvbmRpbmcKbmFtZSwgemVybyB0ZXJtaW5hdGVkLiBUaGUgbmFtZXMgYXJlIGluIGFscGhhYmV0aWNhbCBvcmRlci4KCjM3LiBNYWtlIHRoZSBtYXhpbXVtIGxpdGVyYWwgc3RyaW5nIGluIHRoZSBjb21waWxlZCBjb2RlIDI1MCBmb3IgdGhlIG5vbi1VVEYtOApjYXNlIGluc3RlYWQgb2YgMjU1LiBNYWtpbmcgaXQgdGhlIHNhbWUgYm90aCB3aXRoIGFuZCB3aXRob3V0IFVURi04IHN1cHBvcnQKbWVhbnMgdGhhdCB0aGUgc2FtZSB0ZXN0IG91dHB1dCB3b3JrcyB3aXRoIGJvdGguCgozOC4gVGhlcmUgd2FzIGEgY2FzZSBvZiBtYWxsb2MoMCkgaW4gdGhlIFBPU0lYIHRlc3RpbmcgY29kZSBpbiBwY3JldGVzdC4gQXZvaWQKY2FsbGluZyBtYWxsb2MoKSB3aXRoIGEgemVybyBhcmd1bWVudC4KCjM5LiBDaGFuZ2UgMjUgYWJvdmUgaGFkIHRvIHJlc29ydCB0byBhIGhlYXZ5LWhhbmRlZCB0ZXN0IGZvciB0aGUgLiogYW5jaG9yaW5nCm9wdGltaXphdGlvbi4gSSd2ZSBpbXByb3ZlZCB0aGluZ3MgYnkga2VlcGluZyBhIGJpdG1hcCBvZiBiYWNrcmVmZXJlbmNlcyB3aXRoCm51bWJlcnMgMS0zMSBzbyB0aGF0IGlmIC4qIG9jY3VycyBpbnNpZGUgY2FwdHVyaW5nIGJyYWNrZXRzIHRoYXQgYXJlIG5vdCBpbgpmYWN0IHJlZmVyZW5jZWQsIHRoZSBvcHRpbWl6YXRpb24gY2FuIGJlIGFwcGxpZWQuIEl0IGlzIHVubGlrZWx5IHRoYXQgYQpyZWxldmFudCBvY2N1cnJlbmNlIG9mIC4qIChpLmUuIG9uZSB3aGljaCBtaWdodCBpbmRpY2F0ZSBhbmNob3Jpbmcgb3IgZm9yY2luZwp0aGUgbWF0Y2ggdG8gZm9sbG93IFxuKSB3aWxsIGFwcGVhciBpbnNpZGUgYnJhY2tldHMgd2l0aCBhIG51bWJlciBncmVhdGVyIHRoYW4KMzEsIGJ1dCBpZiBpdCBkb2VzLCBhbnkgYmFjayByZWZlcmVuY2UgPiAzMSBzdXBwcmVzc2VzIHRoZSBvcHRpbWl6YXRpb24uCgo0MC4gQWRkZWQgYSBuZXcgY29tcGlsZS10aW1lIG9wdGlvbiBQQ1JFX05PX0FVVE9fQ0FQVFVSRS4gVGhpcyBoYXMgdGhlIGVmZmVjdApvZiBkaXNhYmxpbmcgbnVtYmVyZWQgY2FwdHVyaW5nIHBhcmVudGhlc2VzLiBBbnkgb3BlbmluZyBwYXJlbnRoZXNpcyB0aGF0IGlzCm5vdCBmb2xsb3dlZCBieSA/IGJlaGF2ZXMgYXMgaWYgaXQgd2VyZSBmb2xsb3dlZCBieSA/OiBidXQgbmFtZWQgcGFyZW50aGVzZXMKY2FuIHN0aWxsIGJlIHVzZWQgZm9yIGNhcHR1cmluZyAoYW5kIHRoZXkgd2lsbCBhY3F1aXJlIG51bWJlcnMgaW4gdGhlIHVzdWFsCndheSkuCgo0MS4gUmVkZXNpZ25lZCB0aGUgcmV0dXJuIGNvZGVzIGZyb20gdGhlIG1hdGNoKCkgZnVuY3Rpb24gaW50byB5ZXMvbm8vZXJyb3Igc28KdGhhdCBlcnJvcnMgY2FuIGJlIHBhc3NlZCBiYWNrIGZyb20gZGVlcCBpbnNpZGUgdGhlIG5lc3RlZCBjYWxscy4gQSBtYWxsb2MKZmFpbHVyZSB3aGlsZSBpbnNpZGUgYSByZWN1cnNpdmUgc3VicGF0dGVybiBjYWxsIG5vdyBjYXVzZXMgdGhlClBDUkVfRVJST1JfTk9NRU1PUlkgcmV0dXJuIGluc3RlYWQgb2YgcXVpZXRseSBnb2luZyB3cm9uZy4KCjQyLiBJdCBpcyBub3cgcG9zc2libGUgdG8gc2V0IGEgbGltaXQgb24gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgbWF0Y2goKQpmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYSBjYWxsIHRvIHBjcmVfZXhlYygpLiBUaGlzIGZhY2lsaXR5IG1ha2VzIGl0IHBvc3NpYmxlIHRvCmxpbWl0IHRoZSBhbW91bnQgb2YgcmVjdXJzaW9uIGFuZCBiYWNrdHJhY2tpbmcsIHRob3VnaCBub3QgaW4gYSBkaXJlY3RseQpvYnZpb3VzIHdheSwgYmVjYXVzZSB0aGUgbWF0Y2goKSBmdW5jdGlvbiBpcyB1c2VkIGluIGEgbnVtYmVyIG9mIGRpZmZlcmVudApjaXJjdW1zdGFuY2VzLiBUaGUgY291bnQgc3RhcnRzIGZyb20gemVybyBmb3IgZWFjaCBwb3NpdGlvbiBpbiB0aGUgc3ViamVjdApzdHJpbmcgKGZvciBub24tYW5jaG9yZWQgcGF0dGVybnMpLiBUaGUgZGVmYXVsdCBsaW1pdCBpcywgZm9yIGNvbXBhdGliaWxpdHksIGEKbGFyZ2UgbnVtYmVyLCBuYW1lbHkgMTAgMDAwIDAwMC4gWW91IGNhbiBjaGFuZ2UgdGhpcyBpbiB0d28gd2F5czoKCihhKSBXaGVuIGNvbmZpZ3VyaW5nIFBDUkUgYmVmb3JlIG1ha2luZywgeW91IGNhbiB1c2UgLS13aXRoLW1hdGNoLWxpbWl0PW4KICAgIHRvIHNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb21waWxlZCBsaWJyYXJ5LgoKKGIpIEZvciBlYWNoIGNhbGwgdG8gcGNyZV9leGVjKCksIHlvdSBjYW4gcGFzcyBhIHBjcmVfZXh0cmEgYmxvY2sgaW4gd2hpY2gKICAgIGEgZGlmZmVyZW50IHZhbHVlIGlzIHNldC4gU2VlIDQ1IGJlbG93LgoKSWYgdGhlIGxpbWl0IGlzIGV4Y2VlZGVkLCBwY3JlX2V4ZWMoKSByZXR1cm5zIFBDUkVfRVJST1JfTUFUQ0hMSU1JVC4KCjQzLiBBZGRlZCBhIG5ldyBmdW5jdGlvbiBwY3JlX2NvbmZpZyhpbnQsIHZvaWQgKikgdG8gZW5hYmxlIHJ1bi10aW1lIGV4dHJhY3Rpb24Kb2YgdGhpbmdzIHRoYXQgY2FuIGJlIGNoYW5nZWQgYXQgY29tcGlsZSB0aW1lLiBUaGUgZmlyc3QgYXJndW1lbnQgc3BlY2lmaWVzCndoYXQgaXMgd2FudGVkIGFuZCB0aGUgc2Vjb25kIHBvaW50cyB0byB3aGVyZSB0aGUgaW5mb3JtYXRpb24gaXMgdG8gYmUgcGxhY2VkLgpUaGUgY3VycmVudCBsaXN0IG9mIGF2YWlsYWJsZSBpbmZvcm1hdGlvbiBpczoKCiAgUENSRV9DT05GSUdfVVRGOAoKVGhlIG91dHB1dCBpcyBhbiBpbnRlZ2VyIHRoYXQgaXMgc2V0IHRvIG9uZSBpZiBVVEYtOCBzdXBwb3J0IGlzIGF2YWlsYWJsZTsKb3RoZXJ3aXNlIGl0IGlzIHNldCB0byB6ZXJvLgoKICBQQ1JFX0NPTkZJR19ORVdMSU5FCgpUaGUgb3V0cHV0IGlzIGFuIGludGVnZXIgdGhhdCBpdCBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjb2RlIHRoYXQgaXMgdXNlZCBmb3IKbmV3bGluZS4gSXQgaXMgZWl0aGVyIExGICgxMCkgb3IgQ1IgKDEzKS4KCiAgUENSRV9DT05GSUdfTElOS19TSVpFCgpUaGUgb3V0cHV0IGlzIGFuIGludGVnZXIgdGhhdCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgZm9yIGludGVybmFsCmxpbmthZ2UgaW4gY29tcGlsZWQgZXhwcmVzc2lvbnMuIFRoZSB2YWx1ZSBpcyAyLCAzLCBvciA0LiBTZWUgaXRlbSAzMiBhYm92ZS4KCiAgUENSRV9DT05GSUdfUE9TSVhfTUFMTE9DX1RIUkVTSE9MRAoKVGhlIG91dHB1dCBpcyBhbiBpbnRlZ2VyIHRoYXQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBhYm92ZSB3aGljaCB0aGUgUE9TSVgKaW50ZXJmYWNlIHVzZXMgbWFsbG9jKCkgZm9yIG91dHB1dCB2ZWN0b3JzLiBTZWUgaXRlbSAzMSBhYm92ZS4KCiAgUENSRV9DT05GSUdfTUFUQ0hfTElNSVQKClRoZSBvdXRwdXQgaXMgYW4gdW5zaWduZWQgaW50ZWdlciB0aGF0IGNvbnRhaW5zIHRoZSBkZWZhdWx0IGxpbWl0IG9mIHRoZSBudW1iZXIKb2YgbWF0Y2goKSBjYWxscyBpbiBhIHBjcmVfZXhlYygpIGV4ZWN1dGlvbi4gU2VlIDQyIGFib3ZlLgoKNDQuIHBjcmV0ZXN0IGhhcyBiZWVuIHVwZ3JhZGVkIGJ5IHRoZSBhZGRpdGlvbiBvZiB0aGUgLUMgb3B0aW9uLiBUaGlzIGNhdXNlcyBpdAp0byBleHRyYWN0IGFsbCB0aGUgYXZhaWxhYmxlIG91dHB1dCBmcm9tIHRoZSBuZXcgcGNyZV9jb25maWcoKSBmdW5jdGlvbiwgYW5kIHRvCm91dHB1dCBpdC4gVGhlIHByb2dyYW0gdGhlbiBleGl0cyBpbW1lZGlhdGVseS4KCjQ1LiBBIG5lZWQgaGFzIGFyaXNlbiB0byBwYXNzIG92ZXIgYWRkaXRpb25hbCBkYXRhIHdpdGggY2FsbHMgdG8gcGNyZV9leGVjKCkgaW4Kb3JkZXIgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIGZlYXR1cmVzLiBPbmUgd2F5IHdvdWxkIGhhdmUgYmVlbiB0byBkZWZpbmUKcGNyZV9leGVjMigpIChmb3IgZXhhbXBsZSkgd2l0aCBleHRyYSBhcmd1bWVudHMsIGJ1dCB0aGlzIHdvdWxkIG5vdCBoYXZlIGJlZW4KZXh0ZW5zaWJsZSwgYW5kIHdvdWxkIGFsc28gaGF2ZSByZXF1aXJlZCBhbGwgY2FsbHMgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHRvCmJlIG1hcHBlZCB0byB0aGUgbmV3IG9uZS4gSW5zdGVhZCwgSSBoYXZlIGNob3NlbiB0byBleHRlbmQgdGhlIG1lY2hhbmlzbSB0aGF0CmlzIHVzZWQgZm9yIHBhc3NpbmcgaW4gImV4dHJhIiBkYXRhIGZyb20gcGNyZV9zdHVkeSgpLgoKVGhlIHBjcmVfZXh0cmEgc3RydWN0dXJlIGlzIG5vdyBleHBvc2VkIGFuZCBkZWZpbmVkIGluIHBjcmUuaC4gSXQgY3VycmVudGx5CmNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzOgoKICBmbGFncyAgICAgICAgIGEgYml0bWFwIGluZGljYXRpbmcgd2hpY2ggb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHNldAogIHN0dWR5X2RhdGEgICAgb3BhcXVlIGRhdGEgZnJvbSBwY3JlX3N0dWR5KCkKICBtYXRjaF9saW1pdCAgIGEgd2F5IG9mIHNwZWNpZnlpbmcgYSBsaW1pdCBvbiBtYXRjaCgpIGNhbGxzIGZvciBhIHNwZWNpZmljCiAgICAgICAgICAgICAgICAgIGNhbGwgdG8gcGNyZV9leGVjKCkKICBjYWxsb3V0X2RhdGEgIGRhdGEgZm9yIGNhbGxvdXRzIChzZWUgNDkgYmVsb3cpCgpUaGUgZmxhZyBiaXRzIGFyZSBhbHNvIGRlZmluZWQgaW4gcGNyZS5oLCBhbmQgYXJlCgogIFBDUkVfRVhUUkFfU1RVRFlfREFUQQogIFBDUkVfRVhUUkFfTUFUQ0hfTElNSVQKICBQQ1JFX0VYVFJBX0NBTExPVVRfREFUQQoKVGhlIHBjcmVfc3R1ZHkoKSBmdW5jdGlvbiBub3cgcmV0dXJucyBvbmUgb2YgdGhlc2UgbmV3IHBjcmVfZXh0cmEgYmxvY2tzLCB3aXRoCnRoZSBhY3R1YWwgc3R1ZHkgZGF0YSBwb2ludGVkIHRvIGJ5IHRoZSBzdHVkeV9kYXRhIGZpZWxkLCBhbmQgdGhlClBDUkVfRVhUUkFfU1RVRFlfREFUQSBmbGFnIHNldC4gVGhpcyBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHBjcmVfZXhlYygpIGFzCmJlZm9yZS4gVGhhdCBpcywgdGhpcyBjaGFuZ2UgaXMgZW50aXJlbHkgdXB3YXJkcy1jb21wYXRpYmxlIGFuZCByZXF1aXJlcyBubwpjaGFuZ2UgdG8gZXhpc3RpbmcgY29kZS4KCklmIHlvdSB3YW50IHRvIHBhc3MgaW4gYWRkaXRpb25hbCBkYXRhIHRvIHBjcmVfZXhlYygpLCB5b3UgY2FuIGVpdGhlciBwbGFjZSBpdAppbiBhIHBjcmVfZXh0cmEgYmxvY2sgcHJvdmlkZWQgYnkgcGNyZV9zdHVkeSgpLCBvciBjcmVhdGUgeW91ciBvd24gcGNyZV9leHRyYQpibG9jay4KCjQ2LiBwY3JldGVzdCBoYXMgYmVlbiBleHRlbmRlZCB0byB0ZXN0IHRoZSBQQ1JFX0VYVFJBX01BVENIX0xJTUlUIGZlYXR1cmUuIElmIGEKZGF0YSBzdHJpbmcgY29udGFpbnMgdGhlIGVzY2FwZSBzZXF1ZW5jZSBcTSwgcGNyZXRlc3QgY2FsbHMgcGNyZV9leGVjKCkgc2V2ZXJhbAp0aW1lcyB3aXRoIGRpZmZlcmVudCBtYXRjaCBsaW1pdHMsIHVudGlsIGl0IGZpbmRzIHRoZSBtaW5pbXVtIHZhbHVlIG5lZWRlZCBmb3IKcGNyZV9leGVjKCkgdG8gY29tcGxldGUuIFRoZSB2YWx1ZSBpcyB0aGVuIG91dHB1dC4gVGhpcyBjYW4gYmUgaW5zdHJ1Y3RpdmU7IGZvcgptb3N0IHNpbXBsZSBtYXRjaGVzIHRoZSBudW1iZXIgaXMgcXVpdGUgc21hbGwsIGJ1dCBmb3IgcGF0aG9sb2dpY2FsIGNhc2VzIGl0CmdldHMgdmVyeSBsYXJnZSB2ZXJ5IHF1aWNrbHkuCgo0Ny4gVGhlcmUncyBhIG5ldyBvcHRpb24gZm9yIHBjcmVfZnVsbGluZm8oKSBjYWxsZWQgUENSRV9JTkZPX1NUVURZU0laRS4gSXQKcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBibG9jayBwb2ludGVkIHRvIGJ5IHRoZSBzdHVkeV9kYXRhIGZpZWxkIGluIGEKcGNyZV9leHRyYSBibG9jaywgdGhhdCBpcywgdGhlIHZhbHVlIHRoYXQgd2FzIHBhc3NlZCBhcyB0aGUgYXJndW1lbnQgdG8KcGNyZV9tYWxsb2MoKSB3aGVuIFBDUkUgd2FzIGdldHRpbmcgbWVtb3J5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBpbmZvcm1hdGlvbgpjcmVhdGVkIGJ5IHBjcmVfc3R1ZHkoKS4gVGhlIGZvdXJ0aCBhcmd1bWVudCBzaG91bGQgcG9pbnQgdG8gYSBzaXplX3QgdmFyaWFibGUuCnBjcmV0ZXN0IGhhcyBiZWVuIGV4dGVuZGVkIHNvIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBzaG93biBhZnRlciBhIHN1Y2Nlc3NmdWwKcGNyZV9zdHVkeSgpIGNhbGwgd2hlbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZWQgcmVnZXggaXMgYmVpbmcgZGlzcGxheWVkLgoKNDguIENvc21ldGljIGNoYW5nZSB0byBNYWtlZmlsZTogdGhlcmUncyBubyBuZWVkIHRvIGhhdmUgLyBhZnRlciAkKERFU1RESVIpCmJlY2F1c2Ugd2hhdCBmb2xsb3dzIGlzIGFsd2F5cyBhbiBhYnNvbHV0ZSBwYXRoLiAoTGF0ZXI6IGl0IHR1cm5zIG91dCB0aGF0IHRoaXMKaXMgbW9yZSB0aGFuIGNvc21ldGljIGZvciBNaW5HVywgYmVjYXVzZSBpdCBkb2Vzbid0IGxpa2UgZW1wdHkgcGF0aApjb21wb25lbnRzLikKCjQ5LiBTb21lIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGNhbGxvdXQgZmVhdHVyZSAoc2VlIDI4IGFib3ZlKToKCihpKSAgQSBjYWxsb3V0IGZ1bmN0aW9uIG5vdyBoYXMgdGhyZWUgY2hvaWNlcyBmb3Igd2hhdCBpdCByZXR1cm5zOgoKICAgICAgIDAgID0+ICBzdWNjZXNzLCBjYXJyeSBvbiBtYXRjaGluZwogICAgID4gMCAgPT4gIGZhaWx1cmUgYXQgdGhpcyBwb2ludCwgYnV0IGJhY2t0cmFjayBpZiBwb3NzaWJsZQogICAgIDwgMCAgPT4gIHNlcmlvdXMgZXJyb3IsIHJldHVybiB0aGlzIHZhbHVlIGZyb20gcGNyZV9leGVjKCkKCiAgICAgTmVnYXRpdmUgdmFsdWVzIHNob3VsZCBub3JtYWxseSBiZSBjaG9zZW4gZnJvbSB0aGUgc2V0IG9mIFBDUkVfRVJST1JfeHh4CiAgICAgdmFsdWVzLiBJbiBwYXJ0aWN1bGFyLCByZXR1cm5pbmcgUENSRV9FUlJPUl9OT01BVENIIGZvcmNlcyBhIHN0YW5kYXJkCiAgICAgIm1hdGNoIGZhaWxlZCIgZXJyb3IuIFRoZSBlcnJvciBudW1iZXIgUENSRV9FUlJPUl9DQUxMT1VUIGlzIHJlc2VydmVkIGZvcgogICAgIHVzZSBieSBjYWxsb3V0IGZ1bmN0aW9ucy4gSXQgd2lsbCBuZXZlciBiZSB1c2VkIGJ5IFBDUkUgaXRzZWxmLgoKKGlpKSBUaGUgcGNyZV9leHRyYSBzdHJ1Y3R1cmUgKHNlZSA0NSBhYm92ZSkgaGFzIGEgdm9pZCAqIGZpZWxkIGNhbGxlZAogICAgIGNhbGxvdXRfZGF0YSwgd2l0aCBjb3JyZXNwb25kaW5nIGZsYWcgYml0IFBDUkVfRVhUUkFfQ0FMTE9VVF9EQVRBLiBUaGUKICAgICBwY3JlX2NhbGxvdXRfYmxvY2sgc3RydWN0dXJlIGhhcyBhIGZpZWxkIG9mIHRoZSBzYW1lIG5hbWUuIFRoZSBjb250ZW50cyBvZgogICAgIHRoZSBmaWVsZCBwYXNzZWQgaW4gdGhlIHBjcmVfZXh0cmEgc3RydWN0dXJlIGFyZSBwYXNzZWQgdG8gdGhlIGNhbGxvdXQKICAgICBmdW5jdGlvbiBpbiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgY2FsbG91dCBibG9jay4gVGhpcyBtYWtlcyBpdAogICAgIGVhc2llciB0byB1c2UgdGhlIHNhbWUgY2FsbG91dC1jb250YWluaW5nIHJlZ2V4IGZyb20gbXVsdGlwbGUgdGhyZWFkcy4gRm9yCiAgICAgdGVzdGluZywgdGhlIHBjcmV0ZXN0IHByb2dyYW0gaGFzIGEgbmV3IGRhdGEgZXNjYXBlCgogICAgICAgXEMqbiAgICAgICAgcGFzcyB0aGUgbnVtYmVyIG4gKG1heSBiZSBuZWdhdGl2ZSkgYXMgY2FsbG91dF9kYXRhCgogICAgIElmIHRoZSBjYWxsb3V0IGZ1bmN0aW9uIGluIHBjcmV0ZXN0IHJlY2VpdmVzIGEgbm9uLXplcm8gdmFsdWUgYXMKICAgICBjYWxsb3V0X2RhdGEsIGl0IHJldHVybnMgdGhhdCB2YWx1ZS4KCjUwLiBNYWtlZmlsZSB3YXNuJ3QgaGFuZGxpbmcgQ0ZMQUdTIHByb3Blcmx5IHdoZW4gY29tcGlsaW5nIGRmdGFibGVzLiBBbHNvLAp0aGVyZSB3ZXJlIHNvbWUgcmVkdW5kYW50ICQoQ0ZMQUdTKSBpbiBjb21tYW5kcyB0aGF0IGFyZSBub3cgc3BlY2lmaWVkIGFzCiQoTElOSyksIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgJChDRkxBR1MpLgoKNTEuIEV4dGVuc2lvbnMgdG8gVVRGLTggc3VwcG9ydCBhcmUgbGlzdGVkIGJlbG93LiBUaGVzZSBhbGwgYXBwbHkgd2hlbiAoYSkgUENSRQpoYXMgYmVlbiBjb21waWxlZCB3aXRoIFVURi04IHN1cHBvcnQgKmFuZCogcGNyZV9jb21waWxlKCkgaGFzIGJlZW4gY29tcGlsZWQKd2l0aCB0aGUgUENSRV9VVEY4IGZsYWcuIFBhdHRlcm5zIHRoYXQgYXJlIGNvbXBpbGVkIHdpdGhvdXQgdGhhdCBmbGFnIGFzc3VtZQpvbmUtYnl0ZSBjaGFyYWN0ZXJzIHRocm91Z2hvdXQuIE5vdGUgdGhhdCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nIGFwcGxpZXMKb25seSB0byBjaGFyYWN0ZXJzIHdob3NlIHZhbHVlcyBhcmUgbGVzcyB0aGFuIDI1Ni4gUENSRSBkb2Vzbid0IHN1cHBvcnQgdGhlCm5vdGlvbiBvZiBjYXNlcyBmb3IgaGlnaGVyLXZhbHVlZCBjaGFyYWN0ZXJzLgoKKGkpICAgQSBjaGFyYWN0ZXIgY2xhc3Mgd2hvc2UgY2hhcmFjdGVycyBhcmUgYWxsIHdpdGhpbiAwLTI1NSBpcyBoYW5kbGVkIGFzCiAgICAgIGEgYml0IG1hcCwgYW5kIHRoZSBtYXAgaXMgaW52ZXJ0ZWQgZm9yIG5lZ2F0aXZlIGNsYXNzZXMuIFByZXZpb3VzbHksIGEKICAgICAgY2hhcmFjdGVyID4gMjU1IGFsd2F5cyBmYWlsZWQgdG8gbWF0Y2ggc3VjaCBhIGNsYXNzOyBob3dldmVyIGl0IHNob3VsZAogICAgICBtYXRjaCBpZiB0aGUgY2xhc3Mgd2FzIGEgbmVnYXRpdmUgb25lIChlLmcuIFteYWJdKS4gVGhpcyBoYXMgYmVlbiBmaXhlZC4KCihpaSkgIEEgbmVnYXRlZCBjaGFyYWN0ZXIgY2xhc3Mgd2l0aCBhIHNpbmdsZSBjaGFyYWN0ZXIgPCAyNTUgaXMgY29kZWQgYXMKICAgICAgIm5vdCB0aGlzIGNoYXJhY3RlciIgKE9QX05PVCkuIFRoaXMgd2Fzbid0IHdvcmtpbmcgcHJvcGVybHkgd2hlbiB0aGUgdGVzdAogICAgICBjaGFyYWN0ZXIgd2FzIG11bHRpYnl0ZSwgZWl0aGVyIHNpbmdseSBvciByZXBlYXRlZC4KCihpaWkpIFJlcGVhdHMgb2YgbXVsdGlieXRlIGNoYXJhY3RlcnMgYXJlIG5vdyBoYW5kbGVkIGNvcnJlY3RseSBpbiBVVEYtOAogICAgICBtb2RlLCBmb3IgZXhhbXBsZTogXHh7MTAwfXsyLDN9LgoKKGl2KSAgVGhlIGNoYXJhY3RlciBlc2NhcGVzIFxiLCBcQiwgXGQsIFxELCBccywgXFMsIFx3LCBhbmQgXFcgKGVpdGhlcgogICAgICBzaW5nbHkgb3IgcmVwZWF0ZWQpIG5vdyBjb3JyZWN0bHkgdGVzdCBtdWx0aWJ5dGUgY2hhcmFjdGVycy4gSG93ZXZlciwKICAgICAgUENSRSBkb2Vzbid0IHJlY29nbml6ZSBhbnkgY2hhcmFjdGVycyB3aXRoIHZhbHVlcyBncmVhdGVyIHRoYW4gMjU1IGFzCiAgICAgIGRpZ2l0cywgc3BhY2VzLCBvciB3b3JkIGNoYXJhY3RlcnMuIFN1Y2ggY2hhcmFjdGVycyBhbHdheXMgbWF0Y2ggXEQsIFxTLAogICAgICBhbmQgXFcsIGFuZCBuZXZlciBtYXRjaCBcZCwgXHMsIG9yIFx3LgoKKHYpICAgQ2xhc3NlcyBtYXkgbm93IGNvbnRhaW4gY2hhcmFjdGVycyBhbmQgY2hhcmFjdGVyIHJhbmdlcyB3aXRoIHZhbHVlcwogICAgICBncmVhdGVyIHRoYW4gMjU1LiBGb3IgZXhhbXBsZTogW2FiXHh7MTAwfS1ceHs0MDB9XS4KCih2aSkgIHBjcmVncmVwIG5vdyBoYXMgYSAtLXV0Zi04IG9wdGlvbiAoc3lub255bSAtdSkgd2hpY2ggbWFrZXMgaXQgY2FsbAogICAgICBQQ1JFIGluIFVURi04IG1vZGUuCgo1Mi4gVGhlIGluZm8gcmVxdWVzdCB2YWx1ZSBQQ1JFX0lORk9fRklSU1RDSEFSIGhhcyBiZWVuIHJlbmFtZWQKUENSRV9JTkZPX0ZJUlNUQllURSBiZWNhdXNlIGl0IGlzIGEgYnl0ZSB2YWx1ZS4gSG93ZXZlciwgdGhlIG9sZCBuYW1lIGlzCnJldGFpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKE5vdGUgdGhhdCBMQVNUTElURVJBTCBpcyBhbHNvIGEgYnl0ZQp2YWx1ZS4pCgo1My4gVGhlIHNpbmdsZSBtYW4gcGFnZSBoYXMgYmVjb21lIHRvbyBsYXJnZS4gSSBoYXZlIHRoZXJlZm9yZSBzcGxpdCBpdCB1cCBpbnRvCmEgbnVtYmVyIG9mIHNlcGFyYXRlIG1hbiBwYWdlcy4gVGhlc2UgYWxzbyBnaXZlIHJpc2UgdG8gaW5kaXZpZHVhbCBIVE1MIHBhZ2VzOwp0aGVzZSBhcmUgbm93IHB1dCBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSwgYW5kIHRoZXJlIGlzIGFuIGluZGV4Lmh0bWwgcGFnZSB0aGF0Cmxpc3RzIHRoZW0gYWxsLiBTb21lIGh5cGVybGlua2luZyBiZXR3ZWVuIHRoZSBwYWdlcyBoYXMgYmVlbiBpbnN0YWxsZWQuCgo1NC4gQWRkZWQgY29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBuYW1lZCBjYXB0dXJpbmcgcGFyZW50aGVzZXMuCgo1NS4gVW5rbm93biBlc2NhcGVzIGluc2lkZSBjaGFyYWN0ZXIgY2xhc3NlcyAoZS5nLiBbXE1dKSBhbmQgZXNjYXBlcyB0aGF0CmFyZW4ndCBpbnRlcnByZXRlZCB0aGVyZWluIChlLmcuIFtcQ10pIGFyZSBsaXRlcmFscyBpbiBQZXJsLiBUaGlzIGlzIG5vdyBhbHNvCnRydWUgaW4gUENSRSwgZXhjZXB0IHdoZW4gdGhlIFBDUkVfRVhURU5ERUQgb3B0aW9uIGlzIHNldCwgaW4gd2hpY2ggY2FzZSB0aGV5CmFyZSBmYXVsdGVkLgoKNTYuIEludHJvZHVjZWQgSE9TVF9DQyBhbmQgSE9TVF9DRkxBR1Mgd2hpY2ggY2FuIGJlIHNldCBpbiB0aGUgZW52aXJvbm1lbnQgd2hlbgpjYWxsaW5nIGNvbmZpZ3VyZS4gVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHdoZW4gY29tcGlsaW5nIHRoZSBkZnRhYmxlcy5jIHByb2dyYW0Kd2hpY2ggaXMgcnVuIHRvIGdlbmVyYXRlIHRoZSBzb3VyY2Ugb2YgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIHRhYmxlcy4gVGhleQpkZWZhdWx0IHRvIHRoZSB2YWx1ZXMgb2YgQ0MgYW5kIENGTEFHUy4gSWYgeW91IGFyZSBjcm9zcy1jb21waWxpbmcgUENSRSwKeW91IHdpbGwgbmVlZCB0byBzZXQgdGhlc2UgdmFsdWVzLgoKNTcuIFVwZGF0ZWQgdGhlIGJ1aWxkaW5nIHByb2Nlc3MgZm9yIFdpbmRvd3MgRExMLCBhcyBwcm92aWRlZCBieSBGcmVkIENveC4KCgpWZXJzaW9uIDMuOSAwMi1KYW4tMDIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBBIGJpdCBvZiBleHRyYW5lb3VzIHRleHQgaGFkIHNvbWVob3cgY3JlcHQgaW50byB0aGUgcGNyZWdyZXAgZG9jdW1lbnRhdGlvbi4KCjIuIElmIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLCB0aGUgYnVpbGRpbmcgcHJvY2VzcyBmYWlsZWQgd2hlbiB0cnlpbmcgdG8KYnVpbGQgcGNyZXRlc3QgYW5kIHBjcmVncmVwLiAoRm9yIHNvbWUgcmVhc29uIGl0IHdhcyB1c2luZyBsaWJ0b29sIHRvIGNvbXBpbGUKdGhlbSwgd2hpY2ggaXMgbm90IHJpZ2h0LCBhcyB0aGV5IGFyZW4ndCBwYXJ0IG9mIHRoZSBsaWJyYXJ5LikKCgpWZXJzaW9uIDMuOCAxOC1EZWMtMDEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBUaGUgZXhwZXJpbWVudGFsIFVURi04IGNvZGUgd2FzIGNvbXBsZXRlbHkgc2NyZXdlZCB1cC4gSXQgd2FzIHBhY2tpbmcgdGhlCmJ5dGVzIGluIHRoZSB3cm9uZyBvcmRlci4gSG93IGR1bWIgY2FuIHlvdSBnZXQ/CgoKVmVyc2lvbiAzLjcgMjktT2N0LTAxCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gSW4gdXBkYXRpbmcgcGNyZXRlc3QgdG8gY2hlY2sgY2hhbmdlIDEgb2YgdmVyc2lvbiAzLjYsIEkgc2NyZXdlZCB1cC4KVGhpcyBjYXVzZWQgcGNyZXRlc3QsIHdoZW4gdXNlZCBvbiB0aGUgdGVzdCBkYXRhLCB0byBzZWdmYXVsdC4gVW5mb3J0dW5hdGVseSwKdGhpcyBkaWRuJ3QgaGFwcGVuIHVuZGVyIFNvbGFyaXMgOCwgd2hlcmUgSSBub3JtYWxseSB0ZXN0IHRoaW5ncy4KCjIuIFRoZSBNYWtlZmlsZSBoYWQgdG8gYmUgY2hhbmdlZCB0byBtYWtlIGl0IHdvcmsgb24gQlNEIHN5c3RlbXMsIHdoZXJlICdtYWtlJwpkb2Vzbid0IHNlZW0gdG8gcmVjb2duaXplIHRoYXQgLi94eHggYW5kIHh4eCBhcmUgdGhlIHNhbWUgZmlsZS4gKFRoaXMgZW50cnkKaXNuJ3QgaW4gQ2hhbmdlTG9nIGRpc3RyaWJ1dGVkIHdpdGggMy43IGJlY2F1c2UgSSBmb3Jnb3Qgd2hlbiBJIGhhc3RpbHkgbWFkZQp0aGlzIGZpeCBhbiBob3VyIG9yIHNvIGFmdGVyIHRoZSBpbml0aWFsIDMuNyByZWxlYXNlLikKCgpWZXJzaW9uIDMuNiAyMy1PY3QtMDEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBDcmFzaGVkIHdpdGggLyhzZW5zfHJlc3BvbnMpZSBhbmQgXDFpYmlsaXR5LyBhbmQgInNlbnNlIGFuZCBzZW5zaWJpbGl0eSIgaWYKb2Zmc2V0cyBwYXNzZWQgYXMgTlVMTCB3aXRoIHplcm8gb2Zmc2V0IGNvdW50LgoKMi4gVGhlIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1YiBmaWxlcyBoYWQgbm90IGJlZW4gdXBkYXRlZCB3aGVuIEkgbW92ZWQgdG8KdGhlIGxhdGVzdCBhdXRvY29uZi4KCgpWZXJzaW9uIDMuNSAxNS1BdWctMDEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBBZGRlZCBzb21lIG1pc3NpbmcgI2lmICFkZWZpbmVkIE5PUE9TSVggY29uZGl0aW9uYWxzIGluIHBjcmV0ZXN0LmMgdGhhdApoYWQgYmVlbiBmb3Jnb3R0ZW4uCgoyLiBCeSB1c2luZyBkZWNsYXJlZCBidXQgdW5kZWZpbmVkIHN0cnVjdHVyZXMsIHdlIGNhbiBhdm9pZCB1c2luZyAidm9pZCIKZGVmaW5pdGlvbnMgaW4gcGNyZS5oIHdoaWxlIGtlZXBpbmcgdGhlIGludGVybmFsIGRlZmluaXRpb25zIG9mIHRoZSBzdHJ1Y3R1cmVzCnByaXZhdGUuCgozLiBUaGUgZGlzdHJpYnV0aW9uIGlzIG5vdyBidWlsdCB1c2luZyBhdXRvY29uZiAyLjUwIGFuZCBsaWJ0b29sIDEuNC4gRnJvbSBhCnVzZXIgcG9pbnQgb2YgdmlldywgdGhpcyBtZWFucyB0aGF0IGJvdGggc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGFyZSBidWlsdApieSBkZWZhdWx0LCBidXQgdGhpcyBjYW4gYmUgaW5kaXZpZHVhbGx5IGNvbnRyb2xsZWQuIE1vcmUgb2YgdGhlIHdvcmsgb2YKaGFuZGxpbmcgdGhpcyBzdGF0aWMvc2hhcmVkIGNhc2VzIGlzIG5vdyBpbnNpZGUgbGlidG9vbCBpbnN0ZWFkIG9mIFBDUkUncyBtYWtlCmZpbGUuCgo0LiBUaGUgcGNyZXRlc3QgdXRpbGl0eSBpcyBub3cgaW5zdGFsbGVkIGFsb25nIHdpdGggcGNyZWdyZXAgYmVjYXVzZSBpdCBpcwp1c2VmdWwgZm9yIHVzZXJzICh0byB0ZXN0IHJlZ2V4cykgYW5kIGJ5IGRvaW5nIHRoaXMsIGl0IGF1dG9tYXRpY2FsbHkgZ2V0cwpyZWxpbmtlZCBieSBsaWJ0b29sLiBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB0dXJuZWQgaW50byBhIG1hbiBwYWdlLCBzbwp0aGVyZSBhcmUgbm93IC4xLCAudHh0LCBhbmQgLmh0bWwgdmVyc2lvbnMgaW4gL2RvYy4KCjUuIFVwZ3JhZGVzIHRvIHBjcmVncmVwOgogICAoaSkgICBBZGRlZCBsb25nLWZvcm0gb3B0aW9uIG5hbWVzIGxpa2UgZ251IGdyZXAuCiAgIChpaSkgIEFkZGVkIC0taGVscCB0byBsaXN0IGFsbCBvcHRpb25zIHdpdGggYW4gZXhwbGFuYXRvcnkgcGhyYXNlLgogICAoaWlpKSBBZGRlZCAtciwgLS1yZWN1cnNpdmUgdG8gcmVjdXJzZSBpbnRvIHN1Yi1kaXJlY3Rvcmllcy4KICAgKGl2KSAgQWRkZWQgLWYsIC0tZmlsZSB0byByZWFkIHBhdHRlcm5zIGZyb20gYSBmaWxlLgoKNi4gcGNyZV9leGVjKCkgd2FzIHJlZmVycmluZyB0byBpdHMgImNvZGUiIGFyZ3VtZW50IGJlZm9yZSB0ZXN0aW5nIHRoYXQKYXJndW1lbnQgZm9yIE5VTEwgKGFuZCBnaXZpbmcgYW4gZXJyb3IgaWYgaXQgd2FzIE5VTEwpLgoKNy4gVXBncmFkZWQgTWFrZWZpbGUuaW4gdG8gYWxsb3cgZm9yIGNvbXBpbGluZyBpbiBhIGRpZmZlcmVudCBkaXJlY3RvcnkgZnJvbQp0aGUgc291cmNlIGRpcmVjdG9yeS4KCjguIFRpbnkgYnVnbGV0IGluIHBjcmV0ZXN0OiB3aGVuIHBjcmVfZnVsbGluZm8oKSB3YXMgY2FsbGVkIHRvIHJldHJpZXZlIHRoZQpvcHRpb25zIGJpdHMsIHRoZSBwb2ludGVyIGl0IHdhcyBwYXNzZWQgd2FzIHRvIGFuIGludCBpbnN0ZWFkIG9mIHRvIGFuIHVuc2lnbmVkCmxvbmcgaW50LiBUaGlzIG1hdHRlcmVkIG9ubHkgb24gNjQtYml0IHN5c3RlbXMuCgo5LiBGaXhlZCB0eXBvICgzLjQvMSkgaW4gcGNyZS5oIGFnYWluLiBTaWdoLiBJIGhhZCBjaGFuZ2VkIHBjcmUuaCAod2hpY2ggaXMKZ2VuZXJhdGVkKSBpbnN0ZWFkIG9mIHBjcmUuaW4sIHdoaWNoIGl0IGl0cyBzb3VyY2UuIEFsc28gbWFkZSB0aGUgc2FtZSBjaGFuZ2UKaW4gc2V2ZXJhbCBvZiB0aGUgLmMgZmlsZXMuCgoxMC4gQSBuZXcgcmVsZWFzZSBvZiBnY2MgZGVmaW5lcyBwcmludGYoKSBhcyBhIG1hY3JvLCB3aGljaCBicm9rZSBwY3JldGVzdApiZWNhdXNlIGl0IGhhZCBhbiBpZmRlZiBpbiB0aGUgbWlkZGxlIG9mIGEgc3RyaW5nIGFyZ3VtZW50IGZvciBwcmludGYoKS4gRml4ZWQKYnkgdXNpbmcgc2VwYXJhdGUgY2FsbHMgdG8gcHJpbnRmKCkuCgoxMS4gQWRkZWQgLS1lbmFibGUtbmV3bGluZS1pcy1jciBhbmQgLS1lbmFibGUtbmV3bGluZS1pcy1sZiB0byB0aGUgY29uZmlndXJlCnNjcmlwdCwgdG8gZm9yY2UgdXNlIG9mIENSIG9yIExGIGluc3RlYWQgb2YgXG4gaW4gdGhlIHNvdXJjZS4gT24gbm9uLVVuaXgKc3lzdGVtcywgdGhlIHZhbHVlIGNhbiBiZSBzZXQgaW4gY29uZmlnLmguCgoxMi4gVGhlIGxpbWl0IG9mIDIwMCBvbiBub24tY2FwdHVyaW5nIHBhcmVudGhlc2VzIGlzIGEgX25lc3RpbmdfIGxpbWl0LCBub3QgYW4KYWJzb2x1dGUgbGltaXQuIENoYW5nZWQgdGhlIHRleHQgb2YgdGhlIGVycm9yIG1lc3NhZ2UgdG8gbWFrZSB0aGlzIGNsZWFyLCBhbmQKbGlrZXdpc2UgdXBkYXRlZCB0aGUgbWFuIHBhZ2UuCgoxMy4gVGhlIGxpbWl0IG9mIDk5IG9uIHRoZSBudW1iZXIgb2YgY2FwdHVyaW5nIHN1YnBhdHRlcm5zIGhhcyBiZWVuIHJlbW92ZWQuClRoZSBuZXcgbGltaXQgaXMgNjU1MzUsIHdoaWNoIEkgaG9wZSB3aWxsIG5vdCBiZSBhICJyZWFsIiBsaW1pdC4KCgpWZXJzaW9uIDMuNCAyMi1BdWctMDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBGaXhlZCB0eXBvIGluIHBjcmUuaDogdW5zaWduZWQgY29uc3QgY2hhciAqIGNoYW5nZWQgdG8gY29uc3QgdW5zaWduZWQgY2hhciAqLgoKMi4gRGlhZ25vc2UgY29uZGl0aW9uICg/KDApIGFzIGFuIGVycm9yIGluc3RlYWQgb2YgY3Jhc2hpbmcgb24gbWF0Y2hpbmcuCgoKVmVyc2lvbiAzLjMgMDEtQXVnLTAwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gSWYgYW4gb2N0YWwgY2hhcmFjdGVyIHdhcyBnaXZlbiwgYnV0IHRoZSB2YWx1ZSB3YXMgZ3JlYXRlciB0aGFuIFwzNzcsIGl0CndhcyBub3QgZ2V0dGluZyBtYXNrZWQgdG8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMsIGFzIGRvY3VtZW50ZWQuIFRoaXMgY291bGQKbGVhZCB0byBjcmFzaGVzIGluIHNvbWUgc3lzdGVtcy4KCjIuIFBlcmwgNS42IChpZiBub3QgZWFybGllciB2ZXJzaW9ucykgYWNjZXB0cyBjbGFzc2VzIGxpa2UgW2EtXGRdIGFuZCB0cmVhdHMKdGhlIGh5cGhlbiBhcyBhIGxpdGVyYWwuIFBDUkUgdXNlZCB0byBnaXZlIGFuIGVycm9yOyBpdCBub3cgYmVoYXZlcyBsaWtlIFBlcmwuCgozLiBBZGRlZCB0aGUgZnVuY3Rpb25zIHBjcmVfZnJlZV9zdWJzdHJpbmcoKSBhbmQgcGNyZV9mcmVlX3N1YnN0cmluZ19saXN0KCkuClRoZXNlIGp1c3QgcGFzcyB0aGVpciBhcmd1bWVudHMgb24gdG8gKHBjcmVfZnJlZSkoKSwgYnV0IHRoZXkgYXJlIHByb3ZpZGVkCmJlY2F1c2Ugc29tZSB1c2VzIG9mIFBDUkUgYmluZCBpdCB0byBub24tQyBzeXN0ZW1zIHRoYXQgY2FuIGNhbGwgaXRzIGZ1bmN0aW9ucywKYnV0IGNhbm5vdCBjYWxsIGZyZWUoKSBvciBwY3JlX2ZyZWUoKSBkaXJlY3RseS4KCjQuIEFkZCAibWFrZSB0ZXN0IiBhcyBhIHN5bm9ueW0gZm9yICJtYWtlIGNoZWNrIi4gQ29ycmVjdGVkIHNvbWUgY29tbWVudHMgaW4KdGhlIE1ha2VmaWxlLgoKNS4gQWRkICQoREVTVERJUikvIGluIGZyb250IG9mIGFsbCB0aGUgcGF0aHMgaW4gdGhlICJpbnN0YWxsIiB0YXJnZXQgaW4gdGhlCk1ha2VmaWxlLgoKNi4gQ2hhbmdlZCB0aGUgbmFtZSBvZiBwZ3JlcCB0byBwY3JlZ3JlcCwgYmVjYXVzZSBTb2xhcmlzIGhhcyBpbnRyb2R1Y2VkIGEKY29tbWFuZCBjYWxsZWQgcGdyZXAgZm9yIGdyZXBwaW5nIGFyb3VuZCB0aGUgYWN0aXZlIHByb2Nlc3Nlcy4KCjcuIEFkZGVkIHRoZSBiZWdpbm5pbmdzIG9mIHN1cHBvcnQgZm9yIFVURi04IGNoYXJhY3RlciBzdHJpbmdzLgoKOC4gQXJyYW5nZWQgZm9yIHRoZSBNYWtlZmlsZSB0byBwYXNzIG92ZXIgdGhlIHNldHRpbmdzIG9mIENDLCBDRkxBR1MsIGFuZApSQU5MSUIgdG8gLi9sdGNvbmZpZyBzbyB0aGF0IHRoZXkgYXJlIHVzZWQgYnkgbGlidG9vbC4gSSB0aGluayB0aGVzZSBhcmUgYWxsCnRoZSByZWxldmFudCBvbmVzLiAoQVIgaXMgbm90IHBhc3NlZCBiZWNhdXNlIC4vbHRjb25maWcgZG9lcyBpdHMgb3duIGZpZ3VyaW5nCm91dCBmb3IgdGhlIGFyIGNvbW1hbmQuKQoKClZlcnNpb24gMy4yIDEyLU1heS0wMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoaXMgaXMgcHVyZWx5IGEgYnVnIGZpeGluZyByZWxlYXNlLgoKMS4gSWYgdGhlIHBhdHRlcm4gLygoWikrfEEpKi8gd2FzIG1hdGNoZWQgYWdhaW5lZCBaQUJDREVGRyBpdCBtYXRjaGVkIFogaW5zdGVhZApvZiBaQS4gVGhpcyB3YXMganVzdCBvbmUgZXhhbXBsZSBvZiBzZXZlcmFsIGNhc2VzIHRoYXQgY291bGQgcHJvdm9rZSB0aGlzIGJ1ZywKd2hpY2ggd2FzIGludHJvZHVjZWQgYnkgY2hhbmdlIDkgb2YgdmVyc2lvbiAyLjAwLiBUaGUgY29kZSBmb3IgYnJlYWtpbmcKaW5maW5pdGUgbG9vcHMgYWZ0ZXIgYW4gaXRlcmF0aW9uIHRoYXQgbWF0Y2hlcyBhbiBlbXB0eSBzdHJpbmcgd2FzJ3Qgd29ya2luZwpjb3JyZWN0bHkuCgoyLiBUaGUgcGNyZXRlc3QgcHJvZ3JhbSB3YXMgbm90IGltaXRhdGluZyBQZXJsIGNvcnJlY3RseSBmb3IgdGhlIHBhdHRlcm4gL2EqL2cKd2hlbiBtYXRjaGVkIGFnYWluc3QgYWJiYWIgKGZvciBleGFtcGxlKS4gQWZ0ZXIgbWF0Y2hpbmcgYW4gZW1wdHkgc3RyaW5nLCBpdAp3YXNuJ3QgZm9yY2luZyBhbmNob3Jpbmcgd2hlbiBzZXR0aW5nIFBDUkVfTk9URU1QVFkgZm9yIHRoZSBuZXh0IGF0dGVtcHQ7IHRoaXMKY2F1c2VkIGl0IHRvIG1hdGNoIGZ1cnRoZXIgZG93biB0aGUgc3RyaW5nIHRoYW4gaXQgc2hvdWxkLgoKMy4gVGhlIGNvZGUgY29udGFpbmVkIGFuIGluY2x1c2lvbiBvZiBzeXMvdHlwZXMuaC4gSXQgaXNuJ3QgY2xlYXIgd2h5IHRoaXMKd2FzIHRoZXJlIGJlY2F1c2UgaXQgZG9lc24ndCBzZWVtIHRvIGJlIG5lZWRlZCwgYW5kIGl0IGNhdXNlcyB0cm91YmxlIG9uIHNvbWUKc3lzdGVtcywgYXMgaXQgaXMgbm90IGEgU3RhbmRhcmQgQyBoZWFkZXIuIEl0IGhhcyBiZWVuIHJlbW92ZWQuCgo0LiBNYWRlIDQgc2lsbHkgY2hhbmdlcyB0byB0aGUgc291cmNlIHRvIGF2b2lkIHN0dXBpZCBjb21waWxlciB3YXJuaW5ncyB0aGF0CndlcmUgcmVwb3J0ZWQgb24gdGhlIE1hY2ludG9zaC4gVGhlIGNoYW5nZXMgd2VyZSBmcm9tCgogIHdoaWxlICgoYyA9ICooKytwdHIpKSAhPSAwICYmIGMgIT0gJ1xuJyk7CnRvCiAgd2hpbGUgKChjID0gKigrK3B0cikpICE9IDAgJiYgYyAhPSAnXG4nKSA7CgpUb3RhbGx5IGV4dHJhb3JkaW5hcnksIGJ1dCBpZiB0aGF0J3Mgd2hhdCBpdCB0YWtlcy4uLgoKNS4gUENSRSBpcyBiZWluZyB1c2VkIGluIG9uZSBlbnZpcm9ubWVudCB3aGVyZSBuZWl0aGVyIG1lbW1vdmUoKSBub3IgYmNvcHkoKSBpcwphdmFpbGFibGUuIEFkZGVkIEhBVkVfQkNPUFkgYW5kIGFuIGF1dG9jb25mIHRlc3QgZm9yIGl0OyBpZiBuZWl0aGVyCkhBVkVfTUVNTU9WRSBub3IgSEFWRV9CQ09QWSBpcyBzZXQsIHVzZSBhIGJ1aWx0LWluIGVtdWxhdGlvbiBmdW5jdGlvbiB3aGljaAphc3N1bWVzIHRoZSB3YXkgUENSRSB1c2VzIG1lbW1vdmUoKSAoYWx3YXlzIG1vdmluZyB1cHdhcmRzKS4KCjYuIFBDUkUgaXMgYmVpbmcgdXNlZCBpbiBvbmUgZW52aXJvbm1lbnQgd2hlcmUgc3RyY2hyKCkgaXMgbm90IGF2YWlsYWJsZS4gVGhlcmUKd2FzIG9ubHkgb25lIHVzZSBpbiBwY3JlLmMsIGFuZCB3cml0aW5nIGl0IG91dCB0byBhdm9pZCBzdHJjaHIoKSBwcm9iYWJseSBnaXZlcwpmYXN0ZXIgY29kZSBhbnl3YXkuCgoKVmVyc2lvbiAzLjEgMDktRmViLTAwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIG9ubHkgY2hhbmdlIGluIHRoaXMgcmVsZWFzZSBpcyB0aGUgZml4aW5nIG9mIHNvbWUgYnVncyBpbiBNYWtlZmlsZS5pbiBmb3IKdGhlICJpbnN0YWxsIiB0YXJnZXQ6CgooMSkgSXQgd2FzIGZhaWxpbmcgdG8gaW5zdGFsbCBwY3JlcG9zaXguaC4KCigyKSBJdCB3YXMgb3ZlcndyaXRpbmcgdGhlIHBjcmUuMyBtYW4gcGFnZSB3aXRoIHRoZSBwY3JlcG9zaXguMyBtYW4gcGFnZS4KCgpWZXJzaW9uIDMuMCAwMS1GZWItMDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBBZGQgc3VwcG9ydCBmb3IgdGhlIC8rIG1vZGlmaWVyIHRvIHBlcmx0ZXN0ICh0byBvdXRwdXQgJGAgbGlrZSBpdCBkb2VzIGluCnBjcmV0ZXN0KS4KCjIuIEFkZCBzdXBwb3J0IGZvciB0aGUgL2cgbW9kaWZpZXIgdG8gcGVybHRlc3QuCgozLiBGaXggcGNyZXRlc3Qgc28gdGhhdCBpdCBiZWhhdmVzIGV2ZW4gbW9yZSBsaWtlIFBlcmwgZm9yIC9nIHdoZW4gdGhlIHBhdHRlcm4KbWF0Y2hlcyBudWxsIHN0cmluZ3MuCgo0LiBGaXggcGVybHRlc3Qgc28gdGhhdCBpdCBkb2Vzbid0IGRvIHVud2FudGVkIHRoaW5ncyB3aGVuIGZlZCBhbiBlbXB0eQpwYXR0ZXJuLiBQZXJsIHRyZWF0cyBlbXB0eSBwYXR0ZXJucyBzcGVjaWFsbHkgLSBpdCByZXVzZXMgdGhlIG1vc3QgcmVjZW50CnBhdHRlcm4sIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnQuIFJlcGxhY2UgLy8gYnkgLyg/IykvIGluIG9yZGVyIHRvIGF2b2lkIHRoaXMKZWZmZWN0LgoKNS4gVGhlIFBPU0lYIGludGVyZmFjZSB3YXMgYnJva2VuIGluIHRoYXQgaXQgd2FzIGp1c3QgaGFuZGluZyBvdmVyIHRoZSBQT1NJWApjYXB0dXJlZCBzdHJpbmcgdmVjdG9yIHRvIHBjcmVfZXhlYygpLCBidXQgKHNpbmNlIHJlbGVhc2UgMi4wMCkgUENSRSBoYXMKcmVxdWlyZWQgYSBiaWdnZXIgdmVjdG9yLCB3aXRoIHNvbWUgd29ya2luZyBzcGFjZSBvbiB0aGUgZW5kLiBUaGlzIG1lYW5zIHRoYXQKdGhlIFBPU0lYIHdyYXBwZXIgbm93IGhhcyB0byBnZXQgYW5kIGZyZWUgc29tZSBtZW1vcnksIGFuZCBjb3B5IHRoZSByZXN1bHRzLgoKNi4gQWRkZWQgc29tZSBzaW1wbGUgYXV0b2NvbmYgc3VwcG9ydCwgcGxhY2luZyB0aGUgdGVzdCBkYXRhIGFuZCB0aGUKZG9jdW1lbnRhdGlvbiBpbiBzZXBhcmF0ZSBkaXJlY3RvcmllcywgcmUtb3JnYW5pemluZyBzb21lIG9mIHRoZQppbmZvcm1hdGlvbiBmaWxlcywgYW5kIG1ha2luZyBpdCBidWlsZCBwY3JlLWNvbmZpZyAoYSBHTlUgc3RhbmRhcmQpLiBBbHNvIGFkZGVkCmxpYnRvb2wgc3VwcG9ydCBmb3IgYnVpbGRpbmcgUENSRSBhcyBhIHNoYXJlZCBsaWJyYXJ5LCB3aGljaCBpcyBub3cgdGhlCmRlZmF1bHQuCgo3LiBHb3QgcmlkIG9mIHRoZSBsZWFkaW5nIHplcm8gaW4gdGhlIGRlZmluaXRpb24gb2YgUENSRV9NSU5PUiBiZWNhdXNlIDA4IGFuZAowOSBhcmUgbm90IHZhbGlkIG9jdGFsIGNvbnN0YW50cy4gU2luZ2xlIGRpZ2l0cyB3aWxsIGJlIHVzZWQgZm9yIG1pbm9yIHZhbHVlcwpsZXNzIHRoYW4gMTAuCgo4LiBEZWZpbmVkIFJFR19FWFRFTkRFRCBhbmQgUkVHX05PU1VCIGFzIHplcm8gaW4gdGhlIFBPU0lYIGhlYWRlciwgc28gdGhhdApleGlzdGluZyBwcm9ncmFtcyB0aGF0IHNldCB0aGVzZSBpbiB0aGUgUE9TSVggaW50ZXJmYWNlIGNhbiB1c2UgUENSRSB3aXRob3V0Cm1vZGlmaWNhdGlvbi4KCjkuIEFkZGVkIGEgbmV3IGZ1bmN0aW9uLCBwY3JlX2Z1bGxpbmZvKCkgd2l0aCBhbiBleHRlbnNpYmxlIGludGVyZmFjZS4gSXQgY2FuCnJldHVybiBhbGwgdGhhdCBwY3JlX2luZm8oKSByZXR1cm5zLCBwbHVzIGFkZGl0aW9uYWwgZGF0YS4gVGhlIHBjcmVfaW5mbygpCmZ1bmN0aW9uIGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5LCBidXQgaXMgY29uc2lkZXJlZCB0byBiZSBvYnNvbGV0ZS4KCjEwLiBBZGRlZCBleHBlcmltZW50YWwgcmVjdXJzaW9uIGZlYXR1cmUgKD9SKSB0byBoYW5kbGUgb25lIGNvbW1vbiBjYXNlIHRoYXQKUGVybCA1LjYgd2lsbCBiZSBhYmxlIHRvIGRvIHdpdGggKD9wey4uLn0pLgoKMTEuIEFkZGVkIHN1cHBvcnQgZm9yIFBPU0lYIGNoYXJhY3RlciBjbGFzc2VzIGxpa2UgWzphbHBoYTpdLCB3aGljaCBQZXJsIGlzCmFkb3B0aW5nLgoKClZlcnNpb24gMi4wOCAzMS1BdWctOTkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gV2hlbiBzdGFydG9mZnNldCB3YXMgbm90IHplcm8gYW5kIHRoZSBwYXR0ZXJuIGJlZ2FuIHdpdGggIi4qIiwgUENSRSB3YXMgbm90CnRyeWluZyB0byBtYXRjaCBhdCB0aGUgc3RhcnRvZmZzZXQgcG9zaXRpb24sIGJ1dCBpbnN0ZWFkIHdhcyBtb3ZpbmcgZm9yd2FyZCB0bwp0aGUgbmV4dCBuZXdsaW5lIGFzIGlmIGEgcHJldmlvdXMgbWF0Y2ggaGFkIGZhaWxlZC4KCjIuIHBjcmV0ZXN0IHdhcyBub3QgbWFraW5nIHVzZSBvZiBQQ1JFX05PVEVNUFRZIHdoZW4gcmVwZWF0aW5nIGZvciAvZyBhbmQgL0csCmFuZCBjb3VsZCBnZXQgaW50byBhIGxvb3AgaWYgYSBudWxsIHN0cmluZyB3YXMgbWF0Y2hlZCBvdGhlciB0aGFuIGF0IHRoZSBzdGFydApvZiB0aGUgc3ViamVjdC4KCjMuIEFkZGVkIGRlZmluaXRpb25zIG9mIFBDUkVfTUFKT1IgYW5kIFBDUkVfTUlOT1IgdG8gcGNyZS5oIHNvIHRoZSB2ZXJzaW9uIGNhbgpiZSBkaXN0aW5ndWlzaGVkIGF0IGNvbXBpbGUgdGltZSwgYW5kIGZvciBjb21wbGV0ZW5lc3MgYWxzbyBhZGRlZCBQQ1JFX0RBVEUuCgo1LiBBZGRlZCBQYXVsIFNva29sb3Zza3kncyBtaW5vciBjaGFuZ2VzIHRvIG1ha2UgaXQgZWFzeSB0byBjb21waWxlIGEgV2luMzIgRExMCmluIEdudVdpbjMyIGVudmlyb25tZW50cy4KCgpWZXJzaW9uIDIuMDcgMjktSnVsLTk5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuIFRoZSBkb2N1bWVudGF0aW9uIGlzIG5vdyBzdXBwbGllZCBpbiBwbGFpbiB0ZXh0IGZvcm0gYW5kIEhUTUwgYXMgd2VsbCBhcyBpbgp0aGUgZm9ybSBvZiBtYW4gcGFnZSBzb3VyY2VzLgoKMi4gQysrIGNvbXBpbGVycyBkb24ndCBsaWtlIGFzc2lnbmluZyAodm9pZCAqKSB2YWx1ZXMgdG8gb3RoZXIgcG9pbnRlciB0eXBlcy4KSW4gcGFydGljdWxhciB0aGlzIGFmZmVjdHMgbWFsbG9jKCkuIEFsdGhvdWdoIHRoZXJlIGlzIG5vIHByb2JsZW0gaW4gU3RhbmRhcmQKQywgSSd2ZSBwdXQgaW4gY2FzdHMgdG8ga2VlcCBDKysgY29tcGlsZXJzIGhhcHB5LgoKMy4gVHlwbyBvbiBwY3JldGVzdC5jOyBhIGNhc3Qgb2YgKHVuc2lnbmVkIGNoYXIgKikgaW4gdGhlIFBPU0lYIHJlZ2V4ZWMoKSBjYWxsCnNob3VsZCBiZSAoY29uc3QgY2hhciAqKS4KCjQuIElmIE5PUE9TSVggaXMgZGVmaW5lZCwgcGNyZXRlc3QuYyBjb21waWxlcyB3aXRob3V0IFBPU0lYIHN1cHBvcnQuIFRoaXMgbWF5CmJlIHVzZWZ1bCBmb3Igbm9uLVVuaXggc3lzdGVtcyB3aG8gZG9uJ3Qgd2FudCB0byBib3RoZXIgd2l0aCB0aGUgUE9TSVggc3R1ZmYuCkhvd2V2ZXIsIEkgaGF2ZW4ndCBtYWRlIHRoaXMgYSBzdGFuZGFyZCBmYWNpbGl0eS4gVGhlIGRvY3VtZW50YXRpb24gZG9lc24ndAptZW50aW9uIGl0LCBhbmQgdGhlIE1ha2VmaWxlIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KCjUuIFRoZSBNYWtlZmlsZSBub3cgY29udGFpbnMgYW4gImluc3RhbGwiIHRhcmdldCwgd2l0aCBlZGl0YWJsZSBkZXN0aW5hdGlvbnMgYXQKdGhlIHRvcCBvZiB0aGUgZmlsZS4gVGhlIHBjcmV0ZXN0IHByb2dyYW0gaXMgbm90IGluc3RhbGxlZC4KCjYuIHBncmVwIC1WIG5vdyBnaXZlcyB0aGUgUENSRSB2ZXJzaW9uIG51bWJlciBhbmQgZGF0ZS4KCjcuIEZpeGVkIGJ1ZzogYSB6ZXJvIHJlcGV0aXRpb24gYWZ0ZXIgYSBsaXRlcmFsIHN0cmluZyAoZS5nLiAvYWJjZGV7MH0vKSB3YXMKY2F1c2luZyB0aGUgZW50aXJlIHN0cmluZyB0byBiZSBpZ25vcmVkLCBpbnN0ZWFkIG9mIGp1c3QgdGhlIGxhc3QgY2hhcmFjdGVyLgoKOC4gSWYgYSBwYXR0ZXJuIGxpa2UgLyIoW15cXCJdK3xcXC4pKiIvIGlzIGFwcGxpZWQgaW4gdGhlIG5vcm1hbCB3YXkgdG8gYQpub24tbWF0Y2hpbmcgc3RyaW5nLCBpdCBjYW4gdGFrZSBhIHZlcnksIHZlcnkgbG9uZyB0aW1lLCBldmVuIGZvciBzdHJpbmdzIG9mCnF1aXRlIG1vZGVzdCBsZW5ndGgsIGJlY2F1c2Ugb2YgdGhlIG5lc3RlZCByZWN1cnNpb24uIFBDUkUgbm93IGRvZXMgYmV0dGVyIGluCnNvbWUgb2YgdGhlc2UgY2FzZXMuIEl0IGRvZXMgdGhpcyBieSByZW1lbWJlcmluZyB0aGUgbGFzdCByZXF1aXJlZCBsaXRlcmFsCmNoYXJhY3RlciBpbiB0aGUgcGF0dGVybiwgYW5kIHByZS1zZWFyY2hpbmcgdGhlIHN1YmplY3QgdG8gZW5zdXJlIGl0IGlzIHByZXNlbnQKYmVmb3JlIHJ1bm5pbmcgdGhlIHJlYWwgbWF0Y2guIEluIG90aGVyIHdvcmRzLCBpdCBhcHBsaWVzIGEgaGV1cmlzdGljIHRvIGRldGVjdApzb21lIHR5cGVzIG9mIGNlcnRhaW4gZmFpbHVyZSBxdWlja2x5LCBhbmQgaW4gdGhlIGFib3ZlIGV4YW1wbGUsIGlmIHByZXNlbnRlZAp3aXRoIGEgc3RyaW5nIHRoYXQgaGFzIG5vIHRyYWlsaW5nICIgaXQgZ2l2ZXMgIm5vIG1hdGNoIiB2ZXJ5IHF1aWNrbHkuCgo5LiBBIG5ldyBydW50aW1lIG9wdGlvbiBQQ1JFX05PVEVNUFRZIGNhdXNlcyBudWxsIHN0cmluZyBtYXRjaGVzIHRvIGJlIGlnbm9yZWQ7Cm90aGVyIGFsdGVybmF0aXZlcyBhcmUgdHJpZWQgaW5zdGVhZC4KCgpWZXJzaW9uIDIuMDYgMDktSnVuLTk5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuIENoYW5nZSBwY3JldGVzdCdzIG91dHB1dCBmb3IgYW1vdW50IG9mIHN0b3JlIHVzZWQgdG8gc2hvdyBqdXN0IHRoZSBjb2RlCnNwYWNlLCBiZWNhdXNlIHRoZSByZW1haW5kZXIgKHRoZSBkYXRhIGJsb2NrKSB2YXJpZXMgaW4gc2l6ZSBiZXR3ZWVuIDMyLWJpdCBhbmQKNjQtYml0IHN5c3RlbXMuCgoyLiBBZGRlZCBhbiBleHRyYSBhcmd1bWVudCB0byBwY3JlX2V4ZWMoKSB0byBzdXBwbHkgYW4gb2Zmc2V0IGluIHRoZSBzdWJqZWN0IHRvCnN0YXJ0IG1hdGNoaW5nIGF0LiBUaGlzIGFsbG93cyBsb29rYmVoaW5kcyB0byB3b3JrIHdoZW4gc2VhcmNoaW5nIGZvciBtdWx0aXBsZQpvY2N1cnJlbmNlcyBpbiBhIHN0cmluZy4KCjMuIEFkZGVkIGFkZGl0aW9uYWwgb3B0aW9ucyB0byBwY3JldGVzdCBmb3IgdGVzdGluZyBtdWx0aXBsZSBvY2N1cnJlbmNlczoKCiAgIC8rICAgb3V0cHV0cyB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHRoYXQgZm9sbG93cyBhIG1hdGNoCiAgIC9nICAgbG9vcHMgZm9yIG11bHRpcGxlIG9jY3VycmVuY2VzLCB1c2luZyB0aGUgbmV3IHN0YXJ0b2Zmc2V0IGFyZ3VtZW50CiAgIC9HICAgbG9vcHMgZm9yIG11bHRpcGxlIG9jY3VycmVuY2VzIGJ5IHBhc3NpbmcgYW4gaW5jcmVtZW50ZWQgcG9pbnRlcgoKNC4gUENSRSB3YXNuJ3QgZG9pbmcgdGhlICJmaXJzdCBjaGFyYWN0ZXIiIG9wdGltaXphdGlvbiBmb3IgcGF0dGVybnMgc3RhcnRpbmcKd2l0aCBcYiBvciBcQiwgdGhvdWdoIGl0IHdhcyBkb2luZyBpdCBmb3Igb3RoZXIgbG9va2JlaGluZCBhc3NlcnRpb25zLiBUaGF0IGlzLAppdCB3YXNuJ3Qgbm90aWNpbmcgdGhhdCBhIG1hdGNoIGZvciBhIHBhdHRlcm4gc3VjaCBhcyAvXGJ4eXovIGhhcyB0byBzdGFydCB3aXRoCnRoZSBsZXR0ZXIgJ3gnLiBPbiBsb25nIHN1YmplY3Qgc3RyaW5ncywgdGhpcyBnaXZlcyBhIHNpZ25pZmljYW50IHNwZWVkLXVwLgoKClZlcnNpb24gMi4wNSAyMS1BcHItOTkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gQ2hhbmdlZCB0aGUgdHlwZSBvZiBtYWdpY19udW1iZXIgZnJvbSBpbnQgdG8gbG9uZyBpbnQgc28gdGhhdCBpdCB3b3Jrcwpwcm9wZXJseSBvbiAxNi1iaXQgc3lzdGVtcy4KCjIuIEZpeGVkIGEgYnVnIHdoaWNoIGNhdXNlZCBwYXR0ZXJucyBzdGFydGluZyB3aXRoIC4qIG5vdCB0byB3b3JrIGNvcnJlY3RseQp3aGVuIHRoZSBzdWJqZWN0IHN0cmluZyBjb250YWluZWQgbmV3bGluZSBjaGFyYWN0ZXJzLiBQQ1JFIHdhcyBhc3N1bWluZwphbmNob3JpbmcgZm9yIHN1Y2ggcGF0dGVybnMgaW4gYWxsIGNhc2VzLCB3aGljaCBpcyBub3QgY29ycmVjdCBiZWNhdXNlIC4qIHdpbGwKbm90IHBhc3MgYSBuZXdsaW5lIHVubGVzcyBQQ1JFX0RPVEFMTCBpcyBzZXQuIEl0IG5vdyBhc3N1bWVzIGFuY2hvcmluZyBvbmx5IGlmCkRPVEFMTCBpcyBzZXQgYXQgdG9wIGxldmVsOyBvdGhlcndpc2UgaXQga25vd3MgdGhhdCBwYXR0ZXJucyBzdGFydGluZyB3aXRoIC4qCm11c3QgYmUgcmV0cmllZCBhZnRlciBldmVyeSBuZXdsaW5lIGluIHRoZSBzdWJqZWN0LgoKClZlcnNpb24gMi4wNCAxOC1GZWItOTkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gRm9yIHBhcmVudGhlc2l6ZWQgc3VicGF0dGVybnMgd2l0aCByZXBlYXRzIHdob3NlIG1pbmltdW0gd2FzIHplcm8sIHRoZQpjb21wdXRhdGlvbiBvZiB0aGUgc3RvcmUgbmVlZGVkIHRvIGhvbGQgdGhlIHBhdHRlcm4gd2FzIGluY29ycmVjdCAodG9vIGxhcmdlKS4KSWYgc3VjaCBwYXR0ZXJucyB3ZXJlIG5lc3RlZCBhIGZldyBkZWVwLCB0aGlzIGNvdWxkIG11bHRpcGx5IGFuZCBiZWNvbWUgYSByZWFsCnByb2JsZW0uCgoyLiBBZGRlZCAvTSBvcHRpb24gdG8gcGNyZXRlc3QgdG8gc2hvdyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50IG9mIGEgc3BlY2lmaWMKcGF0dGVybi4gTWFkZSAtbSBhIHN5bm9ueW0gb2YgLXMgKHdoaWNoIGRvZXMgdGhpcyBnbG9iYWxseSkgZm9yIGNvbXBhdGliaWxpdHkuCgozLiBTdWJwYXR0ZXJucyBvZiB0aGUgZm9ybSAocmVnZXgpe24sbX0gKGkuZS4gbGltaXRlZCBtYXhpbXVtKSB3ZXJlIGJlaW5nCmNvbXBpbGVkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgYmFja3RyYWNraW5nIGFmdGVyIHN1YnNlcXVlbnQgZmFpbHVyZSB3YXMKcGVzc2ltYWwuIFNvbWV0aGluZyBsaWtlIChhKXswLDN9IHdhcyBjb21waWxlZCBhcyAoYSk/KGEpPyhhKT8gaW5zdGVhZCBvZgooKGEpKChhKShhKT8pPyk/IHdpdGggZGlzYXN0cm91cyBwZXJmb3JtYW5jZSBpZiB0aGUgbWF4aW11bSB3YXMgb2YgYW55IHNpemUuCgoKVmVyc2lvbiAyLjAzIDAyLUZlYi05OQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBGaXhlZCB0eXBvIGFuZCBzbWFsbCBtaXN0YWtlIGluIG1hbiBwYWdlLgoKMi4gQWRkZWQgNHRoIGNvbmRpdGlvbiAoR1BMIHN1cGVyc2VkZXMgaWYgY29uZmxpY3QpIGFuZCBjcmVhdGVkIHNlcGFyYXRlCkxJQ0VOQ0UgZmlsZSBjb250YWluaW5nIHRoZSBjb25kaXRpb25zLgoKMy4gVXBkYXRlZCBwY3JldGVzdCBzbyB0aGF0IHBhdHRlcm5zIHN1Y2ggYXMgL2FiY1wvZGVmLyB3b3JrIGxpa2UgdGhleSBkbyBpbgpQZXJsLCB0aGF0IGlzIHRoZSBpbnRlcm5hbCBcIGFsbG93cyB0aGUgZGVsaW1pdGVyIHRvIGJlIGluY2x1ZGVkIGluIHRoZQpwYXR0ZXJuLiBMb2NrZWQgb3V0IHRoZSB1c2Ugb2YgXCBhcyBhIGRlbGltaXRlci4gSWYgXCBpbW1lZGlhdGVseSBmb2xsb3dzCnRoZSBmaW5hbCBkZWxpbWl0ZXIsIGFkZCBcIHRvIHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4gKHRvIHRlc3QgdGhlIGVycm9yKS4KCjQuIEFkZGVkIHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGV4dHJhY3Rpbmcgc3Vic3RyaW5ncyBhZnRlciBhIHN1Y2Nlc3NmdWwKbWF0Y2guIFVwZGF0ZWQgcGNyZXRlc3QgdG8gbWFrZSBpdCBhYmxlIHRvIHRlc3QgdGhlc2UgZnVuY3Rpb25zLgoKClZlcnNpb24gMi4wMiAxNC1KYW4tOTkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gSW5pdGlhbGl6ZWQgdGhlIHdvcmtpbmcgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGV4dHJhY3Rpb24gc28gdGhhdAp0aGVpciBzYXZpbmcgYW5kIHJlc3RvcmluZyBkb2Vzbid0IHJlZmVyIHRvIHVuaW5pdGlhbGl6ZWQgc3RvcmUuCgoyLiBQdXQgZHVtbXkgY29kZSBpbnRvIHN0dWR5LmMgaW4gb3JkZXIgdG8gdHJpY2sgdGhlIG9wdGltaXplciBvZiB0aGUgSUJNIEMKY29tcGlsZXIgZm9yIE9TLzIgaW50byBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZS4gQXBwYXJlbnRseSBJQk0gaXNuJ3QgZ29pbmcgdG8KZml4IHRoZSBwcm9ibGVtLgoKMy4gUGNyZXRlc3Q6IHRoZSB0aW1pbmcgY29kZSB3YXNuJ3QgdXNpbmcgTE9PUFJFUEVBVCBmb3IgdGltaW5nIGV4ZWN1dGlvbgpjYWxscywgYW5kIHdhc24ndCBwcmludGluZyB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgY29tcGlsaW5nIGNhbGxzLiBJbmNyZWFzZWQgdGhlCmRlZmF1bHQgdmFsdWUgb2YgTE9PUFJFUEVBVCwgYW5kIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZmlndXJlcyBpbiB0aGUKdGltZXMuCgo0LiBDaGFuZ2VkICIvYmluL3JtIiBpbiB0aGUgTWFrZWZpbGUgdG8gIi1ybSIgc28gaXQgd29ya3Mgb24gV2luZG93cyBOVC4KCjUuIFJlbmFtZWQgImRlZnRhYmxlcyIgYXMgImRmdGFibGVzIiB0byBnZXQgaXQgZG93biB0byA4IGNoYXJhY3RlcnMsIHRvIGF2b2lkCmEgYnVpbGRpbmcgcHJvYmxlbSBvbiBXaW5kb3dzIE5UIHdpdGggYSBGQVQgZmlsZSBzeXN0ZW0uCgoKVmVyc2lvbiAyLjAxIDIxLU9jdC05OAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBDaGFuZ2VkIHRoZSBBUEkgZm9yIHBjcmVfY29tcGlsZSgpIHRvIGFsbG93IGZvciB0aGUgcHJvdmlzaW9uIG9mIGEgcG9pbnRlcgp0byBjaGFyYWN0ZXIgdGFibGVzIGJ1aWx0IGJ5IHBjcmVfbWFrZXRhYmxlcygpIGluIHRoZSBjdXJyZW50IGxvY2FsZS4gSWYgTlVMTAppcyBwYXNzZWQsIHRoZSBkZWZhdWx0IHRhYmxlcyBhcmUgdXNlZC4KCgpWZXJzaW9uIDIuMDAgMjQtU2VwLTk4Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuIFNpbmNlIHRoZSAoPj8pIGZhY2lsaXR5IGlzIGluIFBlcmwgNS4wMDUsIGRvbid0IHJlcXVpcmUgUENSRV9FWFRSQSB0byBlbmFibGUKaXQgYW55IG1vcmUuCgoyLiBBbGxvdyBxdWFudGlmaWNhdGlvbiBvZiAoPz4pIGdyb3VwcywgYW5kIG1ha2UgaXQgd29yayBjb3JyZWN0bHkuCgozLiBUaGUgZmlyc3QgY2hhcmFjdGVyIGNvbXB1dGF0aW9uIHdhc24ndCB3b3JraW5nIGZvciAoPz4pIGdyb3Vwcy4KCjQuIENvcnJlY3QgdGhlIGltcGxlbWVudGF0aW9uIG9mIFxaIChpdCBpcyBwZXJtaXR0ZWQgdG8gbWF0Y2ggb24gdGhlIFxuIGF0IHRoZQplbmQgb2YgdGhlIHN1YmplY3QpIGFuZCBhZGQgNS4wMDUncyBceiwgd2hpY2ggcmVhbGx5IGRvZXMgbWF0Y2ggb25seSBhdCB0aGUKdmVyeSBlbmQgb2YgdGhlIHN1YmplY3QuCgo1LiBSZW1vdmUgdGhlIFxYICJjdXQiIGZhY2lsaXR5OyBQZXJsIGRvZXNuJ3QgaGF2ZSBpdCwgYW5kICg/PiBpcyBuZWF0ZXIuCgo2LiBSZW1vdmUgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBDQVNFTEVTUywgTVVMVElMSU5FLCBET1RBTEwsIGFuZApET0xMQVJfRU5EX09OTFkgYXQgcnVudGltZSwgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdGhlIFBlcmwgNS4wMDUKbG9jYWxpemVkIG9wdGlvbnMuIEFsbCBvcHRpb25zIHRvIHBjcmVfc3R1ZHkoKSB3ZXJlIGFsc28gcmVtb3ZlZC4KCjcuIEFkZCBvdGhlciBuZXcgZmVhdHVyZXMgZnJvbSA1LjAwNToKCiAgICQoPzw9ICAgICAgICAgICBwb3NpdGl2ZSBsb29rYmVoaW5kCiAgICQoPzwhICAgICAgICAgICBuZWdhdGl2ZSBsb29rYmVoaW5kCiAgICg/aW1zeC1pbXN4KSAgICBhZGRlZCB0aGUgdW5zZXR0aW5nIGNhcGFiaWxpdHkKICAgICAgICAgICAgICAgICAgIHN1Y2ggYSBzZXR0aW5nIGlzIGdsb2JhbCBpZiBhdCBvdXRlciBsZXZlbDsgbG9jYWwgb3RoZXJ3aXNlCiAgICg/aW1zeC1pbXN4OikgICBub24tY2FwdHVyaW5nIGdyb3VwcyB3aXRoIG9wdGlvbiBzZXR0aW5nCiAgICg/KGNvbmQpcmV8cmUpICBjb25kaXRpb25hbCBwYXR0ZXJuIG1hdGNoaW5nCgogICBBIGJhY2tyZWZlcmVuY2UgdG8gaXRzZWxmIGluIGEgcmVwZWF0ZWQgZ3JvdXAgbWF0Y2hlcyB0aGUgcHJldmlvdXMKICAgY2FwdHVyZWQgc3RyaW5nLgoKOC4gR2VuZXJhbCB0aWR5aW5nIHVwIG9mIHN0dWR5aW5nIChib3RoIGF1dG9tYXRpYyBhbmQgdmlhICJzdHVkeSIpCmNvbnNlcXVlbnRpYWwgb24gdGhlIGFkZGl0aW9uIG9mIG5ldyBhc3NlcnRpb25zLgoKOS4gQXMgaW4gNS4wMDUsIHVubGltaXRlZCByZXBlYXRlZCBncm91cHMgdGhhdCBjb3VsZCBtYXRjaCBhbiBlbXB0eSBzdWJzdHJpbmcKYXJlIG5vIGxvbmdlciBmYXVsdGVkIGF0IGNvbXBpbGUgdGltZS4gSW5zdGVhZCwgdGhlIGxvb3AgaXMgZm9yY2libHkgYnJva2VuIGF0CnJ1bnRpbWUgaWYgYW55IGl0ZXJhdGlvbiBkb2VzIGFjdHVhbGx5IG1hdGNoIGFuIGVtcHR5IHN1YnN0cmluZy4KCjEwLiBJbmNsdWRlIHRoZSBSdW5UZXN0IHNjcmlwdCBpbiB0aGUgZGlzdHJpYnV0aW9uLgoKMTEuIEFkZGVkIHRlc3RzIGZyb20gdGhlIFBlcmwgNS4wMDVfMDIgZGlzdHJpYnV0aW9uLiBUaGlzIHNob3dlZCB1cCBhIGZldwpkaXNjcmVwYW5jaWVzLCBzb21lIG9mIHdoaWNoIHdlcmUgb2xkIGFuZCB3ZXJlIGFsc28gd2l0aCByZXNwZWN0IHRvIDUuMDA0LiBUaGV5CmhhdmUgbm93IGJlZW4gZml4ZWQuCgoKVmVyc2lvbiAxLjA5IDI4LUFwci05OAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBBIG5lZ2F0ZWQgc2luZ2xlIGNoYXJhY3RlciBjbGFzcyBmb2xsb3dlZCBieSBhIHF1YW50aWZpZXIgd2l0aCBhIG1pbmltdW0KdmFsdWUgb2Ygb25lIChlLmcuICBbXnhdezEsNn0gICkgd2FzIG5vdCBjb21waWxlZCBjb3JyZWN0bHkuIFRoaXMgY291bGQgbGVhZCB0bwpwcm9ncmFtIGNyYXNoZXMsIG9yIGp1c3Qgd3JvbmcgYW5zd2Vycy4gVGhpcyBkaWQgbm90IGFwcGx5IHRvIG5lZ2F0ZWQgY2xhc3Nlcwpjb250YWluaW5nIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyLCBvciB0byBtaW5pbWEgb3RoZXIgdGhhbiBvbmUuCgoKVmVyc2lvbiAxLjA4IDI3LU1hci05OAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBBZGQgUENSRV9VTkdSRUVEWSB0byBpbnZlcnQgdGhlIGdyZWVkaW5lc3Mgb2YgcXVhbnRpZmllcnMuCgoyLiBBZGQgKD9VKSBhbmQgKD9YKSB0byBzZXQgUENSRV9VTkdSRUVEWSBhbmQgUENSRV9FWFRSQSByZXNwZWN0aXZlbHkuIFRoZQpsYXR0ZXIgbXVzdCBhcHBlYXIgYmVmb3JlIGFueXRoaW5nIHRoYXQgcmVsaWVzIG9uIGl0IGluIHRoZSBwYXR0ZXJuLgoKClZlcnNpb24gMS4wNyAxNi1GZWItOTgKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gQSBwYXR0ZXJuIHN1Y2ggYXMgLygoYSkqKSovIHdhcyBub3QgYmVpbmcgZGlhZ25vc2VkIGFzIGluIGVycm9yICh1bmxpbWl0ZWQKcmVwZWF0IG9mIGEgcG90ZW50aWFsbHkgZW1wdHkgc3RyaW5nKS4KCgpWZXJzaW9uIDEuMDYgMjMtSmFuLTk4Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuIEFkZGVkIE1hcmt1cyBPYmVyaHVtZXIncyBsaXR0bGUgcGF0Y2hlcyBmb3IgQysrLgoKMi4gTGl0ZXJhbCBzdHJpbmdzIGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzIHdlcmUgYnJva2VuLgoKClZlcnNpb24gMS4wNSAyMy1EZWMtOTcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gTmVnYXRlZCBjaGFyYWN0ZXIgY2xhc3NlcyBjb250YWluaW5nIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyIHdlcmUgZmFpbGluZyBpZgpQQ1JFX0NBU0VMRVNTIHdhcyBzZXQgYXQgcnVuIHRpbWUuCgoKVmVyc2lvbiAxLjA0IDE5LURlYy05NwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBDb3JyZWN0ZWQgdGhlIG1hbiBwYWdlLCB3aGVyZSBzb21lICJjb25zdCIgcXVhbGlmaWVycyBoYWQgYmVlbiBvbWl0dGVkLgoKMi4gTWFkZSBkZWJ1Z2dpbmcgb3V0cHV0IHByaW50ICJ7MCx4eHh9IiBpbnN0ZWFkIG9mIGp1c3QgInsseHh4fSIgdG8gYWdyZWUgd2l0aAppbnB1dCBzeW50YXguCgozLiBGaXhlZCBtZW1vcnkgbGVhayB3aGljaCBvY2N1cnJlZCB3aGVuIGEgcmVnZXggd2l0aCBiYWNrIHJlZmVyZW5jZXMgd2FzCm1hdGNoZWQgd2l0aCBhbiBvZmZzZXRzIHZlY3RvciB0aGF0IHdhc24ndCBiaWcgZW5vdWdoLiBUaGUgdGVtcG9yYXJ5IG1lbW9yeQp0aGF0IGlzIHVzZWQgaW4gdGhpcyBjYXNlIHdhc24ndCBiZWluZyBmcmVlZCBpZiB0aGUgbWF0Y2ggZmFpbGVkLgoKNC4gVGlkaWVkIHBjcmV0ZXN0IHRvIGVuc3VyZSBpdCBmcmVlcyBtZW1vcnkgdGhhdCBpdCBnZXRzLgoKNS4gVGVtcG9yYXJ5IG1lbW9yeSB3YXMgYmVpbmcgb2J0YWluZWQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHBhc3NlZCBvZmZzZXRzCnZlY3RvciB3YXMgZXhhY3RseSBiaWcgZW5vdWdoLgoKNi4gQ29ycmVjdGVkIGRlZmluaXRpb24gb2Ygb2Zmc2V0b2YoKSBmcm9tIGNoYW5nZSA1IGJlbG93LgoKNy4gSSBoYWQgc2NyZXdlZCB1cCBjaGFuZ2UgNiBiZWxvdyBhbmQgYnJva2VuIHRoZSBydWxlcyBmb3IgdGhlIHVzZSBvZgpzZXRqbXAoKS4gTm93IGZpeGVkLgoKClZlcnNpb24gMS4wMyAxOC1EZWMtOTcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gQSBlcnJvbmVvdXMgcmVnZXggd2l0aCBhIG1pc3Npbmcgb3BlbmluZyBwYXJlbnRoZXNpcyB3YXMgY29ycmVjdGx5CmRpYWdub3NlZCwgYnV0IFBDUkUgYXR0ZW1wdGVkIHRvIGFjY2VzcyBicmFzdGFja1stMV0sIHdoaWNoIGNvdWxkIGNhdXNlIGNyYXNoZXMKb24gc29tZSBzeXN0ZW1zLgoKMi4gUmVwbGFjZWQgb2Zmc2V0b2YocmVhbF9wY3JlLCBjb2RlKSBieSBvZmZzZXRvZihyZWFsX3BjcmUsIGNvZGVbMF0pIGJlY2F1c2UKaXQgd2FzIHJlcG9ydGVkIHRoYXQgb25lIGJyb2tlbiBjb21waWxlciBmYWlsZWQgb24gdGhlIGZvcm1lciBiZWNhdXNlICJjb2RlIiBpcwphbHNvIGFuIGluZGVwZW5kZW50IHZhcmlhYmxlLgoKMy4gVGhlIGVycm9uZW91cyByZWdleCBhW11iIGNhdXNlZCBhbiBhcnJheSBvdmVycnVuIHJlZmVyZW5jZS4KCjQuIEEgcmVnZXggZW5kaW5nIHdpdGggYSBvbmUtY2hhcmFjdGVyIG5lZ2F0aXZlIGNsYXNzIChlLmcuIC9bXmtdJC8pIGRpZCBub3QKZmFpbCBvbiBkYXRhIGVuZGluZyB3aXRoIHRoYXQgY2hhcmFjdGVyLiAoSXQgd2FzIGdvaW5nIG9uIHRvbyBmYXIsIGFuZCBjaGVja2luZwp0aGUgbmV4dCBjaGFyYWN0ZXIsIHR5cGljYWxseSBhIGJpbmFyeSB6ZXJvLikgVGhpcyB3YXMgc3BlY2lmaWMgdG8gdGhlCm9wdGltaXplZCBjb2RlIGZvciBzaW5nbGUtY2hhcmFjdGVyIG5lZ2F0aXZlIGNsYXNzZXMuCgo1LiBBZGRlZCBhIGNvbnRyaWJ1dGVkIHBhdGNoIGZyb20gdGhlIFRJTiB3b3JsZCB3aGljaCBkb2VzIHRoZSBmb2xsb3dpbmc6CgogICsgQWRkIGFuIHVuZGVmIGZvciBtZW1tb3ZlLCBpbiBjYXNlIHRoZSB0aGUgc3lzdGVtIGRlZmluZXMgYSBtYWNybyBmb3IgaXQuCgogICsgQWRkIGEgZGVmaW5pdGlvbiBvZiBvZmZzZXRvZigpLCBpbiBjYXNlIHRoZXJlIGlzbid0IG9uZS4gKEkgZG9uJ3Qga25vdwogICAgdGhlIHJlYXNvbiBiZWhpbmQgdGhpcyAtIG9mZnNldG9mKCkgaXMgcGFydCBvZiB0aGUgQU5TSSBzdGFuZGFyZCAtIGJ1dAogICAgaXQgZG9lcyBubyBoYXJtKS4KCiAgKyBSZWR1Y2UgdGhlIGlmZGVmJ3MgaW4gcGNyZS5jIHVzaW5nIG1hY3JvIERQUklOVEYsIHRoZXJlYnkgZWxpbWluYXRpbmcKICAgIG1vc3Qgb2YgdGhlIHBsYWNlcyB3aGVyZSB3aGl0ZXNwYWNlIHByZWNlZGVkICcjJy4gSSBoYXZlIGdpdmVuIHVwIGFuZAogICAgYWxsb3dlZCB0aGUgcmVtYWluaW5nIDIgY2FzZXMgdG8gYmUgYXQgdGhlIG1hcmdpbi4KCiAgKyBSZW5hbWUgc29tZSB2YXJpYWJsZXMgaW4gcGNyZSB0byBlbGltaW5hdGUgc2hhZG93aW5nLiBUaGlzIHNlZW1zIHZlcnkKICAgIHBlZGFudGljLCBidXQgZG9lcyBubyBoYXJtLCBvZiBjb3Vyc2UuCgo2LiBNb3ZlZCB0aGUgY2FsbCB0byBzZXRqbXAoKSBpbnRvIGl0cyBvd24gZnVuY3Rpb24sIHRvIGdldCByaWQgb2Ygd2FybmluZ3MKZnJvbSBnY2MgLVdhbGwsIGFuZCBhdm9pZGVkIGNhbGxpbmcgaXQgYXQgYWxsIHVubGVzcyBQQ1JFX0VYVFJBIGlzIHVzZWQuCgo3LiBDb25zdHJ1Y3RzIHN1Y2ggYXMgXGR7OCx9IHdlcmUgY29tcGlsaW5nIGludG8gdGhlIGVxdWl2YWxlbnQgb2YKXGR7OH1cZHswLDY1NTI3fSBpbnN0ZWFkIG9mIFxkezh9XGQqIHdoaWNoIGRpZG4ndCBtYWtlIG11Y2ggZGlmZmVyZW5jZSB0byB0aGUKb3V0Y29tZSwgYnV0IGluIHRoaXMgcGFydGljdWxhciBjYXNlIHVzZWQgbW9yZSBzdG9yZSB0aGFuIGhhZCBiZWVuIGFsbG9jYXRlZCwKd2hpY2ggY2F1c2VkIHRoZSBidWcgdG8gYmUgZGlzY292ZXJlZCBiZWNhdXNlIGl0IHRocmV3IHVwIGFuIGludGVybmFsIGVycm9yLgoKOC4gVGhlIGRlYnVnZ2luZyBjb2RlIGluIGJvdGggcGNyZSBhbmQgcGNyZXRlc3QgZm9yIG91dHB1dHRpbmcgdGhlIGNvbXBpbGVkCmZvcm0gb2YgYSByZWdleCB3YXMgZ29pbmcgd3JvbmcgaW4gdGhlIGNhc2Ugb2YgYmFjayByZWZlcmVuY2VzIGZvbGxvd2VkIGJ5CmN1cmx5LWJyYWNrZXRlZCByZXBlYXRzLgoKClZlcnNpb24gMS4wMiAxMi1EZWMtOTcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gVHlwb3MgaW4gcGNyZS4zIGFuZCBjb21tZW50cyBpbiB0aGUgc291cmNlIGZpeGVkLgoKMi4gQXBwbGllZCBhIGNvbnRyaWJ1dGVkIHBhdGNoIHRvIGdldCByaWQgb2YgcGxhY2VzIHdoZXJlIGl0IHVzZWQgdG8gcmVtb3ZlCidjb25zdCcgZnJvbSB2YXJpYWJsZXMsIGFuZCBmaXhlZCBzb21lIHNpZ25lZC91bnNpZ25lZCBhbmQgdW5pbml0aWFsaXplZAp2YXJpYWJsZSB3YXJuaW5ncy4KCjMuIEFkZGVkIHRoZSAicnVudGVzdCIgdGFyZ2V0IHRvIE1ha2VmaWxlLgoKNC4gU2V0IGRlZmF1bHQgY29tcGlsZXIgZmxhZyB0byAtTzIgcmF0aGVyIHRoYW4ganVzdCAtTy4KCgpWZXJzaW9uIDEuMDEgMTktTm92LTk3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuIFBDUkUgd2FzIGZhaWxpbmcgdG8gZGlhZ25vc2UgdW5saW1pdGVkIHJlcGVhdCBvZiBlbXB0eSBzdHJpbmcgZm9yIHBhdHRlcm5zCmxpa2UgLyhbYWJdKikqLywgdGhhdCBpcywgZm9yIGNsYXNzZXMgd2l0aCBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciBpbiB0aGVtLgoKMi4gTGlrZXdpc2UsIGl0IHdhc24ndCBkaWFnbm9zaW5nIHBhdHRlcm5zIHdpdGggIm9uY2Utb25seSIgc3VicGF0dGVybnMsIHN1Y2gKYXMgLygoPz5hKikpKi8gKGEgUENSRV9FWFRSQSBmYWNpbGl0eSkuCgoKVmVyc2lvbiAxLjAwIDE4LU5vdi05NwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBBZGRlZCBjb21waWxlLXRpbWUgbWFjcm9zIHRvIHN1cHBvcnQgc3lzdGVtcyBzdWNoIGFzIFN1bk9TNCB3aGljaCBkb24ndCBoYXZlCm1lbW1vdmUoKSBvciBzdHJlcnJvcigpIGJ1dCBoYXZlIG90aGVyIHRoaW5ncyB0aGF0IGNhbiBiZSB1c2VkIGluc3RlYWQuCgoyLiBBcnJhbmdlZCB0aGF0ICJtYWtlIGNsZWFuIiByZW1vdmVzIHRoZSBleGVjdXRhYmxlcy4KCgpWZXJzaW9uIDAuOTkgMjctT2N0LTk3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuIEZpeGVkIGJ1ZyBpbiBjb2RlIGZvciBvcHRpbWl6aW5nIGNsYXNzZXMgd2l0aCBvbmx5IG9uZSBjaGFyYWN0ZXIuIEl0IHdhcwppbml0aWFsaXppbmcgYSAzMi1ieXRlIG1hcCByZWdhcmRsZXNzLCB3aGljaCBjb3VsZCBjYXVzZSBpdCB0byBydW4gb2ZmIHRoZSBlbmQKb2YgdGhlIG1lbW9yeSBpdCBoYWQgZ290LgoKMi4gQWRkZWQsIGNvbmRpdGlvbmFsIG9uIFBDUkVfRVhUUkEsIHRoZSBwcm9wb3NlZCAoPz5SRUdFWCkgY29uc3RydWN0aW9uLgoKClZlcnNpb24gMC45OCAyMi1PY3QtOTcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gRml4ZWQgYnVnIGluIGNvZGUgZm9yIGhhbmRsaW5nIHRlbXBvcmFyeSBtZW1vcnkgdXNhZ2Ugd2hlbiB0aGVyZSBhcmUgbW9yZQpiYWNrIHJlZmVyZW5jZXMgdGhhbiBzdXBwbGllZCBzcGFjZSBpbiB0aGUgb3ZlY3Rvci4gVGhpcyBjb3VsZCBjYXVzZSBzZWdmYXVsdHMuCgoKVmVyc2lvbiAwLjk3IDIxLU9jdC05NwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBBZGRlZCB0aGUgXFggImN1dCIgZmFjaWxpdHksIGNvbmRpdGlvbmFsIG9uIFBDUkVfRVhUUkEuCgoyLiBPcHRpbWl6ZWQgbmVnYXRlZCBzaW5nbGUgY2hhcmFjdGVycyBub3QgdG8gdXNlIGEgYml0IG1hcC4KCjMuIEJyb3VnaHQgZXJyb3IgdGV4dHMgdG9nZXRoZXIgYXMgbWFjcm8gZGVmaW5pdGlvbnM7IGNsYXJpZmllZCBzb21lIG9mIHRoZW07CmZpeGVkIG9uZSB0aGF0IHdhcyB3cm9uZyAtIGl0IHNhaWQgInJhbmdlIG91dCBvZiBvcmRlciIgd2hlbiBpdCBtZWFudCAiaW52YWxpZAplc2NhcGUgc2VxdWVuY2UiLgoKNC4gQ2hhbmdlZCBzb21lIGNoYXIgKiBhcmd1bWVudHMgdG8gY29uc3QgY2hhciAqLgoKNS4gQWRkZWQgUENSRV9OT1RCT0wgYW5kIFBDUkVfTk9URU9MIChmcm9tIFBPU0lYKS4KCjYuIEFkZGVkIHRoZSBQT1NJWC1zdHlsZSBBUEkgd3JhcHBlciBpbiBwY3JlcG9zaXguYSBhbmQgdGVzdGluZyBmYWNpbGl0aWVzIGluCnBjcmV0ZXN0LgoKClZlcnNpb24gMC45NiAxNi1PY3QtOTcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gQWRkZWQgYSBzaW1wbGUgInBncmVwIiB1dGlsaXR5IHRvIHRoZSBkaXN0cmlidXRpb24uCgoyLiBGaXhlZCBhbiBpbmNvbXBhdGliaWxpdHkgd2l0aCBQZXJsOiAieyIgaXMgbm93IHRyZWF0ZWQgYXMgYSBub3JtYWwgY2hhcmFjdGVyCnVubGVzcyBpdCBhcHBlYXJzIGluIG9uZSBvZiB0aGUgcHJlY2lzZSBmb3JtcyAie2RkZH0iLCAie2RkZCx9Iiwgb3IgIntkZGQsZGRkfSIKd2hlcmUgImRkZCIgbWVhbnMgIm9uZSBvciBtb3JlIGRlY2ltYWwgZGlnaXRzIi4KCjMuIEZpeGVkIHNlcmlvdXMgYnVnLiBJZiBhIHBhdHRlcm4gaGFkIGEgYmFjayByZWZlcmVuY2UsIGJ1dCB0aGUgY2FsbCB0bwpwY3JlX2V4ZWMoKSBkaWRuJ3Qgc3VwcGx5IGEgbGFyZ2UgZW5vdWdoIG92ZWN0b3IgdG8gcmVjb3JkIHRoZSByZWxhdGVkCmlkZW50aWZ5aW5nIHN1YnBhdHRlcm4sIHRoZSBtYXRjaCBhbHdheXMgZmFpbGVkLiBQQ1JFIG5vdyByZW1lbWJlcnMgdGhlIG51bWJlcgpvZiB0aGUgbGFyZ2VzdCBiYWNrIHJlZmVyZW5jZSwgYW5kIGdldHMgc29tZSB0ZW1wb3JhcnkgbWVtb3J5IGluIHdoaWNoIHRvIHNhdmUKdGhlIG9mZnNldHMgZHVyaW5nIG1hdGNoaW5nIGlmIG5lY2Vzc2FyeSwgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQKYmFja3JlZmVyZW5jZXMgYWx3YXlzIHdvcmsuCgo0LiBJbmNyZWFzZWQgdGhlIGNvbXBhdGliaWxpdHkgd2l0aCBQZXJsIGluIGEgbnVtYmVyIG9mIHdheXM6CgogIChhKSAuIG5vIGxvbmdlciBtYXRjaGVzIFxuIGJ5IGRlZmF1bHQ7IGFuIG9wdGlvbiBQQ1JFX0RPVEFMTCBpcyBwcm92aWRlZAogICAgICB0byByZXF1ZXN0IHRoaXMgaGFuZGxpbmcuIFRoZSBvcHRpb24gY2FuIGJlIHNldCBhdCBjb21waWxlIG9yIGV4ZWMgdGltZS4KCiAgKGIpICQgbWF0Y2hlcyBiZWZvcmUgYSB0ZXJtaW5hdGluZyBuZXdsaW5lIGJ5IGRlZmF1bHQ7IGFuIG9wdGlvbgogICAgICBQQ1JFX0RPTExBUl9FTkRPTkxZIGlzIHByb3ZpZGVkIHRvIG92ZXJyaWRlIHRoaXMgKGJ1dCBub3QgaW4gbXVsdGlsaW5lCiAgICAgIG1vZGUpLiBUaGUgb3B0aW9uIGNhbiBiZSBzZXQgYXQgY29tcGlsZSBvciBleGVjIHRpbWUuCgogIChjKSBUaGUgaGFuZGxpbmcgb2YgXCBmb2xsb3dlZCBieSBhIGRpZ2l0IG90aGVyIHRoYW4gMCBpcyBub3cgc3VwcG9zZWQgdG8gYmUKICAgICAgdGhlIHNhbWUgYXMgUGVybCdzLiBJZiB0aGUgZGVjaW1hbCBudW1iZXIgaXQgcmVwcmVzZW50cyBpcyBsZXNzIHRoYW4gMTAKICAgICAgb3IgdGhlcmUgYXJlbid0IHRoYXQgbWFueSBwcmV2aW91cyBsZWZ0IGNhcHR1cmluZyBwYXJlbnRoZXNlcywgYW4gb2N0YWwKICAgICAgZXNjYXBlIGlzIHJlYWQuIEluc2lkZSBhIGNoYXJhY3RlciBjbGFzcywgaXQncyBhbHdheXMgYW4gb2N0YWwgZXNjYXBlLAogICAgICBldmVuIGlmIGl0IGlzIGEgc2luZ2xlIGRpZ2l0LgoKICAoZCkgQW4gZXNjYXBlZCBidXQgdW5kZWZpbmVkIGFscGhhYmV0aWMgY2hhcmFjdGVyIGlzIHRha2VuIGFzIGEgbGl0ZXJhbCwKICAgICAgdW5sZXNzIFBDUkVfRVhUUkEgaXMgc2V0LiBDdXJyZW50bHkgdGhpcyBqdXN0IHJlc2VydmVzIHRoZSByZW1haW5pbmcKICAgICAgZXNjYXBlcy4KCiAgKGUpIHswfSBpcyBub3cgcGVybWl0dGVkLiAoVGhlIHByZXZpb3VzIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBjb21waWxlZAogICAgICBwYXR0ZXJuKS4KCjUuIENoYW5nZWQgYWxsIHRoZSBuYW1lcyBvZiBjb2RlIGZpbGVzIHNvIHRoYXQgdGhlIGJhc2ljIHBhcnRzIGFyZSBubyBsb25nZXIKdGhhbiAxMCBjaGFyYWN0ZXJzLCBhbmQgYWJvbGlzaGVkIHRoZSB0ZWVueSAiZ2xvYmFscy5jIiBmaWxlLgoKNi4gQ2hhbmdlZCB0aGUgaGFuZGxpbmcgb2YgY2hhcmFjdGVyIGNsYXNzZXM7IHRoZXkgYXJlIG5vdyBkb25lIHdpdGggYSAzMi1ieXRlCmJpdCBtYXAgYWx3YXlzLgoKNy4gQWRkZWQgdGhlIC1kIGFuZCAvRCBvcHRpb25zIHRvIHBjcmV0ZXN0IHRvIG1ha2UgaXQgcG9zc2libGUgdG8gbG9vayBhdCB0aGUKaW50ZXJuYWxzIG9mIGNvbXBpbGF0aW9uIHdpdGhvdXQgaGF2aW5nIHRvIHJlY29tcGlsZSBwY3JlLgoKClZlcnNpb24gMC45NSAyMy1TZXAtOTcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMS4gRml4ZWQgYnVnIGluIHByZS1wYXNzIGNvbmNlcm5pbmcgZXNjYXBlZCAibm9ybWFsIiBjaGFyYWN0ZXJzIHN1Y2ggYXMgXHg1YyBvcgpceDIwIGF0IHRoZSBzdGFydCBvZiBhIHJ1biBvZiBub3JtYWwgY2hhcmFjdGVycy4gVGhlc2Ugd2VyZSBiZWluZyB0cmVhdGVkIGFzCnJlYWwgY2hhcmFjdGVycywgaW5zdGVhZCBvZiB0aGUgc291cmNlIGNoYXJhY3RlcnMgYmVpbmcgcmUtY2hlY2tlZC4KCgpWZXJzaW9uIDAuOTQgMTgtU2VwLTk3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuIFRoZSBmdW5jdGlvbnMgYXJlIG5vdyB0aHJlYWQtc2FmZSwgd2l0aCB0aGUgY2F2ZWF0IHRoYXQgdGhlIGdsb2JhbCB2YXJpYWJsZXMKY29udGFpbmluZyBwb2ludGVycyB0byBtYWxsb2MoKSBhbmQgZnJlZSgpIG9yIGFsdGVybmF0aXZlIGZ1bmN0aW9ucyBhcmUgdGhlCnNhbWUgZm9yIGFsbCB0aHJlYWRzLgoKMi4gR2V0IHBjcmVfc3R1ZHkoKSB0byBnZW5lcmF0ZSBhIGJpdG1hcCBvZiBpbml0aWFsIGNoYXJhY3RlcnMgZm9yIG5vbi0KYW5jaG9yZWQgcGF0dGVybnMgd2hlbiB0aGlzIGlzIHBvc3NpYmxlLCBhbmQgdXNlIGl0IGlmIHBhc3NlZCB0byBwY3JlX2V4ZWMoKS4KCgpWZXJzaW9uIDAuOTMgMTUtU2VwLTk3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuIC8oYil8KDorKS8gd2FzIGNvbXB1dGluZyBhbiBpbmNvcnJlY3QgZmlyc3QgY2hhcmFjdGVyLgoKMi4gQWRkIHBjcmVfc3R1ZHkoKSB0byB0aGUgQVBJIGFuZCB0aGUgcGFzc2luZyBvZiBwY3JlX2V4dHJhIHRvIHBjcmVfZXhlYygpLApidXQgbm90IGFjdHVhbGx5IGRvaW5nIGFueXRoaW5nIHlldC4KCjMuIFRyZWF0ICItIiBjaGFyYWN0ZXJzIGluIGNsYXNzZXMgdGhhdCBjYW5ub3QgYmUgcGFydCBvZiByYW5nZXMgYXMgbGl0ZXJhbHMsCmFzIFBlcmwgZG9lcyAoZS5nLiBbLWF6XSBvciBbYXotXSkuCgo0LiBTZXQgdGhlIGFuY2hvcmVkIGZsYWcgaWYgYSBicmFuY2ggc3RhcnRzIHdpdGggLiogb3IgLio/IGJlY2F1c2UgdGhhdCB0ZXN0cwphbGwgcG9zc2libGUgcG9zaXRpb25zLgoKNS4gU3BsaXQgdXAgaW50byBkaWZmZXJlbnQgbW9kdWxlcyB0byBhdm9pZCBpbmNsdWRpbmcgdW5uZWVkZWQgZnVuY3Rpb25zIGluIGEKY29tcGlsZWQgYmluYXJ5LiBIb3dldmVyLCBjb21waWxlIGFuZCBleGVjIGFyZSBzdGlsbCBpbiBvbmUgbW9kdWxlLiBUaGUgInN0dWR5IgpmdW5jdGlvbiBpcyBzcGxpdCBvZmYuCgo2LiBUaGUgY2hhcmFjdGVyIHRhYmxlcyBhcmUgbm93IGluIGEgc2VwYXJhdGUgbW9kdWxlIHdob3NlIHNvdXJjZSBpcyBnZW5lcmF0ZWQKYnkgYW4gYXV4aWxpYXJ5IHByb2dyYW0gLSBidXQgY2FuIHRoZW4gYmUgZWRpdGVkIGJ5IGhhbmQgaWYgcmVxdWlyZWQuIFRoZXJlIGFyZQpub3cgbm8gY2FsbHMgdG8gaXNhbG51bSgpLCBpc3NwYWNlKCksIGlzZGlnaXQoKSwgaXN4ZGlnaXQoKSwgdG9sb3dlcigpIG9yCnRvdXBwZXIoKSBpbiB0aGUgY29kZS4KCjcuIFR1cm4gdGhlIG1hbGxvYy9mcmVlIGZ1bnRpb25zIHZhcmlhYmxlcyBpbnRvIHBjcmVfbWFsbG9jIGFuZCBwY3JlX2ZyZWUgYW5kCm1ha2UgdGhlbSBnbG9iYWwuIEFib2xpc2ggdGhlIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHRoZW0sIGFzIHRoZSBjYWxsZXIgY2FuIG5vdwpzZXQgdGhlbSBkaXJlY3RseS4KCgpWZXJzaW9uIDAuOTIgMTEtU2VwLTk3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEuIEEgcmVwZWF0IHdpdGggYSBmaXhlZCBtYXhpbXVtIGFuZCBhIG1pbmltdW0gb2YgMSBmb3IgYW4gb3JkaW5hcnkgY2hhcmFjdGVyCihlLmcuIC9hezEsM30vKSB3YXMgYnJva2VuIChJIG1pcy1vcHRpbWl6ZWQgaXQpLgoKMi4gQ2FzZWxlc3MgbWF0Y2hpbmcgd2FzIG5vdCB3b3JraW5nIGluIGNoYXJhY3RlciBjbGFzc2VzIGlmIHRoZSBjaGFyYWN0ZXJzIGluCnRoZSBwYXR0ZXJuIHdlcmUgaW4gdXBwZXIgY2FzZS4KCjMuIE1ha2UgcmFuZ2VzIGxpa2UgW1ctY10gd29yayBpbiB0aGUgc2FtZSB3YXkgYXMgUGVybCBmb3IgY2FzZWxlc3MgbWF0Y2hpbmcuCgo0LiBNYWtlIFBDUkVfQU5DSE9SRUQgcHVibGljIGFuZCBhY2NlcHQgYXMgYSBjb21waWxlIG9wdGlvbi4KCjUuIEFkZCBhbiBvcHRpb25zIHdvcmQgdG8gcGNyZV9leGVjKCkgYW5kIGFjY2VwdCBQQ1JFX0FOQ0hPUkVEIGFuZApQQ1JFX0NBU0VMRVNTIGF0IHJ1biB0aW1lLiBBZGQgZXNjYXBlcyBcQSBhbmQgXEkgdG8gcGNyZXRlc3QgdG8gY2F1c2UgaXQgdG8KcGFzcyB0aGVtLgoKNi4gR2l2ZSBhbiBlcnJvciBpZiBiYWQgb3B0aW9uIGJpdHMgcGFzc2VkIGF0IGNvbXBpbGUgb3IgcnVuIHRpbWUuCgo3LiBBZGQgUENSRV9NVUxUSUxJTkUgYXQgY29tcGlsZSBhbmQgZXhlYyB0aW1lLCBhbmQgKD9tKSBhcyB3ZWxsLiBBZGQgXE0gdG8KcGNyZXRlc3QgdG8gY2F1c2UgaXQgdG8gcGFzcyB0aGF0IGZsYWcuCgo4LiBBZGQgcGNyZV9pbmZvKCksIHRvIGdldCB0aGUgbnVtYmVyIG9mIGlkZW50aWZ5aW5nIHN1YnBhdHRlcm5zLCB0aGUgc3RvcmVkCm9wdGlvbnMsIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyLCBpZiBzZXQuCgo5LiBSZWNvZ25pemUgQysgb3IgQ3tuLG19IHdoZXJlIG4gPj0gMSBhcyBwcm92aWRpbmcgYSBmaXhlZCBzdGFydGluZyBjaGFyYWN0ZXIuCgoKVmVyc2lvbiAwLjkxIDEwLVNlcC05NwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoxLiBQQ1JFIHdhcyBmYWlsaW5nIHRvIGRpYWdub3NlIHVubGltaXRlZCByZXBlYXRzIG9mIHN1YnBhdHRlcm5zIHRoYXQgY291bGQKbWF0Y2ggdGhlIGVtcHR5IHN0cmluZyBhcyBpbiAvKGEqKSovLiBJdCB3YXMgbG9vcGluZyBhbmQgdWx0aW1hdGVseSBjcmFzaGluZy4KCjIuIFBDUkUgd2FzIGxvb3Bpbmcgb24gZW5jb3VudGVyaW5nIGFuIGluZGVmaW5pdGVseSByZXBlYXRlZCBiYWNrIHJlZmVyZW5jZSB0bwphIHN1YnBhdHRlcm4gdGhhdCBoYWQgbWF0Y2hlZCBhbiBlbXB0eSBzdHJpbmcsIGUuZy4gLyhhfClcMSovLiBJdCBub3cgZG9lcyB3aGF0ClBlcmwgZG9lcyAtIHRyZWF0cyB0aGUgbWF0Y2ggYXMgc3VjY2Vzc2Z1bC4KCioqKioK