RGFuaWVsICgzMCBEZWNlbWJlciAyMDAwKQotIE1hZGUgYWxsIEZUUCBjb21tYW5kcyBnZXQgc2VudCB3aXRoIHRoZSB0cmFpbGluZyBDUkxGIGluIG9uZSBzaW5nbGUgd3JpdGUoKQogIGFzIHNwbGl0dGluZyB0aGVtIHVwIHNlZW1zIHRvIGNvbmZ1c2UgYXQgbGVhc3Qgc29tZSBmaXJld2FsbHMgKEZXLTEgYmVpbmcKICBvbmUgbWFqb3IpLgoKRGFuaWVsICgxOSBEZWNlbWJlciAyMDAwKQotIEFkZGVkIGZpbGUgZGVzcmNpcHRvciBhbmQgRklMRSBoYW5kbGUgbGVhayBkZXRlY3Rpb24gdG8gdGhlIG1lbWRlYnVnIHN5c3RlbQogIGFuZCB0aHVzIEkgZm91bmQgYW5kIHJlbW92ZWQgYSBmaWxlIGRlc2NyaXB0b3IgbGVha2FnZSBpbiB0aGUgZnRwIHBhcnRzCiAgdGhhdCBoYXBwZW5lZCB3aGVuIHlvdSBkaWQgUE9SVGVkIGRvd25sb2Fkcy4KCi0gQWRkZWQgYW4gaW5jbHVkZSA8c3RkaW8uaD4gaW4gPGN1cmwvY3VybC5oPiBzaW5jZSBpdCB1c2VzIEZJTEUgKi4KCkRhbmllbCAoMTIgRGVjZW1iZXIgMjAwMCkKLSBNdWx0aXBsZSBVUkwgZG93bmxvYWRzIHdpdGggLU8gd2FzIHN0aWxsIGJ1Z2dpbmcuIE5vdCBhbnltb3JlIEkgdGhpbmsgb3IKICBob3BlLCBvciBhdCBsZWFzdCBJJ3ZlIHRyaWVkLi4uIDotTwoKLSBGcmFuY29pcyBQZXRpdGplYW4gZml4ZWQgYW5vdGhlciAtTyBwcm9ibGVtCgpWZXJzaW9uIDcuNS4xCgpEYW5pZWwgKDExIERlY2VtYmVyIDIwMDApCi0gQ2xlYW5lZCB1cCBhIGZldyBvZiB0aGUgbWFrZWZpbGVzIHRvIHVzZSB1bml4LXN0eWxlIG5ld2xpbmVzIG9ubHkuIEFzIEtldmluCiAgUCBSb3RoIGZvdW5kIG91dCwgYXQgbGVhc3Qgb25lIENWUyBjbGllbnQgYmVoYXZlZCB3cm9uZ2x5IHdoZW4gaXQgZm91bmQKICBkaWZmZXJlbnQgbmV3bGluZSBjb252ZW50aW9ucyB3aXRoaW4gdGhlIHNhbWUgZmlsZS4KCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBjb3JyZWN0ZWQgdGhlIExERkxBR1MgdXNlIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvcgogIHRoZSBTU0wgc3R1ZmYuCgpEYW5pZWwgKDYgRGVjZW1iZXIgMjAwMCkKLSBNYXNzaW1vIFNxdWlsbGFjZSBjb3JyZWN0bHkgZGVzY3JpYmVkIGhvdyBsaWJjdXJsIGNvdWxkIHVzZSBzZXNzaW9uIGlkcyB3aGVuCiAgZG9pbmcgU1NMIGNvbm5lY3Rpb25zLgoKLSBKYW1lcyBHcmlmZml0aHMgZm91bmQgb3V0IHRoYXQgY3VybCB3b3VsZCBjcmFzaCBpZiB0aGUgZmlsZSB5b3Ugc3BlY2lmeSB3aXRoCiAgLW8gaXMgc2hvcnRlciB0aGFuIHRoZSBVUkwhIFRoaXMgdG9vayBzb21lIGhvdXJzIHRvIGZ1bGx5IGh1bnQgZG93biwgYnV0IGl0CiAgaXMgZml4ZWQgbm93LgoKRGFuaWVsICg1IERlY2VtYmVyIDIwMDApCi0gSmFlcGlsIEtpbSBzZW50IHVzIG1ha2VmaWxlcyB0aGF0IGJ1aWxkIGN1cmwgdXNpbmcgdGhlIGZyZWUgd2luZG93cyBib3JsYW5kCiAgY29tcGlsZXIuIFRoZSByb290IG1ha2VmaWxlIG5vdyBhY2NlcHRzICdtYWtlIGJvcmxhbmQnIHRvIGJ1aWxkIGN1cmwgd2l0aAogIHRoYXQgY29tcGlsZXIuCgotIFN0ZWZhbiBSYWRtYW4gcG9pbnRlZCBvdXQgdGhhdCB0aGUgdGVzdCBtYWtlZmlsZXMgZGlkbid0IHVzZSB0aGUgUEVSTAogIHZhcmlhYmxlIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzIGZpZ3VyZSBvdXQuIEFjdHVhbGx5LCB5b3Ugc3RpbGwgbmVlZAogIHBlcmwgaW4gdGhlIHBhdGggZm9yIHRoZSB0ZXN0IHN1aXRlIHRvIHJ1biBvay4KCi0gUmljaCBHcmF5IGZvdW5kIG51bWVyb3VzIHBvcnRhYmlsaXR5IHByb2JsZW1zOgogICogVGhlIFNDTyBjb21waWxlciBnb3QgYW4gZXJyb3Igb24gdGhlIGdldHBhc3NfcigpIHByb3RvdHlwZSBpbiBnZXRwYXNzLmgKICAgIHNpbmNlIHRoZSBjdXJsIG9uZSBkaWZmZXJlZCBmcm9tIHRoZSBTQ08gb25lCiAgKiBUaGUgSFBVWCBjb21waWxlciBnb3QgYW4gZXJyb3IgYmVjYXVzZSBvZiBob3cgY3VybCBkaWQgdGhlIHNpZ2FjdGlvbgogICAgc3R1ZmYgYW5kIHVzZWQgYSBkZWZpbmUgSFBVWCBkb2Vzbid0IGhhdmUgKG9yIG5lZWQpLgogICogQSBmZXcgbW9yZSBwcm9ibGVtcyByZW1haW4gdG8gYmUgcmVzZWFyY2hlZC4KCi0gUGF1bCBIYXJyaW5ndG9uIGV4cGVyaWVuY2VkIGEgY29yZSBkdW1wIHVzaW5nIGh0dHBzLiBOb3QgbXVjaCBkZXRhaWxzIHlldC4KCkRhbmllbCAoNCBEZWNlbWJlciAyMDAwKQotIEr2cm4gSGFydHJvdGggZml4ZWQgYSBwcm9ibGVtIHdpdGggbXVsdGlwbGUgVVJMcyBhbmQgLW8vLU8uCgpWZXJzaW9uIDcuNQoKRGFuaWVsICgxIERlY2VtYmVyIDIwMDApCi0gQ3JhaWcgRGF2aXNvbiBnYXZlIHVzIGhpcyB1cGRhdGVzIG9uIHRoZSBWQysrIG1ha2VmaWxlcywgc28gbm93IGN1cmwgc2hvdWxkCiAgYnVpbGQgZmluZSB3aXRoIHRoZSBNaWNyb3NvZnQgY29tcGlsZXIgb24gd2luZG93cyB0b28uCgotIEZpeGVkIHRoZSBsaWJjdXJsIHZlcnNpb25pbmcgc28gdGhhdCB3ZSBkb24ndCBydWluIG9sZCBwcm9ncmFtcyB3aGVuCiAgcmVsZWFzaW5nIG5ldyBzaGFyZWQgbGlicmFyeSBpbnRlcmZhY2VzLgoKRGFuaWVsICgzMCBOb3ZlbWJlciAyMDAwKQotIFJlbmFtZWQgZG9jcy9SRUFETUUuY3VybCB0byBkb2NzL01BTlVBTCB0byBiZXR0ZXIgcmVmbGVjdCB3aGF0IHRoZSBkb2N1bWVudAogIGFjdHVhbGx5IGNvbnRhaW5zLgoKRGFuaWVsICgyOSBOb3ZlbWJlciAyMDAwKQotIEkgcmVtb3ZlZCBhIGJ1bmNoIG9mICcjaWYgMCcgc2VjdGlvbnMgZnJvbSB0aGUgY29kZS4gVGhleSBvbmx5IG1ha2UgdGhpbmdzCiAgaGFyZGVyIHRvIGZvbGxvdy4gQWZ0ZXIgYWxsLCB3ZSBkbyBoYXZlIGFsbCBvbGRlciB2ZXJzaW9ucyBpbiB0aGUgQ1ZTLgoKVmVyc2lvbiA3LjUtcHJlNQoKRGFuaWVsICgyOCBOb3ZlbWJlciAyMDAwKQotIEkgZmlsbGVkIGluIG1vcmUgZXJyb3IgY29kZXMgaW4gdGhlIG1hbiBwYWdlIGVycm9yIGNvZGUgbGlzdCB0aGF0IGhhZCBiZWVuCiAgbGFnZ2luZy4KCi0gSmFtZXMgR3JpZmZpdGhzIG1haWxlZCBtZSBhIGZpbmUgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIHRoZSBDVVJMT1BUX01BWFJFRElSUwogIGxpYmN1cmwgb3B0aW9uLiBXaGVuIHVzZWQsIGl0J2xsIHByZXZlbnQgbG9jYXRpb24gZm9sbG93aW5nIG1vcmUgdGhhbiB0aGUKICBzZXQgbnVtYmVyIG9mIHRpbWVzLiBJdCBpcyB1c2VmdWwgdG8gYnJlYWsgb3V0IG9mIGVuZGxlc3MgcmVkaXJlY3QtbG9vcHMuCgpEYW5pZWwgKDI3IE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgdHdvIHRlc3QgY2FzZXMgZm9yIGZpbGU6Ly8uCgpEYW5pZWwgKDIyIE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgdGhlIGxpYmN1cmwgQ1VSTE9QVF9GSUxFVElNRSBzZXRvcHQsIHdoZW4gc2V0IGl0IHRyaWVzIHRvIGdldCB0aGUKICBtb2RpZmllZCB0aW1lIG9mIHRoZSByZW1vdGUgZG9jdW1lbnQuIFRoaXMgaXMgYSBzcGVjaWFsIG9wdGlvbiBzaW5jZSBpdAogIGludm9sdmVzIGFuIGV4dHJhIHNldCBvZiBjb21tYW5kcyBvbiBGVFAgc2VydmVycy4gKFVzaW5nIHRoZSBNRFRNIGNvbW1hbmQKICB3aGljaCBpcyBub3QgaW4gdGhlIFJGQzk1OSkKCiAgY3VybF9lYXN5X2dldGluZm8oKSBnb3QgYSBjb3JyZXNwb25kaW5nIENVUkxJTkZPX0ZJTEVUSU1FIHRvIGdldCB0aGUgdGltZQogIGFmdGVyIGEgdHJhbnNmZXIuIEl0J2xsIHJldHVybiBhIHplcm8gaWYgQ1VSTE9QVF9GSUxFVElNRSB3YXNuJ3QgdXNlZCBvciBpZgogIHRoZSB0aW1lIHdhc24ndCBwb3NzaWJsZSB0byBnZXQuCgogIC0taGVhZC8tSSB1c2VkIG9uIGEgRlRQIHNlcnZlciB3aWxsIG5vdyBwcmVzZW50IGEgJ0xhc3QtTW9kaWZpZWQ6JyBoZWFkZXIKICBpZiBjdXJsIGNvdWxkIGdldCB0aGUgdGltZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUuCgotIEFkZGVkIHRoZSBvcHRpb24gJy0tY2FjZXJ0IFtmaWxlXScgdG8gY3VybCwgd2hpY2ggYWxsb3dzIGEgc3BlY2lmaWVkIFBFTQogIGZpbGUgdG8gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZSB3aGVuIGRvaW5nIEhUVFBTCiAgY29ubmVjdGlvbnMuIFRoaXMgaGFzIGJlZW4gcmVxdWVzdGVkLCByYXRoZXIgcmVjZW50bHkgYnkgSHVsa2EgQm9odXNsYXYgYnV0CiAgb3RoZXJzIGhhdmUgYXNrZWQgZm9yIGl0IGJlZm9yZSBhcyB3ZWxsLgoKRGFuaWVsICgyMSBOb3ZlbWJlciAyMDAwKQotIE51bWVyb3VzIGZpeGVzIHRoZSB0ZXN0IHN1aXRlIGhhcyBicm91Z2h0IGludG8gdGhlIGRheWxpZ2h0OgoKICAgKiBjdXJsX3VuZXNjYXBlKCkgY291bGQgcmV0dXJuIGEgdG9vIGxvbmcgc3RyaW5nCiAgICogb24gZnRwIHRyYW5zZmVyIGZhaWx1cmVzLCB0aGVyZSBjb3VsZCBiZSBtZW1vcnkgbGVha3MKICAgKiBmdHAgQ1dEIGNvdWxkIHVzZSBiYWQgZGlyZWN0b3J5IG5hbWVzCiAgICogbWVtZGVidWcgbm93IHVzZXMgdGhlIG1wcmludGYoKSByb3V0aW5lcyBmb3IgYmV0dGVyIHBvcnRhYmlsaXR5CiAgICogZnJlZShOVUxMKSByZW1vdmVkIHdoZW4gZG9pbmcgcmVzdW1lZCB0cmFuc2ZlcnMKCi0gQWRkZWQgYSBidW5jaCBvZiB0ZXN0IGNhc2VzIGZvciBGVFAuCgotIEdlbmVyYWwgY2xlYW51cHMgdG8gbWFrZSBsZXNzIHdhcm5pbmdzIHdpdGggZ2NjIC1XYWxsIC1wZWRhbnRpYy4KCi0gSSBtYWRlIHRoZSB0ZXN0cy9mdHBzZXJ2ZXIucGwgd29yayB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZnRwCiAgb3BlcmF0aW9ucy4gUE9SVCwgUEFTViwgUkVUUiwgU1RPUiwgTElTVCwgU0laRSwgVVNFUiwgUEFTUyBhbGwgd29yayBub3cuIE5vdwogIGFsbCBJIGhhdmUgdG8gZG8gaXMgaW50ZWdyYXRlIHRoZSBmdHAgc2VydmVyIGRvaW5ncyBpbiB0aGUgcnVudGVzdHMucGwKICBzY3JpcHQgc28gdGhhdCBmdHAgdGVzdHMgY2FuIGJlIHJ1biB0aGUgc2FtZSB3YXkgaHR0cCB0ZXN0cyBhbHJlYWR5IHJ1bi4KCkRhbmllbCAoMjAgTm92ZW1iZXIgMjAwMCkKLSBNYWRlIGxpYmN1cmwgY2FwYWJsZSBvZiBkZWFsaW5nIHdpdGggYW55LWxlbmd0aCBVUkxzLiBUaGUgZm9ybWVyIGxpbWl0IG9mCiAgNDA5NiBieXRlcyB3YXMgYSBiaXQgYW5ub3lpbmcgd2hlbiBwZW9wbGUgd2FudGVkIHRvIHVzZSBjdXJsIHRvIHJlYWxseSBtYWtlCiAgbGlmZSB0b3VnaCBvbiBhIHdlYiBzZXJ2ZXIuIE5vdywgdGhlIGNvbW1hbmQgbGluZSBsaW1pdCBpcyB0aGUgbW9zdCBhbm5veWluZwogIGJ1dCB0aGF0IGNhbiBiZSBjaXJjdW12ZW50ZWQgYnkgdXNpbmcgYSBjb25maWcgZmlsZS4KCiAgTk9URTogdGhlcmUgaXMgc3RpbGwgYSA0MDk2LWJ5dGUgbGltaXQgb24gVVJMcyBleHRyYWN0ZWQgZnJvbSBMb2NhdGlvbjoKICBoZWFkZXJzLgoKLSBDb3JyZWN0ZWQgdGhlIHNwZWxsaW5nIG9mICdyZXNvbHZlJyBpbiB0d28gZXJyb3IgbWVzc2FnZXMuCgotIEFsZXhhbmRlciBLb3VyYWtvcyBwb3N0ZWQgYSBidWcgcmVwb3J0IGFuZCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGl0ISBJdAogIHR1cm5lZCBvdXQgdGhhdCBseW54IGFuZCB3Z2V0IHN1cHBvcnQgbG93ZXJjYXNlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzCiAgd2hlcmUgY3VybCBvbmx5IGxvb2tlZCBmb3IgdGhlIHVwcGVyY2FzZSB2ZXJzaW9ucy4gTm93IGN1cmwgd2lsbCB1c2UgdGhlCiAgbG93ZXJjYXNlIHZlcnNpb25zIGlmIHRoZXkgZXhpc3QsIGJ1dCBpZiB0aGV5IGRvbid0LCBpdCdsbCB1c2UgdGhlIHVwcGVyY2FzZQogIHZlcnNpb25zLgoKRGFuaWVsICgxNyBOb3ZlbWJlciAyMDAwKQotIGN1cmxfZm9ybWZyZWUoKSB3YXMgYWRkZWQuIEhvdyBjb21lIG5vIG9uZSBtaXNzZWQgdGhhdCBvbmUgYmVmb3JlPyBJIHJhbiB0aGUKICB0ZXN0IHN1aXRlIHdpdGggdGhlIG1hbGxvYyBkZWJ1ZyBlbmFibGVkIGFuZCBnb3QgbG90cyBvZiAibmljZSIgd2FybmluZ3Mgb24KICBtZW1vcnkgbGVha3MuIFRoZSBtb3N0IHNlcmlvdXMgb25lIHdhcyB0aGlzLiBUaGVyZSB3ZXJlIGFsc28gbGVha3MgaW4gdGhlCiAgY29va2llIGhhbmRsaW5nLCBhbmQgYSBmZXcgZXJyb3JzIHdoZW4gY3VybCBmYWlsZWQgdG8gY29ubmVjdCBhbmQgc2ltaWxhcgogIHRoaW5ncy4gTW9yZSB0ZXN0cyBjYXNlcyB3ZXJlIGFkZGVkIHRvIGNvdmVyIHVwIGFuZCB0byB2ZXJpZnkgdGhhdCB0aGVzZQogIHByb2JsZW1zIGhhdmUgYmVlbiByZW1vdmVkLgoKLSBNdWNobyB1cGRhdGVkIGNvbmZpZyBmaWxlIHBhcnNlciAoSSdtIGRlYWQgdGlyZWQgb2YgYWxsIHRoZSBidWcgcmVwb3J0cyBhbmQKICB3ZWlyZCBiZWhhdmlvdXIgSSBnZXQgb24gdGhlIGZvcm1lciBvbmUpLiBJdCB3b3JrcyBzbGlnaHRseSBkaWZmZXJlbnRseSBub3csCiAgYWx0aG91Z2ggSSBkb3VidCBtYW55IHBlb3BsZSB3aWxsIG5vdGljZSB0aGUgZGlmZmVyZW5jZXMuIFRoZSBtYWluCiAgZGlmZmVyZW5jZSBiZWluZyB0aGF0IGlmIHlvdSB1c2Ugb3B0aW9ucyB0aGF0IHJlcXVpcmUgcGFyYW1ldGVycywgdGhleSBtdXN0CiAgYm90aCBiZSBzcGVjaWZpZWQgb24gdGhlIHNhbWUgbGluZS4gV2l0aCB0aGlzIG5ldyBwYXJzZXIsIHlvdSBjYW4gYWxzbwogIHNwZWNpZnkgbG9uZyBvcHRpb25zIHdpdGhvdXQgJy0tJyBhbmQgeW91IG1heSBzZXBhcmF0ZSBvcHRpb25zIGFuZAogIHBhcmFtZXRlcnMgd2l0aCA6IG9yID0uIEl0IG1ha2VzIGEgY29uZmlnIGZpbGUgbGluZSBjb3VsZCBsb29rIGxpa2U6CgogICAgICAgIHVzZXItYWdlbnQgPSAiZm9vYmFyIGFuZCBzb21ldGhpbmciCgogIFBhcmFtZXRlcnMgd2l0aGluIHF1b3RlcyBtYXkgY29udGFpbiBzcGFjZXMuIFdpdGhvdXQgcXVvdGVzLCB0aGV5J3JlCiAgZXhwZWN0ZWQgdG8gYmUgYSBzaW5nbGUgbm9uLXNwYWNlIHdvcmQuCgogIEhhZCB0byBwYXRjaCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHBhcnNlciBhIGxpdHRsZSB0byBtYWtlIHRoaXMgd29yay4KCi0gQWRkZWQgLS11cmwgYXMgYW4gb3B0aW9uIHRvIGFsbG93IHRoZSBVUkwgdG8gYmUgc3BlY2lmaWVkIHRoaXMgd2F5LiBJdCBtYWtlcwogIHdheSBuaWNlciBjb25maWcgZmlsZXMuIFRoZSBwcmV2aW91cyB3YXkgb2Ygc3BlY2lmeWluZyBVUkxzIGluIHRoZSBjb25maWcKICBmaWxlIGRvZXNuJ3Qgd29yayBhbnltb3JlLgoKRGFuaWVsICgxNSBOb3ZlbWJlciAyMDAwKQotIFVzaW5nIGNlcnRhaW4gY2hhcmFjdGVycyBpbiB1c2VybmFtZXMgb3IgcGFzc3dvcmRzIGZvciBIVFRQIGF1dGhlbnRpY2F0aW9uCiAgZmFpbGVkLiBUaGlzIHdhcyBkdWUgdG8gdGhlIG1wcmludGYoKSB0aGF0IGhhZCBhIHNpbGx5IGNoZWNrIGZvciBsZXR0ZXJzLAogIGFuZCBpZiB0aGV5IHdlcmVuJ3QgaXNwcmludCgpIHRoZXkgd2VyZW4ndCBvdXRwdXRlZCAiYXMtaXMiLiBUaGlzIGNhdXNlZAogIHBhc3N3b3JkcyBhbmQgdXNlcm5hbWVzIHVzaW5nICenJyAoZm9yIGV4YW1wbGUpIHRvIGZhaWwuCgpWZXJzaW9uIDcuNC4yCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDApCi0gJ3Rlc3RzL3J1bnRlc3RzLnBsJyBub3cgc29ydHMgdGhlIHRlc3QgY2FzZXMgcHJvcGVybHkgd2hlbiAnYWxsJyBpcyB1c2VkLgoKRGFuaWVsICgxNCBOb3ZlbWJlciAyMDAwKQotIEkgZmVsbCBvdmVyIHRoZSBkcmFmdC1pZXRmLWZ0cGV4dC1tbHN0LTEyLnR4dCBJbnRlcm5ldCBEcmFmdCB0aXRsZWQKICAiRXh0ZW5zaW9ucyB0byBGVFAiIHRoYXQgY29udGFpbnMgYSBkZWZpbmVkIHdheSBob3cgdGhlIGZ0cCBjb21tYW5kIFNJWkUKICBjb3VsZCBiZSBhc3N1bWVkIHRvIHdvcmsuCgotIExhdXJlbnQgUGFwaWVyIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYWJvdXQgdXNpbmcgIi1DIC0iIGFuZCBGVFAgdXBsb2FkaW5nIGEKICBmaWxlIHRoYXQgaXNuJ3QgcHJzZW50IG9uIHRoZSBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgbWlnaHQgdGhlbiByZXR1cm4gYSA1NTAgYW5kCiAgY3VybCB3aWxsIGZhaWwuIFNob3VsZCBpdCBpbnN0ZWFkIGFzIExhdXJlbnQgUGFwaWVyIHN1Z2dlc3RzLCBzdGFydAogIHVwbG9hZGluZyBmcm9tIHRoZSBiZWdpbm5pbmcgYXMgYSBub3JtYWwgdXBsb2FkPwoKRGFuaWVsICgxMyBOb3ZlbWJlciAyMDAwKQotIEZpeGVkIGEgY3Jhc2ggd2l0aCB0aGUgZm9sbG93bG9jYXRpb24gY291bnRlci4KCi0gV2hpbGUgd3JpdGluZyB0ZXN0IGNhc2VzIGZvciB0aGUgdGVzdCBzdWl0ZSwgSSBkaXNjb3ZlcmVkIGFuIG9sZCBsaW1pdGF0aW9uCiAgdGhhdCBwcmV2ZW50ZWQgLW8gYW5kIC1UIHRvIGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZS4gSSByZW1vdmVkIHRoaXMKICBpbW1lZGlhdGVseSBhcyB0aGlzIGhhcyBubyByZWxldmFuY2UgaW4gdGhlIGN1cnJlbnQgbGliY3VybC4KICAKLSBDaHJpcyBGYWhlcnR5IGZpeGVkIGEgZnJlZS10d2ljZSBwcm9ibGVtIGluIGxpYi9maWxlLmMKCi0gSSBmaXhlZCB0aGUgcGVybCBodHRwIHNlcnZlciBwcm9ibGVtIGluIHRoZSB0ZXN0IHN1aXRlLgoKVmVyc2lvbiA3LjQuMiBwcmU0CgpEYW5pZWwgKDEwIE5vdmVtYmVyIDIwMDApCi0gSSd2ZSAoZmluYWxseSkgc3RhcnRlZCB3b3JraW5nIG9uIHRoZSBjdXJsIHRlc3Qgc3VpdGUuIEl0IGlzIGluIHRoZSBuZXcKICB0ZXN0cy8gZGlyZWN0b3J5LiBJdCByZXF1aXJlcyBzaCBhbmQgcGVybC4gVGhlcmUncyBhIFRDUCBzZXJ2ZXIgaW4gcGVybCBhbmQKICBtb3N0IG9mIHRoZSBvdGhlciBzdHVmZiBydW5uaW5nIGEgcHJldHR5IHNpbXBsZSBzaGVsbCBzY3JpcHQuCgogIEkndmUgb25seSBtYWRlIGZvdXIgdGVzdCBjYXNlcyBzbyBmYXIsIGJ1dCBpdCBwcm92ZXMgdGhlIHN5c3RlbSBjYW4gd29yay4KCi0gTGF1cmVudCBQYXBpZXIgbm90aWNlZCB0aGF0IGN1cmwgZGlkbid0IHNldCBUWVBFIHdoZW4gZG9pbmcgLS1oZWFkIGNoZWNrcwogIGZvciBzaXplcyBvbiBGVFAgc2VydmVycy4gU29tZSBzZXJ2ZXJzIHNlZW0gdG8gcmV0dXJuIGRpZmZlcmVudCBzaXplcwogIGRlcGVuZGluZyBvbiB3aGV0aGVyIEFTQ0lJIG9yIEJJTkFSWSBpcyB1c2VkIQoKLSBMYXVyZW50IFBhcGllciBkZXRlY3RlZCB0aGF0IGlmIHlvdSBhcHBlbmRlZCBhIEZUUCB1cGxvYWQgYW5kIGV2ZXJ5dGhpbmcgd2FzCiAgYWxyZWFkeSB1cGxvYWRlZCwgY3VybCB3b3VsZCBoYW5nLgoKLSBBbmd1cyBNYWNrYXkncyBnZXRwYXNzX3IoKSBpbiBsaWIvZ2V0cGFzcy5jIGlzIG5vdyBjb21wbGlhbnQgd2l0aCB0aGUKICBnZXRwYXNzX3IoKSBmdW5jdGlvbiBpdCBzZWVtcyBzb21lIHN5c3RlbXMgYWN0dWFsbHkgaGF2ZS4KICAKLSBWZW5rYXRhcmFtYW5hIE1va2thcGF0aSBkZXRlY3RlZCBhIGJ1ZyBpbiB0aGUgY29va2llIHBhcnNlciBhbmQgY29ycmVjdGVkCiAgaXQuICBJZiB0aGUgY29va2llIHdhcyBzZXQgZm9yIHRoZSBmdWxsIGhvc3QgbmFtZSAoZG9tYWluPWZ1bGwuaG9zdC5jb20pLAogIHRoZSBjb29raWUgd2FzIG5ldmVyIHNlbnQgYmFjayBiZWNhdXNlIG9mIGEgZmF1bHR5IGxlbmd0aCBjb21wYXJpc29uIGJldHdlZW4KICB0aGUgc2V0IGRvbWFpbiBsZW5ndGggYW5kIHRoZSBjdXJyZW50IGhvc3QgbmFtZS4KCkRhbmllbCAoOSBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGZvciBnZXRob3N0YnluYW1lIGluIC1sc29ja2V0IChPUy8yIHNlZW1zIHRvIG5lZWQKICBpdCkuIEFkZGVkIGEgY2hlY2sgZm9yIFJTQWdsdWUvcnNhcmVmIGZvciB0aGUgY2FzZXMgd2hlcmUgbGliY3J5cHRvIGlzIGZvdW5kCiAgYnV0IGxpYnNzbCBpc24ndC4gSSBoYXZlbid0IHZlcmlmaWVkIHRoaXMgZml4IHlldCB0aG91Z2gsIGFzIEkgaGF2ZSBubwogIHN5c3RlbSB0aGF0IHJlcXVpcmVzIHRob3NlIGxpYnMgdG8gYnVpbGQuCiAgClZlcnNpb24gNy40LjIgcHJlMwoKRGFuaWVsICg3IE5vdmVtYmVyIDIwMDApCi0gUmVtb3ZlZCBwZXJyb3IoKSBvdXRwdXRzIGZyb20gZ2V0cGFzcy5jLiBBbmd1cyBNYWNrYXkgYWxzbyBhZ3JlZWQgdG8gYQogIHNsaWdodGx5IG1vZGlmaWVkIGxpY2Vuc2Ugb2YgdGhlIGdldHBhc3MuYyBmaWxlIGFzIHRoZSBwcm90b3R5cGUgd2FzIGNoYW5nZWQuCgpEYW5pZWwgKDYgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBwb3NzaWJpbGl0eSB0byBzZXQgYSBwYXNzd29yZCBjYWxsYmFjayB0byB1c2UgaW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4uCiAgVGhleSdyZSBjb250cm9sZWQgd2l0aCBjdXJsX2Vhc3lfc2V0b3B0KCkgb2YgY291cnNlLCB0aGUgdGFncyBhcmUKICBDVVJMT1BUX1BBU1NXREZVTkNUSU9OIGFuZCBDVVJMT1BUX1BBU1NXRERBVEEuCgotIFVzZWQgVC4gQmhhcmF0aCdzIHRoaW5raW5nIGFuZCBmaXhlZCB0aGUgdGltZXJzIHRoYXQgc2hvd2VkIHRlcnJpYmx5IHdyb25nCiAgdGltZXMgd2hlbiBsb2NhdGlvbjogaGVhZGVycyB3ZXJlIGZvbGxvd2VkLgoKLSBFbW1hbnVlbCBUeWNob24gZGlzY292ZXJlZCB0aGF0IGN1cmwgZGlkbid0IHJlYWxseSBsaWtlIHVzZXIgbmFtZXMgb25seSBpbgogIHRoZSBVUkwuIEkgY29ycmVjdGVkIHRoaXMgYW5kIEkgYWxzbyBmaXhlZCB0aGUgc2luY2UgbG9uZyBsaXZpbmcgcHJvYmxlbQogIHdpdGggVVJMIGVuY29kZWQgdXNlciBuYW1lcyBhbmQgcGFzc3dvcmRzIGluIHRoZSBVUkxzLiBUaGV5IHNob3VsZCB3b3JrIG5vdy4KICAKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDApCi0gV2hlbiBJIGFkZGVkIC0taW50ZXJmYWNlLCB0aGUgbmV3IGVycm9yIGNvZGUgdGhhdCB3YXMgYWRkZWQgd2l0aCBpdCB3YXMKICBpbnNlcnRlZCBpbiB0aGUgd3JvbmcgcGxhY2UgYW5kIHRodXMgYWxsIGVycm9yIGNvZGVzIGZyb20gMzUgYW5kIHVwd2FyZHMgZ290CiAgaW5jcmVhc2VkIG9uZSBzdGVwLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQsIHdlJ3JlIGJhY2sgYXQgdGhlIHByZXZpb3VzCiAgbnVtYmVycy4gQWxsIG5ldyBleGl0IGNvZGVzIHNob3VsZCBiZSBhZGRlZCBhdCB0aGUgZW5kLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgYSBjaGVjayBmb3Igc2lnbmFsKCkgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc28gdGhhdCBpZiBzaWdhY3Rpb24oKQogIGlzbid0IHByZXNlbnQsIHdlIGNhbiB1c2Ugc2lnbmFsKCkgaW5zdGVhZC4KCi0gSSdtIGhhdmluZyBhIGxpY2Vuc2UgZGlzY3Vzc2lvbiBnb2luZyBvbiBwcml2YXRlbHkuIFRoZSBpc3N1ZSBpcyB5ZXQgYWdhaW4KICBHUEwtbGljZW5zZWQgcHJvZ3JhbXMgdGhhdCBoYXZlIHByb2JsZW1zIHdpdGggTVBMLiBJIGFtIGxlYW5pbmcgdG93YXJkcwogIG1ha2luZyBhIGtpbmQgb2YgZHVhbC1saWNlbnNlIHRoYXQgd2lsbCBzb2x2ZSB0aGlzIG9uY2UgYW5kIGZvciBhbGwuLi4KCkRhbmllbCAoMzEgT2N0b2JlciAyMDAwKQotIEFkZGVkIHRoZSBwYWNrYWdlcy8gZGlyZWN0b3J5LiBJIGludGVuZCB0byBsZXQgdGhpcyBjb250YWluIHNvbWUgZG9jcyBhbmQKICB0ZW1wbGF0ZXMgb24gaG93IHRvIGdlbmVyYXRlIGN1c3RvbS1mb3JtYXQgcGFja2FnZXMgZm9yIHZhcmlvdXMgcGxhdGZvcm1zLgogIEkndmUgbm93IHJlbW92ZWQgdGhlIFJQTSByZWxhdGVkIGN1cmwuc3BlYyBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlIHJvb3QuCgpEYW5pZWwgKDMwIE9jdG9iZXIgMjAwMCkKLSBULiBCaGFyYXRoIGJyb3VnaHQgYSBzZXQgb2YgcGF0Y2hlcyB0aGF0IGJyaW5nIG5ldyBmdW5jdGlvbmFsaXR5IHRvCiAgY3VybF9lYXN5X2dldGluZm8oKSBhbmQgY3VybF9lYXN5X3NldG9wdCgpLiBOb3cgeW91IGNhbiByZXF1ZXN0IHBlZXIKICBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gd2l0aCB0aGUgKnNldG9wdCgpIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgb3B0aW9uCiAgYW5kIHRoZW4gdXNlIHRoZSBDVVJMT1BUX0NBSU5GTyB0byBzZXQgdGhlIGNlcnRpZmljYXRlIHRvIHZlcmlmeSB0aGUgcmVtb3RlCiAgcGVlciBhZ2FpbnN0LiBBZnRlciBhbiBzdWNoIGFuIG9wZXJhdGlvbiB3aXRoIGEgdmVyaWZpY2F0aW9uIHJlcXVlc3QsIHRoZQogICpfZ2V0aW5mbygpIG9wdGlvbiBDVVJMSU5GT19TU0xfVkVSSUZZUkVTVUxUIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0CiAgd2hldGhlciB0aGUgdmVyaWZpY2F0aW9uIHN1Y2NlZWRlZCBvciBub3QuICAKCkRhbmllbCAoMjcgT2N0b2JlciAyMDAwKQotIEdlb3JnIEhvcm4gYnJvdWdodCB1cyBhIHNwbGVuZGlkIHBhdGNoIHRoYXQgc29sdmVzIHRoZSBsb25nLXN0YW5kaW5nCiAgYW5ub3lpbmcgcHJvYmxlbSB3aXRoIHRpbWVvdXRzIHRoYXQgbWFkZSBjdXJsIGV4aXQgd2l0aCBzaWxseSBleGl0IGNvZGVzCiAgKHdoaWNoIGFzIGJlZW4gY29tbWVudGVkIG91dCBsYXRlbHkpLiBUaGlzIHNvbHV0aW9uIGlzIHNpZ2FjdGlvbigpIGJhc2VkIGFuZAogIG9mIGNvdXJzZSB0aGVuIG9ubHkgd29ya3MgZm9yIHVuaXhlcyAoYW5kIG9ubHkgdGhvc2UgdW5peGVzIHRoYXQgYWN0dWFsbHkKICBoYXZlIHRoZSBzaWdhY3Rpb24oKSBmdW5jdGlvbikuCgpEYW5pZWwgKDI2IE9jdG9iZXIgMjAwMCkKLSBCavZybiBTdGVuYmVyZyBzdXBwbGllZCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIGZsYXcgbWVudGlvbmVkIGJ5IEtldmluIFJvdGgKICB0aGF0IG1hZGUgdGhlIHBhc3N3b3JkIGdldCBlY2hvZWQgd2hlbiBwcm9tcHRlZCBmb3IgaW50ZXJhY3RpdmVseS4gVGhlCiAgZ2V0cGFzcygpIGZ1bmN0aW9uIChub3cga25vd24gYXMgbXlfZ2V0cGFzcygpKSB3YXMgYWxzbyBmaXhlZCB0byBub3QgdXNlIGFueQogIHN0YXRpYyBidWZmZXJzLiBUaGlzIGFsc28gbWVhbnMgd2UgY2Fubm90IHVzZSB0aGUgInN0YW5kYXJkIiBnZXRwYXNzKCkKICBmdW5jdGlvbiBldmVuIGZvciB0aG9zZSBzeXN0ZW1zIHRoYXQgaGF2ZSBpdCwgc2luY2UgaXQgaXNuJ3QgdGhyZWFkLXNhZmUuCiAgCi0gS2V2aW4gUm90aCBmb3VuZCBvdXQgdGhhdCBpZiB5b3UnZCB3cml0ZSBhIGNvbmZpZyBmaWxlIHdpdGggJy12IHVybCcsIHRoZQogIHVybCB3b3VsZCBub3QgYmUgdXNlZCBhcyAiZGVmYXVsdCBVUkwiIGFzIGRvY3VtZW50ZWQsIGFsdGhvdWdoIGlmIHlvdSB3cm90ZQogIGl0ICd1cmwgLXYnIGl0IHdvcmtlZCEgVGhpcyBoYXMgYmVlbiBjb3JyZWN0ZWQgbm93LgoKLSBLZXZpbiBSb3RoJ3MgaWRlYSBvZiB1c2luZyBtdWx0aXBsZSAtZCBvcHRpb25zIG9uIHRoZSBzYW1lIGNvbW1hbmQgbGluZSB3YXMKICBqdXN0IGJyaWxsaWFudCwgYW5kIEkgY291bGRuJ3QgcmVhbGx5IHRoaW5rIG9mIGFueSByZWFzb24gd2h5IHdlIHNob3VsZG4ndAogIHN1cHBvcnQgaXQhIFRoZSBhcHBlbmQgZnVuY3Rpb24gYWx3YXlzIGFwcGVuZCAnJicgYW5kIHRoZW4gdGhlIG5ldyAtZAogIGNodW5rLiBUaGlzIGVuYWJsZXMgY29uc3RydWN0cyBsaWtlIHRoZSBmb2xsb3dpbmc6CgogICAgICAgIGN1cmwgLWQgbmFtZT1kYW5pZWwgLWQgYWdlPXVua25vd24gZm9vYmFyc2l0ZS5jb20KCkRhbmllbCAoMjQgT2N0b2JlciAyMDAwKQotIEkgZml4ZWQgdGhlIGxpYi9tZW1kZWJ1Zy5jIHNvdXJjZSBzbyB0aGF0IGl0IGNvbXBpbGVzIG9uIExpbnV4IGFuZCBvdGhlcgogIHN5c3RlbXMuIEl0IHdpbGwgYmUgdXNlZnVsIG9uZSBkYXkgd2hlbiBzb21lb25lIGVsc2UgYnV0IG1lIHdhbnRzIHRvIHJ1biB0aGUKICBtZW1vcnkgZGVidWdnaW5nIHN5c3RlbS4KCkRhbmllbCAoMjMgT2N0b2JlciAyMDAwKQotIEkgbW9kaWZpZWQgdGhlIG1ha2V0Z3ogYW5kIGNvbmZpZ3VyZSBzY3JpcHRzLCBzbyB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0CiAgd2lsbCBmZXRjaCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbSB0aGUgaW5jbHVkZS9jdXJsL2N1cmwuaCBoZWFkZXIgZmlsZXMsIGFuZAogIHRoZW4gdGhlIG1ha2V0Z3ogZG9lc24ndCBoYXZlIHRvIHJlYnVpbGQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBJIGJ1aWxkCiAgcmVsZWFzZS1hcmNoaXZlcy4KCi0gQmr2cm4gU3RlbmJlcmcgYW5kIExpbnVzIE5pZWxzZW4gY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCB3YXMgc2lsbHkKICBlbm91Z2ggdG8gbm90IGFsbG93IEAtbGV0dGVycyBpbiBwYXNzd29yZHMgd2hlbiB0aGV5IHdlcmUgc3BlY2lmaWVkIHdpdGggdGhlCiAgLXUgb3IgLVUgZmxhZ3MgKENVUkxPUFRfVVNFUlBXRCBhbmQgQ1VSTE9QVF9QUk9YWVVTRVJQV0QpLiBUaGlzIGFsc28KICBzdWdnZXN0cyB0aGF0IGN1cmwgcHJvYmFibHkgc2hvdWxkIHVybC1kZWNvZGUgdGhlIHBhc3N3b3JkIHBpZWNlIG9mIGFuIFVSTAogIHNvIHRoYXQgeW91IGNvdWxkIHBhc3MgYW4gZW5jb2RlZCBALWxldHRlciB0aGVyZS4uLgogIApEYW5pZWwgKDIwIE9jdG9iZXIgMjAwMCkKLSBZZXQgYW5vdGhlciBodHRwIHNlcnZlciBiYXJmZWQgb24gY3VybCdzIHJlcXVlc3QgdGhhdCBpbmNsdWRlIHRoZSBwb3J0CiAgbnVtYmVyIGluIHRoZSBIb3N0OiBoZWFkZXIgYWx3YXlzLiBJIG5vdyBvbmx5IGluY2x1ZGUgdGhlIHBvcnQgbnVtYmVyIGlmIGl0CiAgaXNuJ3QgdGhlIGRlZmF1bHQgKDgwIGZvciBIVFRQLCA0NDMgZm9yIEhUVFBTKS4gd3d3LnBlcmwuY29tIHR1cm5lZCBvdXQgdG8KICBydW4gb25lIG9mIHRob3NlIG5hc3R5IHNlcnZlcnMuCgotIFRoZSBQSFA0IG1vZHVsZSBmb3IgY3VybCBoYWQgcHJvYmxlbXMgd2l0aCByZWZlcmVyIHRoYXQgc2VlbXMgdG8gaGF2ZSBiZWVuCiAgY29ycmVjdGVkIGp1c3QgeWVzdGVyZGF5LiAoU3RlcmxpbmcgSHVnaGVzIG9mIHRoZSBQSFAgdGVhbSBjb25maXJtZWQgdGhpcykKCkRhbmllbCAoMTcgT2N0b2JlciAyMDAwKQotIFZsYWRpbWlyIE9ibG9tb3YgcmVwb3J0ZWQgdGhhdCB0aGUgLVkgYW5kIC15IG9wdGlvbnMgZGlkbid0IHdvcmsuIFRoZXkKICBkaWRuJ3Qgd29yayBmb3IgbWUgZWl0aGVyLiBUaGlzIG9uY2UgYWdhaW4gcHJvdmVzIHdlIHNob3VsZCBoYXZlIHRoYXQgdGVzdAogIHN1aXRlLi4uCiAgCi0gSSBmaW5hbGx5IGNoYW5nZWQgdGhlIGVycm9yIG1lc3NhZ2UgbGliY3VybCByZXR1cm5zIGlmIHlvdSB0cnkgYSBodHRwczovLwogIFVSTCB3aGVuIHRoZSBsaWJyYXJ5IHdhc24ndCBidWlsZCB3aXRoIFNTTCBlbmFibGVkLiBJdCB3aWxsIG5vdyByZXR1cm4gdGhpcwogIGVycm9yOgogICAgICAgICJsaWJjdXJsIHdhcyBidWlsdCB3aXRoIFNTTCBkaXNhYmxlZCwgaHR0cHM6IG5vdCBzdXBwb3J0ZWQhIgoKICBJIHJlYWxseSBob3BlIGl0IHdpbGwgbWFrZSBpdCBhIGJpdCBjbGVhcmVyIHRvIHVzZXJzIHdoZXJlIHRoZSBhY3R1YWwKICBwcm9ibGVtIGxpZXMuCgpWZXJzaW9uIDcuNC4xCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwMCkKLSBJIGZvcmdvdCB0byByZW1vdmUgc29tZSBvZiB0aGUgbWFsbG9jIGRlYnVnIGRlZmluZXMgZnJvbSB0aGUgbWFrZWZpbGVzIGluCiAgdGhlIHJlbGVhc2UgYXJjaGl2ZSAob2YgY291cnNlKS4KClZlcnNpb24gNy40CgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwMCkKLSBUaGUgYnVmZmVyIG92ZXJmbG93IG1lbnRpb25lZCBiZWxvdyB3YXMgcG9zdGVkIHRvIGJ1Z3RyYXEgb24gRnJpZGF5IDEzdGguCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwMCkKLSBDb2xpbiBSb2JlcnQgUGhpcHBzIGVsZWdhbnRseSBjb3JyZWN0ZWQgYSBidWZmZXIgb3ZlcmZsb3cuIEl0IGNvdWxkIGJlIHVzZWQKICBieSBhbiBldmlsIGZ0cCBzZXJ2ZXIgdG8gY3Jhc2ggY3VybC4gSSB0b29rIHRoZSBvcHBvcnR1bml0eSBvZiByZXBsYWNpbmcgYQogIGZldyBvdGhlciBzcHJpbnRmKClzIGludG8gc25wcmludGYoKXMgYXMgd2VsbC4KCkRhbmllbCAoMTEgT2N0b2JlciAyMDAwKQotIEZvdW5kIHNvbWUgbW9yZSBtZW1vcnkgbGVha3MuIFRoaXMgbmV3IHNpbXBsZSBtZW1vcnkgZGVidWdnZXIgaGFzIHR1cm5lZCBvdXQKICByZWFsbHkgdXNlZnVsIQoKVmVyc2lvbiA3LjQgcHJlNgoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMCkKLSBGbG9yaWFuIEtvZW5pZyBwb2ludGVkIG91dCB0aGF0IHRoZSBib29sIHR5cGVkZWYgaW4gdGhlIGN1cmwvY3VybC5oIGluY2x1ZGUKICBmaWxlIHdhcyBicmVha2luZyBQSFAgNC4wLjMgY29tcGlsaW5nLiBUaGUgYm9vbCB0eXBlZGVmIGlzIG5vdCB1c2VkIGluIHRoZQogIHB1YmxpYyBpbnRlcmZhY2UgYW5kIHdhcyB3cm9uZ2x5IGluc2VydGVkIGluIHRoYXQgaGVhZGVyIGZpbGUuCgotIEr2cmcgSGFydHJvdGggY29ycmVjdGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgaW4gdGhlIHNyYy91cmxnbG9iLmMgc3R1ZmYuIEl0CiAgZGlkbid0IGhhcm0gYW55b25lIHNpbmNlIHRoZSBtZW1vcnkgaXMgZnJlZSgpZWQgb24gZXhpdCBhbnl3YXkuCgotIENvcnJlY3RlZCB0aGUgc3JjL21haW4uYy4gV2UgdXNlIHRoZSBfTVBSSU5URl9SRVBMQUNFICNkZWZpbmUgdG8gdXNlIG91cgogIGxpYmN1cmwtcHJpbnRmKCkgZnVuY3Rpb25zLiBUaGlzIGdpdmVzIHVzIHNucHJpbnRmKCkgZXQgYWwgb24gYWxsCiAgcGxhdGZvcm1zLiBJIGNvbnZlcnRlZCB0aGUgYWxsb2NhdGVkIHVzZXJhZ2VudCBzdHJpbmcgdG8gb25lIHRoYXQgdXNlcyBhCiAgbG9jYWwgYnVmZmVyLgoKLSBJJ3ZlIHNldCBhbiAjaWYgMCBzZWN0aW9uIGFyb3VuZCB0aGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIKICBnZW5lcmF0ZWQgaW4gbGliL2Zvcm1kYXRhLmMuIFRoaXMgd2lsbCBob3BlZnVsbHkgbWFrZSBjdXJsIGRvIG1vcmUKICBQSFAtZnJpZW5kbHkgbXVsdGktcGFydCBwb3N0cy4KClZlcnNpb24gNy40IHByZTUKCkRhbmllbCAoOSBPY3RvYmVyIDIwMDApCi0gTmljbyBCYWdndXMgZm91bmQgb3V0IHRoYXQgY3VybCdzIGFiaWxpdHkgdG8gZm9yY2UgYSBBU0NJSSBkb3dubG9hZCB3aGVuCiAgdXNpbmcgRlRQIHdhcyBubyBsb25nZXIgd29ya2luZyEgSSBjb3JyZWN0ZWQgdGhpcy4gVGhpcyBwcm9ibGVtIHdhcyBwcm9iYWJseQogIGludHJvZHVjZWQgd2hlbiBJIHJlZGVzaWduZWQgbGliY3VybCBmb3IgdmVyc2lvbiA3LgoKLSBHZW9yZyBIb3JuIHByb3ZpZGVkIGEgc291cmNlIGV4YW1wbGUgdGhhdCBwcm92ZWQgYSBtZW1vcnkgbGVhayBpbiBsaWJjdXJsLgogIEkgYWRkZWQgc2ltcGxlIG1lbW9yeSBkZWJ1Z2dpbmcgZmFjaWxpdGllcyBhbmQgbm93IHdlIGNhbiBtYWtlIGxpYmN1cmwgbG9nCiAgYWxsIG1lbW9yeSBmaWRkbGluZyBmdW5jdGlvbnMuIEFuIGFkZGl0aW9uYWwgcGVybCBzY3JpcHQgaXMgdXNlZCB0byBhbmFseXplCiAgdGhlIG91dHB1dCBsb2dmaWxlIGFuZCB0byBtYXRjaCBtYWxsb2MoKXMgd2l0aCBmcmVlKClzIGV0Yy4gVGhlIG1lbW9yeSBsZWFrCiAgR2VvcmcgZm91bmQgdHVybmVkIG91dCB0byBiZSB0aGUgbWFpbiBjb29raWUgc3RydWN0IHRoYXQgY29va2llX2NsZWFudXAoKQogIGRpZG4ndCBmcmVlISBUaGUgcGVybCBzY3JpcHQgaXMgbmFtZWQgbWVtYW5hbHl6ZS5wbCBhbmQgaXQgaXMgYXZhaWxhYmxlIGluCiAgdGhlIENWUyByZXNwb3NpdG9yeSwgbm90IGluIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDggT2N0b2JlciAyMDAwKQotIEdlb3JnIEhvcm4gZm91bmQgYSBHZXRIb3N0KCkgcHJvYmxlbS4gSXQgdHVybmVkIG91dCBpdCBuZXZlciBhc3NpZ25lZCB0aGUKICBwb2ludGVyIGluIHRoZSB0aGlyZCBhcmd1bWVudCBwcm9wZXJseSEgVGhpcyBjb3VsZCBtYWtlIGEgY3Jhc2gsIG9yIGF0IGJlc3QKICBhIG1lbW9yeSBsZWFrIQoKVmVyc2lvbiA3LjQgcHJlNAoKRGFuaWVsICg2IE9jdG9iZXIgMjAwMCkKLSBJcyB0aGUgLUYgcG9zdCBmb2xsb3dpbmcgdGhlIFJGQyAxODY3IHNwZWM/IFdlIGhhZCB0aGlzIGRpY3Vzc2lvbiBvbiB0aGUKICBtYWlsaW5nIGxpc3Qgc2luY2UgaXQgYXBwZWFycyBjdXJsIGNhbid0IHBvc3QgLUYgZm9ybSBwb3N0cyB0byBhIFBIUAogIHJlY2VpdmVyLi4uIEkndmUgYmVlbiBpbiB0b3VjaCB3aXRoIHRoZSBQSFAgZGV2ZWxvcGVycyBhYm91dCB0aGlzLgoKLSBEb21lbmljbyBBbmRyZW9saSBmb3VuZCBvdXQgdGhhdCB0aGUgbG9uZyBvcHRpb24gJy0tcHJveHknIHdhc24ndCB3b3JraW5nCiAgYW55bW9yZSEgVGhlIG9wdGlvbiBwYXJzZXIgZ290IGNvbmZ1c2VkIHdoZW4gSSBhZGRlZCB0aGUgLS1wcm94eXR1bm5lbCBmb3IKICA3LjMuIFRoaXMgd2FzIGluZGVlZCBhIHZlcnkgb2xkIGZsYXcgdGhhdCBoYXNuJ3QgdHVybmVkIHVwIHVudGlsIG5vdy4uLgoKLSBK9nJuIEhhcnRyb3RoIHByb3ZpZGVkIHBhdGNoZXMsIHVwZGF0ZWQgbWFrZWZpbGVzIGFuZCB0d28gbmV3IGZpbGVzIGZvciBETEwKICBzdHVmZiBvbiB3aW4zMi4gSGUgYWxzbyBwb2ludGVkIG91dCB0aGF0IGxpYiBzb3VyY2UgZmlsZXMgd2VyZSBjb21waWxlZCB3aXRoCiAgLUkuLi9zcmMgd2hpY2ggaXNuJ3Qgb25seSB3cm9uZyBidXQgcGxhaW4gc3R1cGlkIQoKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gZml4ZWQgYSBwcm9ibGVtIHdpdGggSFRUUCByZXN1bWUuIEN1cmwgcHJldmlvdXNseSB1c2VkCiAgYSBsb2NhbCB2YXJpYWJsZSBiYWRseSwgdGhhdCBjb3VsZCBsZWFkIHRvIGNyYXNoZXMuCgpWZXJzaW9uIDcuNCBwcmUzCgpEYW5pZWwgKDQgT2N0b2JlciAyMDAwKQotIE1vcmUgZG9jcyB3cml0dGVuLiBUaGUgY3VybF9lYXN5X2dldGluZm8uMyBtYW4gcGFnZSBpcyBub3cgcHJldHR5IGFjY3VyYXRlLAogIGFzIGlzIHRoZSAtdyBzZWN0aW9uIGluIGN1cmwuMS4gSSBhZGRlZCB0d28gb3B0aW9ucyB0byBlbmFibGUgdGhlIHVzZXIgdG8KICBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY2VpdmVkIGhlYWRlcnMnIHNpemUgYW5kIHRoZSBzaXplIG9mIHRoZSBIVFRQCiAgcmVxdWVzdC4gVC4gQmhhcmF0aCByZXF1ZXN0ZWQgdGhlbS4KICAKRGFuaWVsICgzIE9jdG9iZXIgMjAwMCkKLSBDb3JyZWN0ZWQgYSBzZXZlciBmcmVlKCkgYmVmb3JlIHVzZSBpbiB0aGUgbmV3IGFkZF9idWZmZXJfc2VuZCgpISA7LSkKClZlcnNpb24gNy40IHByZTIKCkRhbmllbCAoMyBPY3RvYmVyIDIwMDApCi0gSmFzb24gUy4gUHJpZWJlIHNlbnQgbWUgcGF0Y2hlcyB0aGF0IGNoYW5nZWQgdGhlIHdheSBjdXJsIGlzc3VlcyBIVFRQCiAgcmVxdWVzdHMuIFRoZSBlbnRpcmUgcmVxdWVzdCBpcyBub3cgaXNzdWVkIGluIG9uZSBzaW5nbGUgc2hvdC4gSXQgZGlkbid0IGRvCiAgdGhpcyBwcmV2aW91c2x5LCBhbmQgaXQgaGFzIHR1cm5lZCBvdXQgdGhhdCBzaW5jZSB0aGUgY29tbW9uIGJyb3dzZXJzIGRvIGl0CiAgdGhpcyB3YXksIHNvbWUgc2l0ZXMgaGF2ZSB0dXJuZWQgb3V0IHRvIHdvcmsgd2l0aCBicm93c2VycyBidXQgbm90IHdpdGgKICBjdXJsISBBbHRob3VnaCB0aGlzIGlzIG5vdCBhIGNsaWVudC1zaWRlIHByb2JsZW0sIHdlIHdhbnQgdG8gYmUgYWJsZSB0bwogIGZ1bGx5IGVtdWxhdGUgYnJvd3NlcnMsIGFuZCB0aHVzIHdlIGhhdmUgbm93IGFkanVzdGVkIHRoZSBuZXR3b3JraW5nIGxheWVyCiAgdG8gc2xpZ2h0bHkgbW9yZSBhcHBlYXIgYXMgYSBicm93c2VyLiBJIGFkanVzdGVkIEphc29uJ3MgcGF0Y2gsIHRoZSBmYXVsdHMKICBhcmUgcHJvYmFibHkgbWluZS4KCkRhbmllbCAoMiBPY3RvYmVyIDIwMDApCi0gQW55b25lIHdobyBldmVyIHVwbG9hZGVkIGRhdGEgd2l0aCBjdXJsIG9uIGEgc2xvdyBsaW5rIGhhcyBub3RpY2VkIHRoYXQgdGhlCiAgcHJvZ2VzcyBtZXRlciBpcyB1cGRhdGVkIHZlcnkgaW5mcmVxdWVudGx5LiBUaGF0IGlzIGR1ZSB0byB0aGUgbGFyZ2UgYnVmZmVyCiAgc2l6ZSBjdXJsIGlzIHVzaW5nLiBJdCByZWFkcyA1MEtiIGFuZCBzZW5kcyBpdCwgdXBkYXRlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIKICBhbmQgbG9vcHMuIDUwS2IgaXMgdmVyeSBtdWNoIG9uIGEgc2xvdyBsaW5rLCBhbHRob3VnaCBpdCBpcyBwcmV0dHkgbmVhdCB0bwogIHVzZSBvbiBhIGZhc3Qgb25lLgoKICBJJ3ZlIG5vdyBtYWRlIGFuIGFkanVzdG1lbnQgdGhhdCBtYWtlcyBjdXJsIHVzZSBhIDJLYiBidWZmZXIgZm9yIHVwbG9hZHMgdG8KICBzdGFydCB3aXRoLiBJZiBjdXJsJ3MgYXZlcmFnZSB1cGxvYWQgc3BlZWQgaXMgZmFzdGVyIHRoYW4gYnVmZmVyIHNpemUgYnl0ZXMKICBwZXIgc2Vjb25kLCBjdXJsIHdpbGwgaW5jcmVhc2UgdGhlIHVzZWQgYnVmZmVyIHNpemUgdXAgdG8gbWF4IDUwS2IuIEl0CiAgc2hvdWxkIG1ha2UgdGhlIHByb2dyZXNzIG1ldGVyIHdvcmsgYmV0dGVyLgogIApWZXJzaW9uIDcuNCBwcmUxCgpEYW5pZWwgKDI5IFNlcHRlbWJlciAyMDAwKQotIFJpcHBlZCBvdXQgdGhlIC13IHN0dWZmIGZyb20gdGhlIGxpYnJhcnkgYW5kIHB1dCBpbiB0aGUgY3VybCB0b29sLiBJdCBnZXRzCiAgYWxsIHRoZSByZWxldmFudCBpbmZvIGZyb20gdGhlIGxpYnJhcnkgdXNpbmcgdGhlIG5ldyBjdXJsX2Vhc3lfZ2V0aW5mbygpCiAgZnVuY3Rpb24uCgotIGJyYWQgYXQgb3BlbmJzZC5vcmcgbWFpbGVkIG1lIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgbXkga2VyYmVyb3MgbWlzdGFrZSBhbmQKICByZW1vdmVkIGEgY29tcGlsZXIgd2FybmluZyBmcm9tIGhvc3RpcC5jIHRoYXQgT3BlbkJTRCBwZW9wbGUgZ2V0LgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMCkKLSBPZiBjb3Vyc2UgKEkgc2hvdWxkIHByb2JhYmx5IGdldCBwdW5pc2hlZCBzb21laG93KSBJIGRpZG4ndCBwcm9wZXJseSBjb3JyZWN0CiAgdGhlICNpbmNsdWRlIGxpbmVzIGZvciB0aGUgYmFzZTY0IHN0dWZmIGluIHRoZSBrZXJiZXJvcyBzb3VyY2VzIGluIHRoZSBqdXN0CiAgcmVsZWFzZWQgNy4zIHBhY2thZ2UuIFRoZXkgc3RpbGwgaW5jbHVkZSB0aGUgKl9rcmIuaCBmaWxlcyEgTm93LCB0aGUgZXJyb3IKICBpcyBzb29vIHZlcnkgZWFzeSB0byBzcG90IGFuZCBmaXggc28gSSB3b24ndCBib3RoZXIgd2l0aCBhIHF1aWNrIGJ1ZyBmaXgKICByZWxlYXNlLiBJJ2xsIHBvc3QgYSBwYXRjaCB3aGVuZXZlciBvbmUgaXMgbmVlZGVkIGluc3RlYWQuIEl0J2xsIGJlCiAgYXZhaWxhYmxlIGluIHRoZSBDVlMgaW4gYSBmZXcgbWludXRlcyBhbnl3YXkuCgpWZXJzaW9uIDcuMwoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMCkKLSBSZW1vdmVkIHRoZSBiYXNlNjRfa3JiLltjaF0gZmlsZXMuIFRoZXkndmUgbm93IHJlcGxhY2VkIHRoZSBmb3JtZXIKICBiYXNlNjQuW2NoXSBmaWxlcy4KCkRhbmllbCAoMjYgU2VwdGVtYmVyIDIwMDApCi0gVXBkYXRlZCBzb21lIGRvY3MuCgotIEkgY2hhbmdlZCB0aGUgT3BlblNTTCBmaXggdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIGFzIHdlbGwuIFRoZSBwb3N0ZWQKICBwYXRjaCB3YXMgb25seSB3b3JraW5nIHdpdGggMC45LjYgYW5kIG5vIG9sZGVyIG9uZXMuCiAgClZlcnNpb24gNy4zLXByZTgKCkRhbmllbCAoMjUgU2VwdGVtYmVyIDIwMDApCi0gRXJkbXV0IFBmZWlmZXIgaW5mb3JtZWQgdXMgdGhhdCBjdXJsIGRpZG4ndCBidWlsZCB3aXRoIE9wZW5TU0wgMC45LjYgYW5kCiAgc2hvd2VkIHVzIHdoYXQgbmVlZGVkIHRvIGdldCBwYXRjaGVkIGluIG9yZGVyIHRvIG1ha2UgaXQgYnVpbGQgcHJvcGVybHkKICBhZ2Fpbi4KCi0gRGlyayBLcnVzY2hld3NraSBmb3VuZCBhIGJ1ZyBpbiB0aGUgY29va2llIHBhcnNlci4gSSBtYWRlIGFuIGFsdGVybmF0aXZlCiAgYXBwcm9hY2ggdG8gdGhlIHNvbHV0aW9uIERpcmsgaGltc2VsZiBzdWdnZXN0ZWQuIFRoZSBidWcgbWFkZSBhIGNvb2tpZQogIGhlYWRlciB0aGF0IGRpZG4ndCBlbmQgd2l0aCBhIHRyYWlsaW5nIHNlbWljb2xvbiB0byBub3QgZ2V0IHBhcnNlZC4KCi0gSSd2ZSBtYXJrZWQgLWMgYW5kIC10IGRlcHJlY2F0ZWQgbm93LiBJZiB5b3UgdXNlIGFueSBvZiB0aGVtLCBjdXJsIHdpbGwgdGVsbAogIHlvdSB0byB1c2UgIi1DIC0iIG9yICItVCAtIiBpbnN0ZWFkLiBJIGRvbid0IHRoaW5rIG9jY3VweWluZyB0d28gbGV0dGVycyBmb3IKICBuZWFybHkgaWRlbnRpY2FsIGZ1bmN0aW9ucyBpcyBnb29kIHVzZS4gQWxzbywgLVQgLSBraW5kIG9mIGZvbGxvd3MgdGhlIGN1cmwKICB0cmFkaXRpb24gb2YgdXNpbmcgLSBmb3Igc3RkaW4gd2hlcmUgYSBmaWxlIG5hbWUgaXMgZXhwZWN0ZWQuCgpEYW5pZWwgKDIzIFNlcHRlbWJlciAyMDAwKQotIE1hcnRpbiBIZWRlbmZhbGsgcHJvdmlkZWQgdGhlIHBhdGNoIHRoYXQgZmluYWxseSBtYWRlIHRoZSBrcmI0IGZ0cCB1cGxvYWQKICB3b3JrIQoKRGFuaWVsICgyMSBTZXB0ZW1iZXIgMjAwMCkKLSBUaGUga2VyYmVyb3MgY29kZSBpcyBub3QgcXVpdGUgdGhyZWFkLXNhZmUgeWV0LiBUaGVyZSBhcmUgYSBmZXcgbW9yZSBnbG9iYWxzCiAgdGhhdCBuZWVkIHRvIGJlIHRha2UgY2FyZSBvZi4gTGV0J3MgZ2V0IHRoZSB1cGxvYWQgd29ya2luZyBmaXJzdCEKCkRhbmllbCAoMjAgU2VwdGVtYmVyIDIwMDApCi0gUmljaGFyZCBQcmVzY290dCBzb2x2ZWQgYW5vdGhlciBuYW1lIGxvb2t1cCBidWZmZXIgc2l6ZSBwcm9ibGVtLiBJIHRvb2sgdGhpcwogIG9wcG9ydHVuaXR5IHRvIHJld3JpdGUgdGhlIEdldEhvc3QoKSBmdW5jdGlvbi4gV2l0aCB0aGVzZSBsYXJnZSBidWZmZXIKICBzaXplcywgSSB0aGluayBrZWVwaW5nIHRoZW0gYXMgbG9jYWwgYXJyYXlzIHF1aWNrbHkgdHVybiB1Z2x5LiBJIG5vdyB1c2UKICBtYWxsb2MoKSB0byBnZXQgdGhlIGJ1ZmZlciBtZW1vcnkuIFRoYW5rcyB0byB0aGlzLCBJIG5vdyBjYW4gcmVhbGxvYygpIHRvIGEKICBsYXJnZSBidWZmZXIgaW4gY2FzZSBvZiBkZW1hbmQgKGVycm5vID09IEVSQU5HRSkgaW4gY2FzZSBhIHNvbHV0aW9uIGxpa2UKICB0aGF0IHdvdWxkIGJlY29tZSBuZWNlc3NhcnkuIEkgc3RpbGwgd2FudCB0byBhdm9pZCB0aGF0IGtpbmQgb2YgbmFzdGluZXNzLgoKLSBUcmllZCB0byBjb21waWxlIGFuZCBydW4gY3VybCBvbiBMaW51eCBmb3IgYWxwaGEgYW5kIEZyZWVCU0QgZm9yIGFscGhhLiBXZW50CiAgYXMgc21vb3RoIGFzIGl0IGNvdWxkLgoKLSBBZGRlZCBhIGRvY3MvZXhhbXBsZXMgZGlyZWN0b3J5IHdpdGggdHdvIHRpbnkgZXhhbXBsZSBzb3VyY2VzIHRoYXQgc2hvdyBob3cKICB0byB1c2UgbGliY3VybC4gSSBob3BlIHVzZXJzIHdpbGwgc3VwcGx5IG1lIHdpdGggbW9yZSB1c2VmdWwgZXhhbXBsZXMKICBmdXJ0aGVyIG9uLgoKLSBBcHBsaWVkIGEgcGF0Y2ggYnkgSvZybiBIYXJ0cm90aCB0byBubyBsb25nZXIgdXNlIHRoZSB3b3JkICdpbnRlZmFjZScgaW4gdGhlCiAgY29uZmlnIHN0cnVjdCBpbiB0aGUgc3JjL21haW4uYyBmaWxlIHNpbmNlIGNlcnRhaW4gY29tcGlsZXJzIGhhdmUgdGhhdCB3b3JkCiAgInJlc2VydmVyZWQiLiAgSSBmaWd1cmUgdGhhdCBpcyBzb21lIGtpbmQgb2YgQysrIGRlY2Vhc2UuCgotIFVwZGF0ZWQgdGhlIGN1cmwuMSBtYW4gcGFnZSB3aXRoIC0taW50ZXJmYWNlIGFuZCAtLWtyYjQuCgotIE1vZGlmaWVkIHRoZSBiYXNlNjRFbmNvZGUoKSBmdW5jdGlvbiB0byB3b3JrIGxpa2UgdGhlIGtlcmJlcm9zIG9uZSwgc28gdGhhdAogIEkgY291bGQgcmVtb3ZlIHRoZSB1c2Ugb2YgdGhhdC4gVGhlcmUgaXMgbm8gbmVlZCBmb3IgKnR3byogYmFzZTY0IGVuY29kaW5nCiAgZnVuY3Rpb25zISA7LSkKClZlcnNpb24gNy4zcHJlNQoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwMCkKLSBUaGUga2VyYmVyb3M0LWxheWVyIHNvdXJjZSBjb2RlIHRoYXQgaXMgbXVjaCAiaW5mbHVlbmNlZCIgYnkgdGhlIG9yaWdpbmFsCiAga3JiNCBzb3VyY2UgY29kZSwgdGhyb3VnaCB5YWZjIGludG8gY3VybCwgd2FzIHVzaW5nIHF1aXRlIGEgbG90IG9mIGdsb2JhbAogIHZhcmlhYmxlcy4gbGliY3VybCBjYW4ndCB3b3JrIHByb3Blcmx5IHdpdGggZ2xvYmFscyBsaWtlIHRoYXQgd2h5IEkgaGFkIHRvCiAgY2xlYW4gdXAgYWxtb3N0IGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBuZXcgc2VjdXJpdHkuYyB0byBtYWtlIHRoZW0gdXNlCiAgY29ubmVjdGlvbiBzcGVjaWZpYyB2YXJpYWJsZXMgaW5zdGVhZCBvZiB0aGUgZ2xvYmFscy4gSSBqdXN0IGhvcGUgSSBkaWRuJ3QKICBkZXN0cm95IGFueXRoaW5nIG5vdy4uLiA6LSkgY29uZmlndXJlIHVwZGF0ZWQsIHZlcnNpb24gc3RyaW5nIG5vdyByZWZsZWN0cwogIGtyYjQgYnVpbHQtaW4uIEl0IGFsbW9zdCB3b3JrcyBub3cuIE9ubHkgdXBsb2FkcyBhcmUgc3RpbGwgYmVpbmcgbmF1Z2h0eS4KClZlcnNpb24gNy4zcHJlMwoKRGFuaWVsICgxOCBTZXB0ZW1iZXIgMjAwMCkKLSBNYXJ0aW4gSGVkZW5mYWxrIHN1cHBsaWVkIGEgbWFqb3IgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIGtyYjQtZnRwIHN1cHBvcnQgdG8KICBjdXJsLiBNYXJ0aW4gaXMgdGhlIHByaW1hcnkgYXV0aG9yIG9mIHRoZSBmdHAgY2xpZW50IG5hbWVkIHlhZmMgYW5kIGhlIGRpZAogIG5vdCBoZXNpdGF0ZSB0byBoZWxwIHVzIGltcGxlbWVudCB0aGlzIHdoZW4gSSBhc2tlZCBoaW0uIE1hbnkgYW5kIHNpbmNlcmUKICB0aGFua3MgdG8gYSBzcGxlbmRpZCBlZmZvcnQuIEl0IGRpZG4ndCBldmVuIHRha2UgbWFueSBob3VycyEKCi0gU3RlcGhlbiBLaWNrIHN1cHBsaWVkIGEgYmlnIHBhdGNoIHRoYXQgaW50cm9kdWNlcyB0aGUgLS1pbnRlcmZhY2UgZmxhZyB0bwogIHRoZSBjdXJsIHRvb2wgYW5kIENVUkxPUFRfSU5URVJGQUNFIGZvciBsaWJjdXJsLiBJdCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYW4KICBvdXRnb2luZyBpbnRlcmZhY2UgdG8gdXNlIGZvciB5b3VyIHJlcXVlc3QuIFRoaXMgbWF5IG5vdCB3b3JrIG9uIGFsbAogIHBsYXRmb3Jtcy4gVGhpcyBuZWVkcyB0ZXN0aW5nLgoKLSBSaWNoYXJkIFByZXNjb3R0IG5vdGljZWQgdGhhdCBjdXJsIG9uIFRydTY0IHVuaXggY291bGQgY29yZSBkdW1wZWQgaWYgdGhlCiAgbmFtZSBkaWRuJ3QgcmVzb2x2ZSBwcm9wZXJseS4gVGhpcyB3YXMgZHVlIHRvIHRoZSBHZXRIb3N0KCkgZnVuY3Rpb24gbm90CiAgcmV0dXJuaW5nIGFuIGVycm9yIGV2ZW4gdGhvdWdoIGl0IGZhaWxlZCBvbiBzb21lIHBsYXRmb3JtcyEKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gVXBkYXRlZCBhbGwgc29ydHMgb2YgZG9jdW1lbnRzIGluIHJlZ2FyZHMgdG8gdGhlIG5ldyBwcm94eXR1bm5lbCBzdXBwb3J0LgoKVmVyc2lvbiA3LjNwcmUyCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIEthaS1Vd2UgUm9tbWVsIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSBpbiB0aGUgaHR0cHByb3h5dHVubmVsIHN0dWZmIGZvciBmdHAuCiAgQWRqdXN0ZWQgaXQuIEFkZGVkIGJldHRlciBpbmZvIG1lc3NhZ2Ugd2hlbiBzZXR0aW5nIHVwIHRoZSB0dW5uZWwgYW5kIHRoZQogIHBhc3YgbWVzc2FnZSB3aGVuIGRvaW5nIHRoZSBzZWNvbmQgY29ubmVjdC4KICAKVmVyc2lvbiA3LjNwcmUxCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIGxpYmN1cmwgbm93IGFsbG93cyAiaHR0cHByb3h5dHVubmVsIiB0byBhbiBhcmJpdHJhcnkgaG9zdCBhbmQgcG9ydCBuYW1lLiBUaGUKICBzZWNvbmQgY29ubmVjdGlvbiBvbiBmdHAgbmVlZGVkIHRoYXQuCgotIFRoZUFydE9mSFRUUFNjcmlwdGluZyB3YXMgY29ycmVjdGVkIGFsbCBvdmVyLiBJIGJvdGggdHlwZSBhbmQgc3BlbGwgcmVhbGx5CiAgYmFkIGF0IHRpbWVzIQogIApEYW5pZWwgKDE0IFNlcHRlbWJlciAyMDAwKQotIC1wLy0tcHJveHl0dW5uZWwgd2FzIGFkZGVkIHRvICdjdXJsJy4gSXQgdXNlcyB0aGUgbmV3CiAgQ1VSTE9QVF9IVFRQUFJPWFlUVU5ORUwgbGliY3VybCBvcHRpb24gdGhhdCBhbGxvd3MgImFueSIgcHJvdG9jb2wgdG8gdHVubmVsCiAgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGh0dHAgcHJveHkuIEF0IHRoZSBtb21lbnQsIHRoaXMgc2hvdWxkIHdvcmsgd2l0aCBmdHAuCgpEYW5pZWwgKDEzIFNlcHRlbWJlciAyMDAwKQotIEpvY2hlbiBTY2hhZXVibGUgZm91bmQgdGhhdCBmaWxlOi8vIGRpZG4ndCB3b3JrIGFzIGV4cGVjdGVkLiBDb3JyZWN0ZWQgdGhpcwogIGFuZCBtYWlsZWQgdGhlIHBhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgKDcgU2VwdGVtYmVyIDIwMDApCi0gSSBjaGFuZ2VkIHRoZSAjZGVmaW5lIFQoKSBpbiBjdXJsLmggc2luY2UgaXQgdHVybmVkIG91dCBpdCB3YXNuJ3QgcmVhbGx5CiAgYSBnb29kIHN5bWJvbCB0byB1c2UgKHdoZW4geW91IGNvbXBpbGVkIFBIUCB3aXRoIGN1cmwgYXMgYSBtb2R1bGUsIHRoYXQKICBkZWZpbmUgY29sbGlkZWQgd2l0aCBzb21lIElNQVAgZGVmaW5lIG9yIHNvbWV0aGluZykuIFRoaXMgd2FzIHBvc3RlZCB0byB0aGUKICBQSFAgYnVnIHRyYWNrZXIuCgotIEkgYWRkZWQgZXh0ZXJuICJDIiBzdHVmZiBpbiB0d28gaGVhZGVyIGZpbGVzIHRvIGJldHRlciBhbGxvdyBsaWJjdXJsIHVzYWdlCiAgaW4gQysrIHNvcmNlcy4gRGlzY3Vzc2lvbnMgb24gdGhlIGxpYmN1cmwgbGlzdCB3aXRoIERhbm55IEhvcnN3ZWxsIGxlYWQgdG8KICB0aGlzLgoKVmVyc2lvbiA3LjIuMQoKRGFuaWVsICgzMSBBdWd1c3QgMjAwMCkKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0ICphZ2FpbiogYW5kIG5vdyBpdCBzZWVtcyB0bwogIGRldGVjdCBMaW51eCBuYW1lIHJlc29sdmluZyBwcm9wZXJseSEgKGhlYXJkIHRoYXQgYmVmb3JlPykKCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIHBvaW50ZWQgb3V0IHRoYXQgZG93bmxvYWRpbmcgYSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgbGV0dGVyICcrJyBmcm9tIGFuIGZ0cCBzZXJ2ZXIgZGlkbid0IHdvcmsuIEl0IGRpZCB3b3JrIGZyb20gSFRUUCB0aG91Z2ggYW5kCiAgdGhlIHJlYXNvbiB3YXMgbXkgbGFtZSBVUkwgZGVjb2Rlci4KCi0gSSBoYXBwZW5lZCB0byBub3RpY2UgdGhhdCAtSSBkaWRuJ3QgYXQgYWxsIHdvcmsgb24gZnRwIGFueW1vcmUuIEkgY29ycmVjdGVkCiAgdGhhdC4KClZlcnNpb24gNy4yCgpEYW5pZWwgKDMwIEF1Z3VzdCAyMDAwKQotIFVuZGVyc3RhbmRpbmcgQUlYIGlzIGEgaGFyZCB0YXNrLiBJIGJlbGlldmUgSSdsbCBuZXZlciBmaWd1cmUgb3V0IHdoeSB0aGV5CiAgc29sdmUgdGhpbmdzIHNvIGRpZmZlcmVudGx5IGZyb20gdGhlIG90aGVyIHVuaXhlcy4gTm93LCBJJ20gbGVmdCB3aXRoIHRoZQogIEFJWCA0LjMgcnVuLXRpbWUgd2FybmluZ3MgYWJvdXQgZHVwbGljYXRlIHN5bWJvbHMgdGhhdCBhY2NvcmRpbmcgdG8gdGhpcwogIGFydGljbGUgKGh0dHA6Ly93d3cuZ2VvY3Jhd2xlci5jb20vYXJjaGl2ZXMvMy80MDUvMTk5OS85LzAvMjU5MzQyOC8pIGlzIGEKICBsaWJ0b29sIGZsYXcuIEkgdHJpZWQgdGhlIG1lbnRpb25lZCBwYXRjaCwgYWx0aG91Z2ggdGhhdCBzdG9wcyB0aGUgbGlua2luZwogIGNvbXBsZXRlbHkuCgogIFNvLCBpZiBJIHNlbGVjdCB0byBpZ25vcmUgdGhlIGxkIHdhcm5pbmdzIHRoZXJlIGFyZSBjb21waWxlciB3YXJuaW5ncyB0aGF0CiAgZmlsbCB0aGUgc2NyZWVuIHByZXR0eSBiYWQgd2hlbiBjdXJsIGNvbXBpbGVzLiBJdCB0dXJucyBvdXQgdGhhdCBpZiBJIHdhbnQKICB0byAnI2luY2x1ZGUgPGFycGEvaW5ldC5oPicsIEkgY2FuIGdldCB0aWQgb2YgdGhlIHdhcm5pbmdzIGJ5IGluY2x1ZGUgdGhlCiAgZm9sbG93aW5nIHRocmVlIGluY2x1ZGUgZmlsZXMgYmVmb3JlIHRoYXQgb25lOgoKICAgICAgICAjaW5jbHVkZSA8bmV0L2lmX2RsLmg+CiAgICAgICAgI2luY2x1ZGUgPHN5cy9tYnVmLmg+CiAgICAgICAgI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KCiAgTm93LCBpcyBpdCByZWFsbHkgc2FuZSB0byBhZGQgdGhvc2UgaW5jbHVkZSBmaWxlcyBiZWZvcmUgYXJwYS9pbmV0LmggaW4gYWxsCiAgdGhlIHNvdXJjZSBmaWxlcyB0aGF0IGluY2x1ZGUgaXQ/CgogIFRoYW5rcyB0byBBbGJlcnQgQ2hpbi1BLVlvdW5nIGF0IHRoZXdyaXR0ZW53b3JkLmNvbSB3aG8gZ2F2ZSBtZSB0aGUgQUlYCiAgbG9naW4gdG8gdHJ5IGV2ZXJ5dGhpbmcgb24uCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDAwKQotIEphbiBTY2htaWR0IHN1cHBsaWVkIHVzIGEgbmV3IFZDNiBtYWtlZmlsZSBmb3IgV2luZG93cyBhcyB0aGUgcHJldmlvdXMgb25lCiAgd2FzIG5vdCB1cCB0byBkYXRlIGJ1dCBsYWNrZWQgc2V2ZXJhbCBvYmplY3QgZmlsZXMuCgotIE1vcmUgd29yayBvbiB0aGUgbmFtaW5nLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHByb3ZpZGVkIGEgY29uZmlndXJlLWNoZWNrIGZvciBsYXJnZSBmaWxlIHN1cHBvcnQsIGFzCiAgc29tZSBzeXN0ZW1zIHNlZW0gdG8gbmVlZCB0aGF0IGZvciB0aGVtIHRvIHdvcmsuIEhhZCB0byBjaGFuZ2UgdGhlIHBvc2l0aW9uCiAgZm9yIHRoZSBjb25maWcuaCBpbmNsdWRlIGZpbGUgaW4gZXZlcnkgLmMgZmlsZSBpbiB0aGUgbGliY3VybCBkaXIuLi4KCi0gQXMgc3VnZ2VzdGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QgKGJ5IFRyb3kgRW5nZWwpLCBJIGRpZCB1c2UgYSAtLWRhdGEtYmluYXJ5CiAgb3B0aW9uIGluc3RlYWQgb2YgdGhlIG1lc3N5IHdheSBJJ3ZlIGxlZnQgZGVzY3JpYmVkIGJlbG93LiBJdCBzZWVtcyB0bwogIHdvcmsuIFRoZSBsaWJjdXJsIGZpeCByZW1haW5lZCB0aGUgc2FtZSBhcyB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDIzIEF1Z3VzdCAyMDAwKQotIEJhY2sgb24gdGhlIC1kIHN0cmlwcGluZyBuZXdsaW5lcyB0aGluZy4gVGhlICdwbGFpbiBwb3N0JyB0aGluZyB3YXMgYWRkZWQKICB3aGVuIEkgaGFkIG5vIHRob3VnaHQgb2YgdGhhdCBvbmUgY291bGQgYWN0dWFsbHkgcG9zdCBiaW5hcnkgZGF0YSB3aXRoCiAgaXQuIE5vdywgSSBoYXZlIHRvIGFkZCB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYSBncmFjZWZ1bCBtYW5uZXIgYW5kIEkgdGhpbmsKICBJJ3ZlIG1hbmFnZWQgdG8gY29tZSB1cCB3aXRoIGEgd2F5OiAnLWQgQGZpbGU7YmluYXJ5JyB3aWxsIHRodXMgcG9zdCB0aGUKICBmaWxlIGJpbmFyeSwgZXhhY3RseSBhcyBpdHMgY29udGVudHMgYXJlLiBJdCBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgbmV3CiAgKnNldG9wdCgpIG9wdGlvbiAoQ1VSTE9QVF9QT1NURklFTERTSVpFKSB0byBzZXQgdGhlIHBvc3RmaWVsZCBzaXplLCBzaW5jZQogIGxpYmN1cmwgY2FuJ3Qgc3RybGVuKCkgdGhlIGRhdGEgaW4gdGhlc2UgY2FzZXMuCgotIEFsYmVydCBDaGluLUEtWW91bmcgbWFkZSBzb21lIHZlcnkgc2VyaW91cyBlZmZvcnRzIGFuZCBhbGwgdGhlIG5hbWUKICByZXNvbHZpbmcgcHJvYmxlbXMgc2VlbSB0byBoYXZlIGJlZW4gc29ydGVkIG91dCBub3cgb24gYWxsIHRoZSBwbGF0Zm9ybXMKICB0aGF0IHByZXZpb3VzbHkgc2hvd2VkIHRoZW0uIEknbGwgbWFrZSBhbm90aGVyIHJlbGVhc2Ugbm93IGFueWRheSBiZWNhdXNlIG9mCiAgdGhpcy4KCi0gVGhlIEZBUSB3YXMgbXVjaCBlbmhhbmNlZCB3aGVuIGl0IGNvbWVzIHRvIHRoZSBsaWNlbnNpbmcgaXNzdWVzIHRoYW5rcyB0bwogIEJqb3JuIFJlZXNlLgoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMCkKLSBSaWNrIFdlbHlrb2NoeSBwb2ludGVkIG91dCBhIHByb2JsZW0gd2hlbiB5b3UgdXNlIC1kIHRvIHBvc3QgYW5kIHlvdSB3YW50IHRvCiAga2VlcCB0aGUgbmV3bGluZXMsIGFzIGN1cmwgc3RyaXBzIHRoZW0gb2ZmIGFzIGEgYm9udXMgYmVmb3JlIHBvc3RpbmcuLi4KICBUaGlzIG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KClZlcnNpb24gNy4xLjEKCkRhbmllbCAoMjEgQXVndXN0IDIwMDApCi0gR290IG1vcmUgcGVvcGxlIGludm9sdmVkIGluIHRoZSBnZXRob3N0YnluYW1lX3IoKSBtZXNzLiBDYW9sYW4gTWNOYW1hcmEgc2VudAogIG1lIGNvbmZpZ3VyZS1jb2RlIHRoYXQgdHVybmVkIG91dCB0byBiZSB2ZXJ5IHNpbWlsYXIgdG8gbXkgZXhpc3RpbmcgdGVzdHMKICB3aGljaCBvbmx5IG1ha2UgbWUgbW9yZSBzdXJlIEknbSBvbiB0aGUgcmlnaHQgcGF0aC4gSSBjaGFuZ2VkIHRoZSBvcmRlciBvZgogIHRoZSB0ZXN0cyBzbGlnaHRseSwgYXMgaXQgc2VlbXMgdGhhdCBzb21lIGNvbXBpbGVycyBkb24ndCB5ZWxsIGVycm9yIGlmIGEKICBmdW5jdGlvbiBpcyB1c2VkIHdpdGggdG9vIG1hbnkgcGFyYW1ldGVycy4gVGh1cywgdGhlIGZpcnN0IHRlc3RlZCBmdW5jdGlvbgogIHdpbGwgc2VlbSBvay4uLiBMZXQncyBob3BlIG1vcmUgY29tcGlsZXJzIHRoaW5rIG9mIHRvby1mZXcgcGFyYW1ldGVycyBhcyBiYWQKICBtYW5uZXJzLCBhcyB3ZSdyZSBub3cgdHJ5aW5nIHRoZSBmdW5jdGlvbnMgaW4gdGhhdCBvcmRlcjsgZmV3ZXIgZmlyc3QuIEkKICBzaG91bGQgYWxzbyBhZGQgdGhhdCBMYXJzIEhlY2tpbmcgbWFpbGVkIG1lIGFuZCB2b2x1bnRlZXJlZCB0byBydW4gdGVzdHMgb24KICBhIGZldyBvZGQgc3lzdGVtcy4gQ29hbGFuIGlzIGtlZXBpbmcgaGlzIHdvcmsgb3ZlciBhdAogIGh0dHA6Ly93d3cuY3NuLnVsLmllL35jYW9sYW4vcHVibGluay9nZXRob3N0YnluYW1lX3IvLiBNaWdodCBiZSBoYW5keSBpbiB0aGUKICBmdXR1cmUgYXMgd2VsbC4KCkRhbmllbCAoMTggQXVndXN0IDIwMDApCi0gSSBub3RpY2VkIEkgaGFkbid0IGluY3JlYXNlZCB0aGUgbmFtZSBsb29rdXAgYnVmZmVyIGluIGxpYi9mdHAuYy4gSSBkb24ndAogIHRoaW5rIHRoaXMgaXMgdGhlIHJlYXNvbiBmb3IgdGhlIGNvbnRpbnVlZCB0cm91YmxlIHRob3VnaC4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDApCi0gRnJlZCBOb3ogY29ycmVjdGVkIG15IHN0dXBpZCBtaXN0YWtlcyBpbiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgZmx1ZmYuIEl0CiAgc2hvdWxkIGFmZmVjdCBzb21lIEFJWCwgRGlnaXRhbCBVbml4IGFuZCBIUFVYIDEwIHN5c3RlbXMuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDAwKQotIE1hdGhpZXUgTGVnYXJlIGNvbXBpbGVkIGFuZCBidWlsZCA3LjEgd2l0aG91dCBlcnJvcnMgb24gYm90aCBBSVggNC4yIGFzIHdlbGwKICBhcyBBSVggNC4zLiBOb3cgd2h5IGRpZCBwcm9ibGVtcyBvY2N1ciBiZWZvcmU/CgotIEZyZWQgTm96IHJlcG9ydGVkIGEgLXcvLS13cml0ZS1vdXQgYnVnIHRoYXQgY2F1c2VkIGl0IHRvIG1hbGZ1bmN0aW9uIHdoZW4KICB1c2VkIGNvbWJpbmVkIHdpdGggbXVsdGlwbGUgVVJMIHJldHJpZXZhbGVzLiBBbGwgYnV0IHRoZSBmaXJzdCBkaXNwbGF5IGdvdAogIHNjcmV3ZWQgdXAhCgpEYW5pZWwgKDExIEF1Z3VzdCAyMDAwKQotIEphc29uIFByaWViZSBhbmQgYW4gYW5vbnltb3VzIGZyaWVuZCBmb3VuZCBzb21lIGhvc3QgbmFtZXMgdGhlIExpbnV4IHZlcnNpb24KICBvZiBjdXJsIGNvdWxkIG5vdCByZXNvbHZlLiBJdCB0dXJuZWQgb3V0IHRoZSBidWZmZXIgdXNlZCB0byByZXRyaWV2ZSB0aGF0CiAgaW5mb3JtYXRpb24gd2FzIHRvbyBzbWFsbC4gRml4ZWQuIE9uZSBjb3VsZCBhcmd1ZSBhYm91dCB0aGUgdXNlZnVsbmVzcyBvZgogIG5vdCBoYXZpbmcgdGhlIHNsaWdodGVzdCB0cmFjZSBvZiBhIG1hbiBwYWdlIGZvciBnZXRob3N0YnluYW1lX3IoKSBvbiBteQogIExpbnV4IFJlZGhhdCBpbnN0YWxsYXRpb24uLi4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDApCi0gQmFsYWppIFMgUmFvIHdhcyBmaXJzdCBpbiBsaW5lIHRvIG5vdGUgdGhlIG1pc3NpbmcgcG9zc2liaWxpdHkgdG8gcmVwbGFjZQogIHRoZSBDb250ZW50LVR5cGU6IGFuZCBDb250ZW50LUxlbmd0aDogaGVhZGVycyB3aGVuIGRvaW5nIC1kIHBvc3RzLiBJIGFkZGVkCiAgdGhlIHBvc3NpYmlsaXR5IGp1c3Qgbm93LiBJdCBzZWVtcyBzb21lIHBlb3BsZSB3YW50cyB0byBkbyBzdGFuZGFyZCBwb3N0cwogIHVzaW5nIGN1c3RvbSBDb250ZW50LVR5cGVzLgoKRGFuaWVsICg4IEF1Z3VzdCAyMDAwKQotIE1pa2UgRG93ZWxsIGNvcnJlY3RseSBkaXNjb3ZlcmVkIHRoYXQgY3VybCBkaWQgbm90IGFwcHJvdmUgb2YgVVJMcyB3aXRoIG5vCiAgdXNlciBuYW1lIGJ1dCBwYXNzd29yZC4gQXMgaW4gJ2h0dHA6Ly86Zm9vQGhheHguc2UnLiBJIGNvcnJlY3RlZCB0aGlzLgoKVmVyc2lvbiA3LjEKCkRhbmllbCAoNyBBdWd1c3QgMjAwMCkKLSBNeSBBSVggNCBmaXggZG9lcyBub3Qgd29yay4gSSBuZWVkIGhlbHAgZnJvbSBhIEFJWCA0IGhhY2tlci4KCi0gSSBhZGRlZCBteSBuZXcgZG9jdW1lbnQgaW4gdGhlIGRvY3MgZGlyZWN0b3J5LiBJdCBpcyBhaW1lZCB0byBiZWNvbWUgYSBzb3J0CiAgb2YgdHV0b3JpYWwgb24gaG93IHRvIGRvIEhUVFAgc2NyaXB0aW5nIHdpdGggY3VybC4KCkRhbmllbCAoNCBBdWd1c3QgMjAwMCkKLSBXb3JraW5nIHdpdGggUmljaCBHcmF5IG9uIGNvbXBpbGluZyBjdXJsIGZvciBsb3RzIG9mIGRpZmZlcmVudCBwbGF0Zm9ybXMuCiAgTXkgZml4IGZvciBBSVggMy4yIHdhcyBub3QgZ29vZCBlbm91Z2ggYW5kIHdhcyBzbGlnaHRseSBjaGFuZ2VkLCBJIGhhZCB0bwogIG1vdmUgYW4gaW5jbHVkZSBmaWxlIGJlZm9yZSBhbm90aGVyLCBhcyBpcyBub3cgZGVzY3JpYmVkIGluIHRoZSBzb3VyY2UuCgogIEFJWCA0LjIgKDQuWD8pIGhhcyBkaWZmZXJlbnQgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIGdldGhvc3RieWFkZHJfcigpCiAgZnVuY3Rpb25zIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBhbmQgdGh1cyB0aGUgY29tcGlsZQogIGJyb2tlIHdpdGggYW4gZXJyb3IuIEkgaGF2ZSBub3cgY2hhbmdlZCB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgY2hlY2sgaW4gdGhlCiAgY29uZmlndXJlIGZpbGUgdG8gc3VwcG9ydCBhbGwgdGhyZWUgdmVyc2lvbnMgb2YgYm90aCB0aGVzZSBmdW5jdGlvbnMuIE15CiAgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIHRoZSBBSVgtc3R5bGUgaXMgdGhvdWdoIG5vdCB5ZXQgdmVyaWZpZWQgYW5kIEkgbWF5CiAgZ2V0IHByb2JsZW1zIHRvIGZpeCBpdCBpZiBpdCB0dXJucyBvdXQgdG8gYnVnIHNpbmNlIEkgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8KICBhbnkgc3lzdGVtIHVzaW5nIHRoYXQuCgogIEZvciBwcm9ibGVtcyBsaWtlIHRoYXQsIEkgbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBhbGxvdyAtLWRpc2FibGUtdGhyZWFkCiAgdG8gY29tcGxldGVseSBzd2l0Y2ggb2ZmIHRoZSBjaGVjayBmb3IgdGhyZWFkc2FmZSB2ZXJzaW9ucyBvZiBhIGZldwogIGZ1bmN0aW9ucyBhbmQgdGh1cyBnbyB3aXRoIHRoZSAiZ29vZCBvbGQgdmVyc2lvbnMiIHRoYXQgdGVuZCB0byB3b3JrCiAgYWx0aG91Z2ggd2lsbCBicmVhayB0aHJlYWQtc2FmZW5lc3MgZm9yIGxpYmN1cmwuIE1vc3QgcGVvcGxlIHdvbid0IHVzZQogIGxpYmN1cmwgZm9yIG90aGVyIHRoaW5ncyB0aGFuIGN1cmwgdGhvdWdoLCBhbmQgY3VybCBkb2Vzbid0IG5lZWQgYQogIHRocmVhZC1zYWZlIGxpYi4KCi0gV29ya2luZyBvbiBteSBiaWcgdHV0b3JpYWwgYWJvdXQgSFRUUCBzY3JpcHRpbmcgd2l0aCBjdXJsLgoKRGFuaWVsICgxIEF1Z3VzdCAyMDAwKQotIFJpY2ggR3JheSBzcG90dGVkIGEgcHJvYmxlbSBpbiBzcmMvc2V0dXAuaCBjYXVzZWQgYnkgYSAjZGVmaW5lIHN0cmVxdWFsKCkKICB0aGF0IHdhcyBqdXN0IGEgbGVmdC1vdmVyIGZyb20gcGFzc2VkIHRpbWVzLiBUaGUgc3RyZXF1YWwoKSBpcyBub3cgYSB0cnVlCiAgZnVuY3Rpb24gc3VwcGxpZWQgYnkgbGliY3VybCBmb3IgYSBwb3J0YWJsZSBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZwogIGNvbXBhcmlzb24uIEkgYWRkZWQgdGhlIHByb3RvdHlwZXMgaW4gaW5jbHVkZS9jdXJsLmggYW5kIHJlbW92ZWQgdGhlCiAgbm93IG9ic29sZXRlICNkZWZpbmUuCgotIElnb3IgS2hyaXN0b3Bob3JvdiBtYWRlIGEgZml4IHRvIGFsbG93IHJlc3VtZWQgZG93bmxvYWQgZnJvbSBTdW4ncwogIEphdmFXZWJTZXJ2ZXIvMS4xLjEuIEl0IHNlZW1zIHRoYXQgdGhlaXIgc2VydmVyIHNlbmRzIGJhZCBDb250ZW50LVJhbmdlCiAgaGVhZGVycy4KCi0gVGhlIG1ha2VmaWxlcyBmb3JjZWQgYSBzdGF0aWMgbGlicmFyeSBidWlsZCwgd2hpY2ggaXMgYmFkIHNpbmNlIHdlIG5vdyB1c2UKICBsaWJ0b29sIGFuZCB0aHVzIGhhdmUgZXhjZWxsZW50IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQhIEFsYmVydCBDaGluLUEtWW91bmcKICBmb3VuZCBvdXQuCgpWZXJzaW9uIDcuMC4xMWJldGEKCkRhbmllbCAoMSBBdWd1c3QgMjAwMCkKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHBvaW50ZWQgb3V0IHRoYXQgJ21ha2UgaW5zdGFsbCcgZGlkIG5vdCBwcm9wZXJseSBjcmVhdGUKICB0aGUgaGVhZGVyIGluY2x1ZGUgZGlyZWN0b3J5LCB3aHkgaXQgZmFpbGVkIHRvIGluc3RhbGwgdGhlIGhlYWRlciBmaWxlcyBhcwogIGl0IHNob3VsZC4gQXV0b21ha2UgaXNuJ3QgcmVhbGx5IGVxdWlwcGVkIHRvIGRlYWwgd2l0aCBzdWJkaXJlY3RvcmllcwogIHdpdGhvdXQgTWFrZWZpbGVzIGluIGFueSBuaWNlIHdheS4gSSBoYWQgdG8gcnVuIGFoZWFkIGFuZCBhZGQgTWFrZWZpbGVzIGluCiAgYm90aCBpbmNsdWRlIGFuZCBpbmNsdWRlL2N1cmwgYmVmb3JlIEkgbWFuYWdlZCB0byBjcmVhdGUgYSB0b3AtbGV2ZWwKICBtYWtlZmlsZSB0aGF0IHN1Y2NlZWRzIGluIGluc3RhbGwgZXZlcnl0aGluZyBwcm9wZXJseSEKCi0gT2ssIG5vIG1vcmUgImZlYXR1cmVzIiBhZGRlZCBub3cuIExldCdzIGp1c3QgdmVyaWZ5IHRoYXQgdGhlcmUncyBubyBtYWpvcgogIGZsYXdzIGFkZGVkIG5vdy4KCkRhbmllbCAoMzEgSnVseSAyMDAwKQotIEJvdGggSmVmZiBTY2hhc255IGFuZCBLZXRpbCBGcm95biBhc2tlZCBtZSBob3cgdG8gdGVsbCBjdXJsIG5vdCB0byBzZW5kIG9uZQogIG9mIHRob3NlIGludGVybmFsbHkgZ2VuZXJhdGVkIGhlYWRlcnMuIFRoZXkgZGlkbid0IHNldHRsZSB3aXRoIHRoZSBibGFuawogIG9uZXMgeW91IGNvdWxkIHRlbGwgY3VybCB0byB1c2UuIEkgcmV3cm90ZSB0aGUgaGVhZGVyLXJlcGxhY2Ugc3R1ZmYgYQogIGxpdHRsZS4gTm93LCBpZiB5b3UgcmVwbGFjZSBhbiBpbnRlcm5hbCBoZWFkZXIgd2l0aCB5b3VyIG93biBhbmQgdGhhdCBuZXcKICBvbmUgaXMgYSBibGFuayBoZWFkZXIgeW91IHdpbGwgb25seSByZW1vdmUgdGhlIGludGVybmFsIG9uZSBhbmQgbm90IGdldCBhbnkKICBibGFuay4gSSBjb3VsZG4ndCBmaWd1cmUgb3V0IGFueSBjYXNlIHdoZW4geW91IHdhbnQgdGhhdCBibGFuayBoZWFkZXIuCgpEYW5pZWwgKDI5IEp1bHkgMjAwMCkKLSBJdCBzdHJ1Y2sgbWUgdGhhdCB0aGUgbGliIHVzZWQgbG9jYWx0aW1lKCkgd2hpY2ggaXMgbm90IHRocmVhZC1zYWZlLCBzbyBub3cKICBJIHVzZSBsb2NhbHRpbWVfcigpIGluIHRoZSBzeXN0ZW1zIHRoYXQgaGFzIGl0LgoKLSBJIHdlbnQgdGhyb3VnaCB0aGlzIGVudGlyZSBkb2N1bWVudCBhbmQgcmVtb3ZlZCBhbGwgZW1haWwgYWRkcmVzc2VzIGFuZCBsZWZ0CiAgbmFtZXMgb25seS4gSSd2ZSByZWFsbHkgbWFkZSBhbiBlZmZvcnQgdG8gYWx3YXlzIG5vdGUgd2hvIGJyb3VnaHQgYmUgYnVnCiAgcmVwb3J0cyBvciBmaXhlcywgYnV0IG1vcmUgYW5kIG1vcmUgcGVvcGxlIGFzayBtZSB0byByZW1vdmUgdGhlIGVtYWlsCiAgYWRkcmVzc2VzIHNpbmNlIHRoZXkgYmVjb21lIHZpY3RpbXMgZm9yIHNwYW1zIHRoaXMgd2F5LiBHb3Jkb24gQmVhdG9uIGdvdCBtZQogIHdvcmtpbmcgb24gdGhpcy4KCkRhbmllbCAoMjcgSnVseSAyMDAwKQotIEr2cm4gSGFydHJvdGggZm91bmQgb3V0IHRoYXQgd2hlbiB5b3Ugc3BlY2lmaWVkIGEgSFRUUCBwcm94eSBpbiBhbgogIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB1c2VkIC1MLCBjdXJsIGZhaWxlZCBpbiB0aGUgc2Vjb25kIGZldGNoLiBJCiAgY29ycmVjdGVkIHRoaXMgcHJvYmxlbSBhbmQgcG9zdGVkIGEgcGF0Y2ggdG8gdGhlIGxpc3QuIE5vIG5lZWQgZm9yIGFuIGV4dHJhCiAgYmV0YSByZWxlYXNlIGp1c3QgZm9yIHRoaXMuCgpWZXJzaW9uIDcuMC4xMGJldGEKCkRhbmllbCAoMjcgSnVseSAyMDAwKQotIFNvLCBsaWJ0b29sIHJlcGxhY2VkIHR3byBvZiBteSBmaWxlcyB3aXRoIHN5bWJvbGljIGxpbmtzIGFuZCBJIGZvcmdvdCB0byBhZGQKICB0aGUgdHdvIG5ldyBsaWJ0b29sIGZpbGVzIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUgKGFuZCB0aGV5IHdlcmUgYWRkZWQgYXMKICBzeW1saW5rcyBhcyB3ZWxsISkgVGhpcyBvZiBjb3Vyc2UgbGVhZCB0byB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGZhaWxlZAogIG9uIDcuMC45Li4uCgpWZXJzaW9uIDcuMC45YmV0YQoKRGFuaWVsICgyNSBKdWx5IDIwMDApCi0gS3Jpc3RpYW4gS/ZobnRvcHAgPGtyaXMgYXQga29laG50b3BwLmRlPiBicm91Z2h0IGEgZml4IHRoYXQgbWFrZXMgbGliY3VybAogIGxpYnRvb2xpZmllZCwganVzdCBhcyB3ZSd2ZSB3YW50ZWQgZm9yIGEgd2hpbGUgbm93LiBIZSBhbHNvIG1hZGUgdGhlCiAgcmVjZW50bHkgYWRkZWQgbWFuIHBhZ2VzIGdldCBpbnN0YWxsZWQgcHJvcGVybHkgb24gJ21ha2UgaW5zdGFsbCcgYW5kIHNvbWUKICBvdGhlciBuaWNlIGNsZWFudXBzLgoKLSBJbiBhIGRpc2N1c3Npb24gd2l0aCBFZXR1IE9qYW5lbiBpdCBzdHJ1Y2sgbWUgdGhhdCBpZiB3ZSB1c2UgY3VybCB0byBnZXQgYQogIHBhZ2UgdXNpbmcgYSBwYXNzd29yZCwgYW5kIHRoYXQgcGFnZSB0aGVuIHNlbmRzIGEgTG9jYXRpb246IHRvIGFub3RoZXIKICBzZXJ2ZXIgdGhhdCBjdXJsIGZvbGxvd3MsIGN1cmwgd2lsbCBzZW5kIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoYXQKICBzZXJ2ZXIgYXMgd2VsbC4KCiAgTm93LCBJJ2xsIG5ldmVyIGJlIGFibGUgdG8gbWFrZSBjdXJsIGRvIExvY2F0aW9uOiBmb2xsb3dpbmcgYWxsIHRoYXQgcGVyZmVjdAogIGFuZCB5b3UncmUgYWxsIHNvb25lciBvciBsYXRlciByZXF1aXJlZCB0byB3cml0ZSBhIHNjcmlwdCB0byBkbyBzZXZlcmFsCiAgZmV0Y2hlcyB3aGVuIHlvdSdyZSBkb2luZyBhZHZhbmNlZCBzdHVmZiwgYnV0IG5vdyBJJ3ZlIG1vZGlmaWVkIGN1cmwgdG8gYXQKICBsZWFzdCAqb25seSogc2VuZCB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGUgb3JpZ2luYWwgc2VydmVyLiBXaGljaAogIG1lYW5zIHRoYXQgaWYgZ2V0IGEgcGFnZSBmcm9tIHNlcnZlciBBIHdpdGggYSBwYXNzd29yZCwgdGhhdCBmb3J3YXJkcyBjdXJsCiAgdG8gc2VydmVyIEIsIGN1cmwgd29uJ3QgdXNlIHRoZSBwYXNzd29yZCB0aGVyZS4gSWYgc2VydmVyIEIgdGhlbiBmb3J3YXJkcwogIGN1cmwgYmFjayB0byBzZXJ2ZXIgQSBhZ2FpbiwgdGhlIHBhc3N3b3JkIHdpbGwgYmUgdXNlZCBhZ2Fpbi4KCiAgVGhpcyBpcyBub3QgYSBwZXJmZWN0IGltcGxlbWVudGF0aW9uLCBhcyBpbiBhIGJyb3dzZXIgY2FzZSBpdCB3b3VsZCBvbmx5IHVzZQogIHRoZSBwYXNzd29yZCBpZiB0aGUgbGVmdC1wcmVmaXggb2YgdGhlIGZpcnN0IHBhdGggaXMgdGhlIHNhbWUuIEkganVzdCB0aGluawogIHRoYXQgdGhpcyBmaXggcHJldmVudHMgYSBzb21ld2hhdCBsdXJreSAic2VjdXJpdHkgaG9sZSIuCgogIEFzIGEgc2lkZS1ub3RlIGluIHRoaXMgc3ViamVjdDogSFRUUCBwYXNzd29yZHMgYXJlIHNlbnQgaW4gY2xlYXJ0ZXh0IGFuZAogIHdpbGwgbmV2ZXIgYmUgY29uc2lkZXJlZCB0byBiZSBzYWZlIG9yIHNlY3VyZS4gVXNlIEhUVFBTIGZvciB0aGF0LgoKLSBBcyBkaXNjdXNzZWQgb24gdGhlIG1haWxpbmcgbGlzdCwgSSBjb252ZXJ0ZWQgdGhlIEZUUCByZXNwb25zZSByZWFkaW5nCiAgZnVuY3Rpb24gaW50byB1c2luZyBzZWxlY3QoKSB3aGljaCB0aGVuIGFsbG93cyB0aW1lb3V0cyAoZXZlbiB1bmRlciB3aW4zMiEpCiAgaWYgdGhlIGNvbW1hbmQtcmVwbHkgc2Vzc2lvbiBnZXRzIHRvbyBzbG93IG9yIGRpZXMgY29tcGxldGVseS4gSSBtYWRlIGEKICBkZWZhdWx0IHRpbWVvdXQgb24gMzYwMCBzZWNvbmRzIHVubGVzcyBhbnl0aGluZyBlbHNlIGlzIHNwZWNpZmllZCwgc2luY2UgSQogIGRvbid0IHRoaW5rIGFueW9uZSB3YW50cyB0byB3YWl0IG1vcmUgdGhhbiB0aGF0IGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgdG8KICBnZXQgcmVjZWl2ZWQuLi4KCi0gVG9yc3RlbiBGb2VydHNjaCA8dG9yc3Rlbi5mb2VydHNjaCBhdCBnbXgubmV0PiBicm91Z2h0IGEgc2V0IG9mIGZpeGVzIGZvcgogIHRoZSByZmMxODY3IGZvcm0gcG9zdHMuIEhlIGludHJvZHVjZWQgJ25hbWU9PGZpbGUnIHdoaWNoIGJyaW5ncyBhIG1lYW5zIHRvCiAgc3V1cGx5IHZlcnkgbGFyZ2UgdGV4dCBjaHVua3MgcmVhZCBmcm9tIHRoZSBnaXZlbiBmaWxlIG5hbWUuIEl0IGRpZmZlcnMgZnJvbQogICduYW1lPUBmaWxlJyBpbiB0aGUgd2F5IHRoYXQgdGhpcyBsYXR0ZXIgdGhpbmcgaXMgbWFya2VkIGluIHRoZSB1cGxvYWRlZAogIGNvbnRlbnRzIGFzIGEgZmlsZSB1cGxvYWQsIHdoaWxlIHRoZSBmaXJzdCBpcyBqdXN0IHRleHQgKGFzIGluIGEgaW5wdXQgb3IKICB0ZXh0YXJlYSBmaWVsZCkuIFRvcnN0ZW4gYWxzbyBjb3JyZWN0ZWQgYSBidWcgdGhhdCB3b3VsZCBoYXBwZW4gaWYgeW91IHVzZWQKICAlcyBvciBzaW1pbGFyIGluIGEgLUYgZmlsZSBuYW1lLgoKLSBBcyBkaXNjb3ZlcmVkIGJ5IE5pY28gQmFnZ3VzIDxOaWNvLkJhZ2d1cyBhdCBtYWlsLmluZy5ubD4sIHdoZW4gdHJhbnNmZXJyaW5nCiAgZmlsZXMgdG8vZnJvbSBGVFAgdXNpbmcgdHlwZSBBU0NJSSBjdXJsIHNob3VsZCBub3QgZXhwZWN0IHRoZSB0cmFuc2ZlciB0byBiZQogIHRoZSBleGFjdCBzaXplIHJlcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgYXMgdGhlIGZpbGUgc2l6ZS4gU2luY2UgQVNDSUkgbWF5IHZlcnkKICB3ZWxsIG1lYW4gdGhhdCB0aGUgY29udGVudCBpcyB0cmFuc2xhdGVkIHdoaWxlIHRyYW5zZmVyZWQsIHRoZSBmaW5hbCBzaXplCiAgbWF5IHZlcnkgd2VsbCBkaWZmZXIuIFRoZXJlZm9yLCBjdXJsIG5vdyBpZ25vcmVzIHRoZSBmaWxlIHNpemUgd2hlbiBkb2luZwogIEFTQ0lJIHRyYW5zZmVycyBpbiBGVFAuCgpEYW5pZWwgKDI0IEp1bHkgMjAwMCkKLSBBZGRlZCBDVVJMT1BUX1BST1hZUE9SVCB0byB0aGUgY3VybF9lYXN5X3NldG9wdCgpIGNhbGwgdG8gYWxsb3cgdGhlIHByb3h5CiAgcG9ydCBudW1iZXIgdG8gYmUgc2V0IHNlcGFyYXRlbHkgZnJvbSB0aGUgcHJveHkgaG9zdCBuYW1lLgoKLSBBbmRyZXcgPGFuZHJldyBhdCB1Z2gubmV0LmF1PiBwb2ludGVkIG91dCBhIG5ldHJjIG1hbnVhbCBidWcuCgotIFRoZSBGVFAgdHJhbnNmZXIgY29kZSBub3cgYWNjZXB0cyBhIDI1MC1jb2RlIGFzIHdlbGwgYXMgdGhlIHByZXZpb3VzbHkKICBhY2NlcHRlZCAyMjYsIGFmdGVyIGEgc3VjY2Vzc2Z1bCBmaWxlIHRyYW5zZmVyLiBNb2hhbiA8bW5haXIgYXQKICBldmVyZ3JlZW4tZnVuZHMuY29tPiBwb2ludGVkIHRoaXMgb3V0LgoKLSBUaGUgY2hlY2sgZm9yICpib3RoKiBuc2wgYW5kIHNvY2tldCB3YXMgbmV2ZXIgYWRkZWQgaW4gdGhlIHY3IGNvbmZpZ3VyZS5pbgogIHdoZW4gSSBtb3ZlZCB0aGUgbWFpbiBicmFuY2guIEkgcmUtYWRkZWQgdGhhdCBjaGVjayB0byBjb25maWd1cmUuaW4uIFRoaXMgd2FzCiAgZGlzY292ZXJlZCBieSBSaWNoIEdyYXkuCgotIEhvd2FyZCwgQmxhaXNlIDxCbGFpc2UuSG93YXJkIGF0IGZhY3RpdmEuY29tPiBwb2ludGVkIG91dCBhIG1pc3NpbmcgZnJlZSgpIGluCiAgY3VybF9kaXNjb25uZWN0KCkgd2hpY2ggb2YgY291cnNlIG1lYW50IGxpYmN1cmwgYXRlIG1lbW9yeS4KCi0gQnJpYW4gRS4gR2FsbGV3IG5vdGVkIHRoYXQgdGhlIEhUVFAgJ0hvc3Q6JyBoZWFkZXIgY3VybCBzZW50IGRpZCBub3QKICBwcm9wZXJseSBpbmNsdWRlIHRoZSBwb3J0IG51bWJlciBpZiBub24tZGVmYXVsdCBwb3J0cyB3ZXJlIHVzZWQuIFRoaXMgc2hvdWxkCiAgbm93IGhhdmUgYmVlbiBmaXhlZC4KCi0gSFRUUCBjb25uZWN0IGVycm9ycyBub3cgcmV0dXJuIGVycm9ycyBlYXJsaWVyLiBUaGlzIHdhcyBtb3N0IG5vdGFibHkgY2F1c2luZwogIHByb2JsZW1zIHdoZW4gdGhlIEhUVFBTIGNlcnRpZmljYXRlIGhhZCBwcm9ibGVtcyBhbmQgbGF0ZXIgY2F1c2VkIGEgY3Jhc2guCiAgTWFueSB0aGFua3MgdG8gR3JlZ29yeSBOaWNob2xscyA8Z25pY2hvbGxzIGF0IGxldmVsOC5jb20+IGZvciBkaXNjb3ZlcmluZwogIGFuZCBzdWdnZXN0aW5nIGEgZml4Li4uCgpEYW5pZWwgKDIxIEp1bmUgMjAwMCkKLSBBZnRlciBhICJidWcgcmVwb3J0IiBJIHJlY2VpdmVkIHdoZXJlIHRoZSB1c2VyIHdhcyB1c2luZyBib3RoIC1GIGFuZCAtSSBpbiBhCiAgSFRUUCByZXF1ZXN0IChpdCBzZXZlcmx5IGNvbmZ1c2VkIHRoZSBsaWJyYXJ5IEkgc2hvdWxkIGFkZCksIEkgYWRkZWQgc29tZQogIGNoZWNrcyB0byBzcmMvbWFpbi5jIHRoYXQgcHJldmVudHMgc2V0dGluZyBtb3JlIHRoYW4gb25lIEhUVFAgcmVxdWVzdAogIGNvbW1hbmQsIG5vIG1hdHRlciB3aGF0IHRoZSB1c2VyIHdhbnRzISA7LSkKClZlcnNpb24gNy4wLjhiZXRhCgpEYW5pZWwgKDIwIEp1bmUgMjAwMCkKLSBJIGRpZCBhIG1ham9yIHJlcGxhY2UgaW4gbWFueSBmaWxlcyB0byB1c2UgdGhlIG5ldyBjdXJsIGRvbWFpbiBoYXh4LnNlCiAgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgb25lLgoKLSBBcyBFZXR1IE9qYW5lbiBzdWdnZXN0ZWQsIEkgZmluYWxseSB0b29rIHRoZSBzdGVwIGFuZCBub3cgbGliY3VybCBubyBsb25nZXIKICBtYWtlcyBhIFBPU1QgYWZ0ZXIgaXQgaGFzIGZvbGxvd2VkIGEgbG9jYXRpb24uIFdoZW4gdGhlIGluaXRpYWwgUE9TVCBoYXMKICBiZWVuIGRvbmUsIGl0J2xsIHR1cm5lZCBpbnRvIGEgR0VUIGZvciB0aGUgZnVydGhlciByZXF1ZXN0cy4gVGhpcyBpcyBvbmx5CiAgaW50ZXJlc3Rpbmcgd2hlbiB1c2luZyAtTC8tLWxvY2F0aW9uICphbmQqIGRvaW5nIGEgUE9TVCBhdCB0aGUgc2FtZSB0aW1lLgoKICBXaGlsZSBtZXNzaW5nIHdpdGggdGhpcywgSSBhZGRlZCBhbm90aGVyIHdlaXJkIGZlYXR1cmUgSSBjYWxsICdhdXRvCiAgcmVmZXJlcicuIElmIHlvdSBhcHBlbmQgJzthdXRvJyB0byB0aGUgcmlnaHQgb2YgYSBnaXZlbiByZWZlcmVyIHN0cmluZyAob3IKICBvbmx5IHVzZSB0aGF0IHN0cmluZyBhcyByZWZlcmVyKSwgbGliY3VybCB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZQogIHByZXZpb3VkIFVSTCBhcyByZWZlcmVkIHdoZW4gaXQgZm9sbG93cyBhIExvY2F0aW9uOiBhbmQgZ2V0cyBhIHN1Y2NlZWRpbmcKICBkb2N1bWVudC4KCi0gTXkgaGVybyBSaWNoIEdyYXkgZm91bmQgdGhlIHZlcnkgb2JzY3VyZSBGVFAgYnVnIHRoYXQgaGFwcGVuZWQgdG8gaGltIG9ubHkKICB3aGVuIHBhc3NpbmcgdGhyb3VnaCBhIHBhcnRpY3VsYXIgZmlyZXdhbGwgYW5kIHVzaW5nIHRoZSBQT1JUIGNvbW1hbmQuIEl0CiAgdHVybmVkIG91dCB0aGF0IFBPUlQgd2FzIHRoZSBvbmx5IGNvbW1hbmQgaW4gdGhlIGxpYi9mdHAuYyBzb3VyY2UgdGhhdAogIGRpZG4ndCBzZW5kIGEgcHJvcGVyIFxyXG4gc2VxdWVuY2UgYnV0IGluc3RlYWQgdXNlZCB0aGUgZmF1bHR5IFxuIHdoaWNoIGFzCiAgaXQgc2VlbWVkIGlzIHN1cHBvcnRlZCBieSBtb3N0IG1ham9yIGZ0cCBzZXJ2ZXJzLi4uIDotTwoKVmVyc2lvbiA3LjAuN2JldGEKCkRhbmllbCAoMTYgSnVuZSAyMDAwKQotIEkgaGFkIGF2b2lkZWQgdGhpcyBsb25nIGVub3VnaCBub3csIHNvIEkgbW92ZWQgdGhlIGFsdGVybmF0aXZlIHByb2dyZXNzIGJhcgogIHN0dWZmIGZyb20gdGhlIGxpYiBhbmQgYWRkZWQgaXQgdG8gdGhlIGNsaWVudCBjb2RlLiBUaGlzIGlzIG5vdyB1c2luZyB0aGUKICByZWNlbnRseSBhZGRlZCBwcm9ncmVzcyBjYWxsYmFjayBhbmQgaXQgc2VlbXMgdG8gd29yayBwcmV0dHkgbXVjaCBsaWtlCiAgYmVmb3JlLiBTaW5jZSBpdCBpcyBvbmx5IG9uZSBwcm9ncmVzcyBiYXIgYW5kIHlvdSBhbmQgZG93bmxvYWQgYW5kIHVwbG9hZCBhdAogIHRoZSBzYW1lIHRpbWUsIHRoaXMgYmFyIHNob3dzIHRoZSBjb21iaW5lZCBwcm9ncmVzcyBvZiBib3RoIGRpcmVjdGlvbnMuIFRoaXMKICBjb2RlIHdhcyBqdXN0IHBvcnRlZCBmcm9tIHRoZSBvbGQgcGxhY2UgdG8gdGhpcywgTGFycyBpcyBzdGlsbCBvdXIgc2F2aW91ciEKICA7LSkgVGhpcyBhbHNvIG1hZGUgdGhlIGRvY3VtZW50YXRpb24gbW9yZSBhY2N1cmF0ZSBzaW5jZSBJIG5ldmVyIHJlbW92ZWQKICB0aGlzIGZ1bmN0aW9uIGZyb20gYW55IGRvY3MhIEFsdGhvdWdoIEkgbm93IHJlbW92ZWQgdGhlIENVUkxPUFRfUFJPR1JFU1NNT0RFCiAgZnJvbSB0aGUgbGlicmFyeSBzaW5jZSB0aGUgbGliIGhhcyBvbmx5IG9uZSBpbnRlcm5hbCBwcm9ncmVzcyBtZXRlciBhbmQgaXQKICB3aWxsIG5ldmVyIGdldCBhbm90aGVyLiBJdCBpcyBhbHRob3VnaCBsaWtlbHkgdGhhdCB0aGUgaW50ZXJuYWwgb25lIGFsc28KICB3aWxsIGJlIG1vdmVkIHRvIHRoZSBjbGllbnQgY29kZSBpbiB0aGUgZnV0dXJlICh3aGVuIEkgaGF2ZSBvdGhlciBtZWFucyBvZgogIGdldHRpbmcgdGhlIHdyaXRlb3V0IGRhdGEgYW5kIG1vdmUgdGhhdCB0b28gdG8gdGhlIGNsaWVudCkuCgotIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgdG8gdmVyaWZ5IHRoYXQgc3RhbmRhcmQgcHJvZ3Jlc3MgbWV0ZXIgd29ya3MgYW5kIEkKICBmb3VuZCBvdXQgaXQgZGlkbid0IGdldCBpbml0ZWQgcHJvcGVybHkuIEdycnIuIEkgY29ycmVjdGVkIHRoYXQgYXMgd2VsbC4KCkRhbmllbCAoMTUgSnVuZSAyMDAwKQotIEkgdGhvdWdodCBJJ2QgYmV0dGVyIHZlcmlmeSB0aGF0IHRoZSAtRiBvcHRpb24gc3RpbGwgd29ya3MgaW4gdjcgYW5kIG9mCiAgY291cnNlIGl0IGRpZG4ndC4uLiA6LS8gQW55d2F5LCBJIGhhZCB0aGUgcHJvYmxlbXMgSSBjb3VsZCBkaXNjb3ZlcgogIGNvcnJlY3RlZC4gQWJvdXQgb25lIG1vbnRoIG9mIGJldGEgdGVzdGluZyBhbmQgbm90IGEgc2luZ2xlIHBlcnNvbiBoYXMgdXNlZAogIHRoaXMgZmVhdHVyZSB3aXRoIHY3PwoKLSBCavZybiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLS1wcm9ncmVzcy1iYXIgc3RpbGwgZG9lc24ndCB3b3JrIGluCiAgdjcuIEhtLgoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gVGltIFRhc3NvbmlzIGRpc2NvdmVyZWQgdGhhdCBjdXJsIDcgZGlkbid0IGhhbmRsZSBub3JtYWwgaHR0cCBQT1NUIGFzIGl0CiAgc2hvdWxkLiBJIGNvcnJlY3RlZCB0aGlzLgoKVmVyc2lvbiA3LjAuNmJldGEKCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIEJq9nJuIFN0ZW5iZXJnIHBvaW50ZWQgb3V0IHNldmVyYWwgcHJvYmxlbXMgKHJlbGF0ZWQgdG8gd2luMzIgY29tcGlsaW5nKToKICBsaWIvc3RyZXF1YWwuYyBoYWQgYSBiYWQgI2lmZGVmIGZvciBvbmUgb2YgdGhlIHN0cmluZyBjb21wYXJpc29ucyAod2luMzIpCiAgc3JjL21haW4uYyBoYWQgc2V2ZXJhbCBtaW5vciBwcm9ibGVtcwogIGxpYi9tYWtlZmlsZS5tMzIgaGFkIGdldHBhc3MuW2NvXSB0d2ljZQogIHNyYy9jb25maWctd2luMzIuaCBsYWNrZWQgdGhlIEhBVkVfRkNOVExfSCBkZWZpbmUKICBib3RoIGNvbmZpZy13aW4zMi5oIGZpbGVzIG5vdyBvbmx5IHNldCB0aGUgSEFWRV9VTklTVERfSCBkZWZpbmUgaWYgdGhlCiAgZGVmaW5lIE1JTkdXMzIgaXMgc2V0LCBhbmQgSSBtb2RpZmllZCBzcmMvbWFrZWZpbGUubTMyIGFuZCBsaWIvbWFrZWZpbGUubTMyCiAgdG8gc2V0IGl0LgoKVmVyc2lvbiA3LjAuNWJldGEKCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIEFwcGxpZWQgTHVvbmcgRGluaCBEdW5nJ3MgY29tbWVudHMgYWJvdXQgYSBmZXcgd2luMzIgY29tcGlsZSBwcm9ibGVtcy4KCi0gQXBwbGllZCBCavZybiBTdGVuYmVyZydzIHN1Z2dlc3RlZCBmaXggdGhhdCB0dXJucyB0aGUgd2luMzIgc3Rkb3V0IHRvCiAgYmluYXJ5LiBJdCB3b24ndCBkbyBpdCBpZiB0aGUgLUIgLyAtLXVzZS1hc2NpaSBvcHRpb24gaXMgdXNlZC4gVGhhdCBvcHRpb24KICBpcyBub3cgYW4gZXh0ZW5kZWQgdmVyc2lvbiBvZiB0aGUgcHJldmlvdXMgLUIgLy0tZnRwLS1hc2NpaS4gVGhlIGZsYWcgd2FzCiAgYWxyZWFkeSBpbiB1c2UgYmUgdGhlIGxkYXAgYXMgd2VsbCBzbyB0aGUgbmV3IG5hbWUgZml0cyBwcmV0dHkgZ29vZC4gVGhlCiAgbGliY3lybCBDVVJMT1BUX1RSQU5TRkVSVEVYVCB3YXMgYWxzbyBpbnRyb2R1Y2VkIGFzIGFuIGFsaWFzIHRvIHRoZSBub3cKICBvYnNvbGV0ZSBDVVJMT1BUX0ZUUEFTQ0lJLiBDYW4ndCB2ZXJpZnkgdGhpcyBmaXggbXlzZWxmIGFzIEkgaGF2ZSBubyB3aW4zMgogIGNvbXBpbGVyIGFyb3VuZC4KCkRhbmllbCAoMTMgSnVuZSAyMDAwKQotIEx1b25nIERpbmggRHVuZyA8ZHVuZyBhdCBzY2guYm1lLmh1PiBmb3VuZCBhIHByb2JsZW0gaW4gY3VybF9lYXN5X2NsZWFudXAoKQogIHNpbmNlIGl0IGZyZWUoKWVkIHRoZSBtYWluIGN1cmwgc3RydWN0ICp0d2ljZSouIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCkRhbmllbCAoOSBKdW5lIDIwMDApCi0gVXBkYXRlZCB0aGUgUkVTT1VSQ0VTIGZpbGUsIGFkZGVkIGEgUkVBRE1FLndpbjMyIGZpbGUuCgpEYW5pZWwgKDggSnVuZSAyMDAwKQotIFNvIEkgZmluYWxseSBhZGRlZCB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgdG8gdGhlICpzZXRvcHQoKSBvcHRpb25zIGFuZCBpdAogIHNob3VsZCB3b3JrIG5vdy4gSSBkb24ndCBoYXZlIHRoZSBlbmVyZ3kgdG8gd3JpdGUgYW55IHRlc3QgcHJvZ3JhbSBmb3IgaXQKICByaWdodCBub3cuCi0gTWFkZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdHlwZWRlZnMgcHVibGljIGluIGN1cmwvY3VybC5oIGZvciBjb21mb3J0LiBKdXN0CiAgaW4gY2FzZSBhbnlvbmUgd2FubmEgZmlkZGxlIHdpdGggc3VjaCBwb2ludGVycy4KLSBVcGRhdGVkIHRoZSBjdXJsX2Vhc3lfc2V0b3B0KCkgbWFuIHBhZ2UgYWNjb3JkaW5nbHkuCgpWZXJzaW9uIDcuMC40YmV0YQoKRGFuaWVsICgyIEp1bmUgMjAwMCkKLSBJIG5vdGljZWQgdGhhdCB3aGVuIGRvaW5nIExvY2F0aW9uOiBmb2xsb3dpbmcsIHdlIGxvc3QgY3VzdG9tIGhlYWRlcnMgaW4gYWxsCiAgYnV0IHRoZSBmaXJzdCByZXF1ZXN0LgotIFJlbW92ZWQgdGhlICdIdHRwUG9zdCcgc3RydWN0IGFuZCBtb3ZlZCB0aGUgaGVhZGVyIHN0dWZmIHRvIHRoZSBtb3JlIGdlbmVyaWMKICBjdXJsX3NsaXN0LgotIEFkZGVkIHNvbWUgYmV0dGVyIHNsaXN0LWNsZWFudXBzIGluIHNyYy9tYWluLmMKClZlcnNpb24gNy4wLjNiZXRhCgpEYW5pZWwgKDMxIE1heSAyMDAwKQotIFNvIEkgZGlzY292ZXJlZCB0aGF0IEkgcmVsZWFzZWQgdGhlIDcuMC4yYmV0YSB3aXRob3V0IGl0IGJlaW5nIGFibGUgdG8KICBjb21waWxlIHVuZGVyIExpbnV4LiBnZXRob3N0YnluYW1lX3IoKSBhbmQgZ2V0aG9zdGJ5YWRkcl9yKCkgdHVybmVkIG91dCB0bwogIGZlYXR1cmUgYSBkaWZmZXJlbnQgYW1vdW50IG9mIGFyZ3VtZW50cyBvbiBkaWZmZXJlbnQgc3lzdGVtcyBzbyBJIGhhZCB0byBhZGQKICBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgdGhpcyBhbmQgYWRqdXN0IHRoZSBjb2RlIHNsaWdodGx5LgoKVmVyc2lvbiA3LjAuMmJldGEKCkRhbmllbCAoMjkgTWF5IDIwMDApCi0gQ29ycmVjdGVkIHRoZSBiaXRzLiogYXNzaWdubWVudHMgd2hlbiB1c2luZyBDVVJMT1BUIG9wdGlvbnMgdGhhdCBvbmx5CiAgdG9nZ2xlcyBvbmUgb2YgdGhvc2UgYml0cy4KCi0gQXBwbGllZCB0aGUgaHVnZSBwYXRjaGVzIGZyb20gRGF2aWQgTGVCbGFuYyA8ZGxlYmxhbmMgYXQgcW54LmNvbT4gdGhhdCBhZGQKICB1c2FnZSBvZiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIHNpbWlsYXIgZnVuY3Rpb25zIGluIGNhc2UgdGhleSdyZSBhcm91bmQsCiAgc2luY2UgdGhhdCBtYWtlIGxpYmN1cmwgbXVjaCBiZXR0ZXIgdGhyZWFkc2FmZSBpbiBtYW55IHN5c3RlbXMgKHN1Y2ggYXMKICBzb2xhcmlzKS4gSSBhZGRlZCB0aGUgY2hlY2tzIGZvciB0aGVzZSBmdW5jdGlvbnMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgogIEkgY2FuJ3QgZXhwbGFpbiB3aHksIGJ1dCB0aGUgaW5ldF9udG9hX3IoKSBmdW5jdGlvbiBkaWQgbm90IGFwcGVhciBpbiBteQogIFNvbGFyaXMgaW5jbHVkZSBmaWxlcywgSSBoYWQgdG8gYWRkIG15IG93biBpbmNsdWRlIGZpbGUgZm9yIHRoaXMgZm9yIG5vdy4KCkRhbmllbCAoMjIgTWF5IDIwMDApCi0gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIGZpeGVzIHRvIG1ha2UgdGhlIHdpbjMyIHZlcnNpb24gY29tcGlsZSBwcm9wZXJseSBhcwogIHdlbGwgYXMgYSByZW5hbWUgb2YgdGhlICdpbnRlcmZhY2UnIGZpZWxkIGluIHRoZSB1cmxkYXRhIHN0cnVjdCwgYXMgaXQgc2VlbXMKICB0byBiZSByZXNlcnZlZCBpbiBzb21lIGdjYyB2ZXJzaW9ucyEKCi0gUmljaCBHcmF5IHN0cnVjayBiYWNrIHdpdGggeWV0IHNvbWUgcG9ydGFiaWxpdHkgcmVwb3J0cy4gRGF0YSBHZW5lcmFsIERHL1VYCiAgbmVlZGVkIGEgbGl0dGxlIGZpeCBpbiBsaWIvbGRhcC5jIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBSVExEX0dMT0JBTCBkZWZpbmVkLgogIE1vcmUgZml4ZXMgYXJlIGV4cGVjdGVkIGFzIGEgcmVzdWx0IG9mIFJpY2hpZXMgdmVyeSBoZWxwZnVsIHdvcmsuCgpWZXJzaW9uIDcuMC4xYmV0YQoKRGFuaWVsICgyMSBNYXkgMjAwMCkKLSBVcGRhdGVkIGxvdHMgb2YgI2RlZmluZXMsIGVudW1zIGFuZCB2YXJpYWJsZSB0eXBlIG5hbWVzIGluIHRoZSBsaWJyYXJ5LiBObwogIG1vcmUgd2VpcmQgVVJHIG9yIFVSTFRBRyBwcmVmaXhlcy4gQWxsIHR5cGVzIGFuZCBuYW1lcyBzaG91bGQgYmUgY3VybC0KICBwcmVmaXhlZCB0byBhdm9pZCBuYW1lIHNwYWNlIGNsYXNoZXMuIFRoZSBGTEFHUy1wYXJhbWV0ZXIgdG8gdGhlIGZvcm1lcgogIGN1cmxfdXJsZ2V0KCkgaGFzIGJlZW4gY29udmVydGVkIGludG8gYSBidW5jaCBvZiBmbGFncyB0byB1c2UgaW4gc2VwYXJhdGUKICBzZXRvcHQgY2FsbHMuIEknbSBzdGlsbCBmb2N1c2luZyBvbiB0aGUgZWFzeS1pbnRlcmZhY2UsIGFzIHRoZSBjdXJsIHRvb2wgaXMKICBub3cgdXNpbmcgdGhhdC4KCi0gQmpvcm4gUmVlc2UgaGFzIHByb3ZpZGVkIG1lIHdpdGggYW4gYXN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXIgdGhhdCBJIHBsYW4KICB0byB1c2UgaW4gdXBjb21pbmcgdmVyc2lvbnMgb2YgY3VybCB0byBiZSBhYmxlIHRvIGdyYWNlZnVsbHkgdGltZW91dCBuYW1lCiAgbG9va3Vwcy4KClZlcnNpb24gNy4wYmV0YQoKRGFuaWVsICgxOCBNYXkgMjAwMCkKLSBJbnRyb2R1Y2VkIExJQkNVUkxfVkVSU0lPTl9OVU0gdG8gdGhlIGN1cmwuaCBpbmNsdWRlIGZpbGUgdG8gYmV0dGVyIGFsbG93CiAgc291cmNlIGNvZGVzIHRvIGJlIGRlcGVuZGVudCBvbiB0aGUgbGliIHZlcnNpb24uIFRoaXMgZGVmaW5lIGlzIG5vdyBzZXQgdG8KICBhIGRleGFkZWNpbWFsIG51bWJlciwgd2l0aCA4IGJpdHMgZWFjaCBmb3IgbWFqb3IgbnVtYmVyLCBtaW5vciBudW1iZXIgYW5kCiAgcGF0Y2ggbnVtYmVyLiBJbiBvdGhlciB3b3JkcywgdmVyc2lvbiAxLjIuMyB3b3VsZCBtYWtlIGl0IDB4MDEwMjAzLiBJdCBhbHNvCiAgbWFrZXMgYSBsYXJnZXIgbnVtYmVyIGEgbmV3ZXIgdmVyc2lvbi4KCkRhbmllbCAoMTcgTWF5IDIwMDApCi0gTWFydGluIEthbW1lcmhvZmVyIGNvcnJlY3RseSBwb2ludGVkIG91dCBzZXZlcmFsIGZsYXdzIGluIHRoZSBGVFAgcmFuZ2UKICBvcHRpb24uIEkgY29ycmVjdGVkIHRoZW0uCi0gUmVtb3ZlZCB0aGUgd2luMzIgd2luc29jayBpbml0IGNyYXAgZnJvbSB0aGUgbGliIHRvIHRoZSBzcmMvbWFpbi5jIGZpbGUKICBpbiB0aGUgYXBwbGljYXRpb24gaW5zdGVhZC4gVGhleSBjYW4ndCBiZSBpbiB0aGUgbGliLCBlc3BlY2lhbGx5IG5vdCBmb3IKICBtdWx0aXRocmVhZGVkIHB1cnBvc2VzLgoKRGFuaWVsICgxNiBNYXkgMjAwMCkKLSBSZXdyb3RlIHRoZSBzcmMvbWFpbi5jIHNvdXJjZSB0byB1c2UgdGhlIG5ldyBlYXN5LWludGVyZmFjZSB0byBsaWJjdXJsIDcuCiAgVGhlcmUgaXMgc3RpbGwgbW9yZSB3b3JrIHRvIGRvLCBidXQgdGhlIGZpcnN0IHN0ZXAgaXMgbm93IHRha2VuLgogIDxjdXJsL2Vhc3kuaD4gaXMgdGhlIGluY2x1ZGUgZmlsZSB0byB1c2UuCgpEYW5pZWwgKDE0IE1heSAyMDAwKQotIEZUUCBVUkxzIGFyZSBub3cgdHJlYXRlZCBzbGlnaHRseSBkaWZmZXJlbnQsIG1vcmUgYWNjb3JkaW5nIHRvIFJGQyAxNzM4LgotIEZUUCBzZXNzaW9ucyBhcmUgbm93IHBlcmZvcm1lZCBkaWZmZXJlbnRseSwgd2l0aCBDV0QgY29tbWFuZHMgdG8gY2hhbmdlCiAgZGlyZWN0b3J5IGluc3RlYWQgb2YgUkVUUi9TVE9SL0xJU1Qgd2l0aCB0aGUgZnVsbCBwYXRoLiBEaXNjdXNzaW9ucyB3aXRoCiAgUmljaCBHcmF5IG1hZGUgbWUgbm90aWNlIHRoZXNlIHByb2JsZW1zLgotIEphbm5lIEpvaGFuc3NvbiBkaXNjb3ZlcmVkIGFuZCBjb3JyZWN0ZWQgYSBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlCiAgc3JjL3Vzcmdsb2IuYyBmaWxlLgotIEkgaGFkIHRvIGFkZCBhIGxpYi9zdHJlcXVhbC5jIGZpbGUgZm9yIGRvaW5nIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5nCiAgY29tcGFyZXMgb24gYWxsIHBsYXRmb3Jtcy4KCkRhbmllbCAoOCBNYXkgMjAwMCk6Ci0gQmVlbiB3b3JraW5nIGxvdHMgb24gdGhlIG5ldyBsaWIuCi0gVG9nZXRoZXIgd2l0aCBSaWNoIEdyYXksIEkndmUgdHJpZWQgdG8gYWRqdXN0IHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHdvcmsKICBiZXR0ZXIgb24gdGhlIE5DUiBNUC1SQVMgVW5peC4KCkRhbmllbCAoMiBNYXkgMjAwMCk6Ci0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwb2ludGVkIG91dCB0aGF0IEkgaGFkIGEgZmV3IHRvbyBtYW55IGluc3RydWN0aW9ucyBpbgogIGNvbmZpZ3VyZS5pbiB0aGF0IGRpZG4ndCBkbyBhbnkgZ29vZC4KCkRhbmllbCAoMjQgQXByaWwgMjAwMCk6Ci0gQWRkZWQgYSBuZXcgcGFyYWdyYXBoIHRvIHRoZSBGQVEgYWJvdXQgd2hhdCB0byBkbyB3aGVuIGNvbmZpZ3VyZSBjYW4ndAogIGZpbmQgT3BlblNTTCBldmVuIHRob3VnaCBpdCBpcyBpbnN0YWxsZWQuIFN1cHBsaWVkIGJ5IEJvYiBBbGxpc29uCgpEYW5pZWwgKDEyIEFwcmlsIDIwMDApOgotIFN0YXJ0ZWQgbWVzc2luZyBhcm91bmQgYmlnLXRpbWUgdG8gY29udmVydCB0aGUgb2xkIGxpYnJhcnkgaW50ZXJmYWNlIHRvIGEKICBiZXR0ZXIgb25lLi4uCgpEYW5pZWwgKDggQXByaWwgMjAwMCk6Ci0gTWFkZSB0aGUgcHJvZ3Jlc3MgYmFyIGxvb2sgYmV0dGVyIGZvciBmaWxlIHNpemVzIGJldHdlZW4gOTk5OSBraWxvYnl0ZXMKICBhbmQgMTAwIG1lZ2FieXRlcy4gVGhleSdyZSBub3cgZGlzcGxheWVkIFhYLlhNLgotIEkgYWxzbyBub3RpY2VkIHRoYXQgZnRwIGZldGNoZXMgdGhyb3VnaCBIVFRQIHByb3hpZXMgZGlkbid0IGFkZCB0aGUgdXNlcgogIGFnZW50IHN0cmluZy4gSXQgZG9lcyBub3cuCi0gSGFiaWJpZSA8aGFiaWJpZSBhdCBNYWlsYW5kTmV3cy5jb20+IHN1cHBsaWVkIGEgcHJldHR5IGdvb2Qgd2F5IHRvIGJ1aWxkIFJQTXMKICBvbiBhIExpbnV4IG1hY2hpbmUuIEl0IHN0aWxsIGEpIHJlcXVpcmVzIG1lIHRvIGJlIHJvb3QgdG8gZG8gaXQsIGIpIGxlYXZlcwogIHRoZSBycG0gcGFja2FnZXMgbGF5aW5nIGF0IHNvbWUgb2RkIHBsYWNlIG9uIG15IGRpc2sgYykgZG9lc24ndCB3b3JrIHRvCiAgYnVpbGQgdGhlIHNzbCB2ZXJzaW9uIG9mIGN1cmwgc2luY2UgSSBkaWRuJ3QgaW5zdGFsbCBvcGVuc3NsIGZyb20gYW4gcnBtCiAgcGFja2FnZSBzbyBub3cgdGhlIHJwbSBjcmFwIHRoaW5rcyBJIGRvbid0IGhhdmUgb3BlbnNzbCBhbmQgcmVmdXNlcyB0byBidWlsZAogIGEgcGFja2FnZSB0aGF0IGRlcGVuZHMgb24gc3NsLi4uIERpZCBJIG1lbnRpb24gSSBkb24ndCBnZXQgYWxvbmcgd2l0aCBSUE0/Ci0gT25jZSBhZ2FpbiBJIHJlY2VpdmVkIGEgYnVnIHJlcG9ydCBhYm91dCBhdXRvY29uZiBub3Qgc2V0dGluZyAtTCBwcmlvciB0byAtbAogIG9uIHRoZSBjb21tYW5kIGxpbmUgd2hlbiBjaGVja2luZyBmb3IgbGlicy4gSW4gdGhpcyBjYXNlIGl0IG1hZGUgdGhlIG5hdGl2ZQogIGNjIGNvbXBpbGVyIG9uIFNvbGFyaXMgNyB0byBmYWlsIHRoZSBPcGVuU1NMIGNoZWNrLiBUaGlzIGhhcyBwcmV2aW91c2x5IGJlZW4KICByZXBvcnRlZCB0byBjYXVzZSBwcm9ibGVtcyBvbiBIUC1VWCBhbmQgaXMgYSBrbm93biBmbGF3IGluIGF1dG9jb25mIDIuMTMuIEl0CiAgaXMgYSBwaXR5IHRoZXJlJ3Mgbm8gbmV3ZXIgcmVsZWFzZSBhcm91bmQuLi4KCkRhbmllbCAoNCBBcHJpbCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBzdXBwbGllZCBtZSB3aXRoIHR3byBmaXhlcyB0aGF0CiAgYXBwZWFyYW50bHkgbWFrZXMgdGhlIE9TLzIgcG9ydCB3b3JrIGJldHRlciB3aXRoIG11bHRpcGxlIFVSTHMuCgpEYW5pZWwgKDIgQXByaWwgMjAwMCk6Ci0gQW5vdGhlciBMb2NhdGlvbjogZml4LiBUaGlzIHRpbWUsIHdoZW4gY3VybCBjb25uZWN0ZWQgdG8gYSBwb3J0IGFuZCB0aGVuCiAgZm9sbG93ZWQgYSBsb2NhdGlvbiB3aXRoIGFuIGFic29sdXRlIFVSTCB0byBhbm90aGVyIHBvcnQsIGl0IG1pc2JlaGF2ZWQuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDApOgotIEguIERhcGhuZSBMdW9uZyBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIHdyb25nbHkKICBtZXNzaW5nIHVwIHRoZSBwcm94eSBzdHJpbmcgd2hlbiBmZXRjaGluZyBhIGRvY3VtZW50IHRocm91Z2ggYSBodHRwIHByb3h5LAogIHdoaWNoIHNjcmV3ZWQgdXAgbXVsdGlwbGUgZmV0Y2hlcyBzdWNoIGFzIGluIGxvY2F0aW9uOiBmb2xsb3dpbmdzLgoKRGFuaWVsICgyMyBNYXJjaCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBjb3JyZWN0ZWQgbXkgYmFkbHkgYXBwbGllZCBwYXRjaCBoZQogIGFjdHVhbGx5IGFscmVhZHkgdG9sZCBtZSBhYm91dCEKCi0gSC4gRGFwaG5lIEx1b25nIGJyb3VnaHQgbWUgYSBmaXggdGhhdCBub3cgbWFrZXMgY3VybAogIGlnbm9yZSBzZWxlY3QoKSBlcnJvcnMgaW4gdGhlIGRvd25sb2FkIGlmIGVycm5vIGlzIEVJTlRSLCB3aGljaCB0dXJucyBvdXQgdG8KICBoYXBwZW4gZXZlcnkgbm93IGFuZCB0aGVuIHdoZW4gdXNpbmcgbGliY3VybCBtdWx0aS10aHJlYWRlZC4uLgoKRGFuaWVsICgyMiBNYXJjaCAyMDAwKToKLSBXaGFtIEJhbmcgc3VwcGxpZWQgYSBjb3VwbGUgb2Ygd2luMzIgZml4ZXMuIEhBVkVfVU5BTUUKICB3YXMgYWNjaWRlbnRhbGx5ICNkZWZpbmVkIGluIGNvbmZpZy13aW4zMi5oLCB3aGljaCBpdCBzaG91bGRuJ3QgaGF2ZSBiZWVuLgogIFRoZSBIQVZFX1VOSVNURF9IIGlzIG5vdCBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIHdpdGggdGhlIE1ha2VmaWxlLnZjNgogIG1ha2VmaWxlIGZvciBNUyBWQysrLgoKRGFuaWVsICgyMSBNYXJjaCAyMDAwKToKLSBJIHJlbW92ZWQgdGhlIEFDX1BST0dfSU5TVEFMTCBtYWNybyBmcm9tIGNvbmZpZ3VyZS5pbiwgc2luY2UgaXQgYXBwZWFycyB0aGF0CiAgb25lIG9mIHRoZSBBTV8qIG1hY3JvcyBzZWFyY2hlcyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIGFscmVhZHkuIEphbm5lCiAgSm9oYW5zc29uIG1hZGUgbWUgYXdhcmUgb2YgdGhpcy4KClZlcnNpb24gNi41LjIKCkRhbmllbCAoMjEgTWFyY2ggMjAwMCk6Ci0gUGF1bCBIYXJyaW5ndG9uIHF1aWNrbHkgcG9pbnRlZCBvdXQgdG8gbWUgdGhhdCA2LjUuMQogIGNyYXNoZXMgaGFyZC4gSSB1cGxvYWQgNi41LjIgbm93IGFzIHF1aWNrbHkgYXMgcG9zc2libGUhIFRoZSBwcm9ibGVtIHdhcwogIHRoZSAtRCBhZGp1c3RtZW50cyBpbiBzcmMvbWFpbi5jLgoKVmVyc2lvbiA2LjUuMQoKRGFuaWVsICgyMCBNYXJjaCAyMDAwKToKLSBBbiBhbm9ueW1vdXMgcG9zdCBvbiBzb3VyY2Vmb3JnZSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgYSBwb3NzaWJsZSBidWZmZXIKICBvdmVyZmxvdyBpbiB0aGUgY3VybF91bmVzY2FwZSgpIGZ1bmN0aW9uIGZvciBVUkwgY29udmVyc2lvbnMuIFRoZSBtYWluCiAgcHJvYmxlbSB3aXRoIHRoaXMgYnVnIGlzIHRoYXQgdGhlIGZ0cCBkb3dubG9hZCB1c2VzIHRoYXQgZnVuY3Rpb24gYW5kIHRoaXMKICBzaW5nbGUtIGJ5dGUgb3ZlcmZsb3cgY291bGQgbGVhZCB0byB2ZXJ5IG9kZCBidWdzIChhcyBvbmUgcmVwb3J0ZWQgYnkgSmFubmUKICBKb2hhbnNzb24pLgoKRGFuaWVsICgxOSBNYXJjaCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBzdXBwbGllZCBtZSB3aXRoIGEgc2VyaWVzIG9mIHBhdGNoZXMKICB0aGF0IG5vdyBhbGxvd3MgY3VybCB0byBnZXQgY29tcGlsZWQgb24gT1MvMi4gSXQgZXZlbiBpbmNsdWRlcyBhIHNlY3Rpb24gaW4KICB0aGUgSU5TVEFMTCBmaWxlLiBWZXJ5IG5pY2Ugam9iIQoKRGFuaWVsICgxNyBNYXJjaCAyMDAwKToKLSBXaGFtIEJhbmcgc3VwcGxpZWQgYSBwYXRjaCBmb3IgdGhlIGxpYi9NYWtlZmlsZS52YzYKICBmaWxlLiBXZSBzdGlsbCBuZWVkIHNvbWUgZml4ZXMgZm9yIHRoZSBjb25maWctd2luMzIuaCBzaW5jZSBpdCBhcHBlYXJzIHRoYXQKICBWQysrIGFuZCBtaW5ndzMyIGhhdmUgZGlmZmVyZW50IG9waW5pb25zIGFib3V0IChhdCBsZWFzdCkgdW5pc3RkLmgncwogIGV4aXN0ZW5jZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwMCk6Ci0gSSBtb2RpZmllZCB0aGUgLUQvLS1kdW1wLWhlYWRlciB3b3JraW5ncyBzbyB0aGF0IGl0IGRvZXNuJ3Qgd3JpdGUgYW55dGhpbmcKICB0byB0aGUgZmlsZSB1bnRpbCBpdCBuZWVkcyB0by4gVGhpcyB3YXksIHlvdSBjYW4gYWN0dWFsbHkgdXNlIC1iIGFuZCAtRAogIG9uIHRoZSBzYW1lIGZpbGUgaWYgeW91IHdhbnQgcmVwZWF0ZWQgaW52b2tlcyB0byBzdG9yZSBhbmQgcmVhZCB0aGUgY29va2llcwogIGluIHRoYXQgb25lIHNpbmdsZSBmaWxlLgoKLSBQb2tlZCBhcm91bmQgaW4gbG90cyBvZiB0ZXh0cy4gQWRkZWQgdGhlIEJVR1MgZmlsZSBmb3IgYnVnIHJlcG9ydGluZyBzdHVmZi4KICBBZGRlZCB0aGUgY2xhc3NpYyBIVFRQIFBPU1QgcXVlc3Rpb24gdG8gdGhlIEZBUSwgcmVtb3ZlZCBzb21lICNpZmRlZiBXSU4zMgogIHN0dWZmIGZyb20gdGhlIHNvdXJjZXMgKHRoZXkncmUgY292ZXJlZCBieSB0aGUgY29uZmlnLXdpbjMyLmggbm93KS4KCi0gUGFzY2FsIEdhdWRldHRlIGZpeGVkIGEgbWlzc2luZyBsZGFwLmMgcHJvYmxlbSBpbiB0aGUKICBNYWtlZmlsZS52YzYgZmlsZS4gSGUgYWxzbyBhZGRyZXNzZWQgYSBwcm9ibGVtIGluIHNyYy9jb25maWctd2luMzIuaC4KCkRhbmllbCAoMTQgTWFyY2ggMjAwMCk6Ci0gUGF1bCBIYXJyaW5ndG9uIHBvaW50ZWQgb3V0IHRoYXQgdGhlICdodHRwX2NvZGUnIHZhcmlhYmxlIGluIHRoZSAtdyBvdXRwdXQKICB3YXMgbmV2ZXIgd3JpdHRlbi4gSSBmaXhlZCBpdCBub3cuCgotIEphbm5lIEpvaGFuc3NvbiByZXBvcnRlZCB0aGUgY29tcGxhaW50cyB0aGF0IE9wZW5CU0QgZG9lcwogIHdoZW4gZ2V0ZGF0ZS5jICNpbmNsdWRlcyBtYWxsb2MuaC4gSXQgY2xhaW1zIHN0ZGxpYi5oIHNob3VsZCBiZSBpbmNsdWRlZAogIGluc3RlYWQuIEkgYWRkZWQgI2lmZGVmIEhBVkVfTUFMTE9DX0ggY29kZSBpbiBnZXRkYXRlLnkgYW5kIHR3byBjaGVja3MgaW4KICB0aGUgY29uZmlndXJlLmluIGZvciBtYWxsb2MuaCBhbmQgc3RkbGliLmguCgpWZXJzaW9uIDYuNQoKRGFuaWVsICgxMyBNYXJjaCAyMDAwKToKLSA8Y3VybCBhdCBzcGFtLndvbHZlc2JhbmUubmV0PiBwb2ludGVkIG91dCB0aGF0IHRoZSB3YXkgY3VybCBzZW50IGNvb2tpZXMgaW4gYQogIHNpbmdsZSBsaW5lIHdhc24ndCBlbmpveWVkIGJ5IElJUzQuMCBzZXJ2ZXJzLiBJbiBteSB2aWV3LCB0aGF0IGlzIG5vdCB3aGF0CiAgdGhlIHN0YW5kYXJkcyBzYXksIGJ1dCBJIGFkZGVkIGEgd2hpdGUgc3BhY2UgYmV0d2VlbiB0aGUgbmFtZS92YWx1ZSBwYWlycyB0bwogIHBlcmhhcHMgbWFrZSB0aGVtIHdvcmsgYmV0dGVyLgoKLSBBZGRlZCB0aGUgcGVybCBjaGVjayBiYWNrIGluIHRoZSBjb25maWd1cmUuaW4gYWdhaW4gc2luY2UgdGhlIG1raGVscC5wbAogIHNjcmlwdCBuZWVkcyBpdCEKCi0gTWFkZSBzb21lIGJlYXV0aWZpY2F0aW9ucyBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCkRhbmllbCAoMyBNYXJjaCAyMDAwKToKLSBK9nJuIGhlbHBlZCBtZSB1cGRhdGUgdGhlIGNvbmZpZy13aW4zMi5oIGZpbGVzIHdpdGggSEFWRV9TRVRWQlVGIGFuZAogIEhBVkVfU1RSRFVQLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIFVwbG9hZGVkIHRoZSA2LjVwcmUyIHBhY2thZ2UuCgpEYW5pZWwgKDIgTWFyY2ggMjAwMCk6Ci0gUmVtb3ZlZCB0aGUgcGVybC1wcm9ncmFtcyBmcm9tIHRoZSBkaXN0cmlidXRpb24sIHRoZXkgbmV2ZXIgbWFkZSBtYW55IHBlb3BsZQogIGhhcHB5IGFuZCBJJ2xsIHN0aWxsIGtlZXAgdGhlbSBhdmFpbGFibGUgb24gdGhlIHdlYi4KCi0gQWRkZWQgdGhlIC13IGFuZCAtTiBzdHVmZiB0byB0aGUgbWFuIHBhZ2UuIERvY3VtZW50ZWQgdGhlIG5ldyBwcm9ncmVzcyBtZXRlcgogIGRpc3BsYXkgaW4gUkVBRE1FLmN1cmwuCgotIEr2cm4gSGFydHJvdGgsIENocmlzIDxjYmF5bGlzcyBhdCBjc2MuY29tZT4gYW5kIFVsZgogIE32bGxlciBmcm9tIHRoZSBvcGVuc3NsIGRldmVsb3BtZW50IHRlYW0gaGVscGVkIGJyaW5naW5nIG1lIHRoZSBkZXRhaWxzIGZvcgogIGZpeGluZyBhbiBPcGVuU1NMIHVzYWdlIGZsYXcuIEl0IGJlY2FtZSBhcHBhcmVudCB3aGVuIHRoZXkgcmVsZWFzZWQgb3BlbnNzbAogIDAuOS41IHNpbmNlIHRoYXQgYmFyZmVkIG9uIGN1cmwncyBiYWQgYmVoYXZpb3IgKG5vdCBzZWVkaW5nIGEgcmFuZG9tIG51bWJlcgogIHRoaW5nKS4KCi0gWWV0IGFub3RoZXIgb3B0aW9uOiAtTi8tLW5vLWJ1ZmZlciBkaXNhYmxlcyBidWZmZXJpbmcgaW4gdGhlIG91dHB1dCBzdHJlYW0uCiAgUHJvYmFibHkgbW9zdCB1c2VmdWwgZm9yIHZlcnkgc2xvdyB0cmFuc2ZlcnMgd2hlbiB5b3UgcmVhbGx5IHdhbnQgdG8gZ2V0CiAgZXZlcnkgYnl0ZSBjdXJsIHJlY2VpdmVzIHdpdGhpbiBzb21lIHByZWZlcnJlZCB0aW1lLiBBbmRyZXcgPHRtciBhdCBnY2kubmV0PgogIHN1Z2dlc3RlZCB0aGlzLgoKLSBEYW1pZW4gQWRhbnQgbWFpbGVkIG1lIGhpcyBmaXhlcyBmb3IgbWFraW5nIGN1cmwgY29tcGlsZSBvbiBVbHRyaXguCgpEYW5pZWwgKDI0IEZlYnJ1YXJ5IDIwMDApOgotIEFwcGxpZWQgSvZybiBIYXJ0cm90aCdzIGZpeGVzIGZvciBjb25maWctd2luMzIuaCBhbmQgbGliL01ha2VmaWxlLnczMi4KCiAgSSBzaG91bGQgYWxzbyBtYWtlIGEgbm90ZSBoZXJlLCBpZiBub3RoaW5nIGVsc2UgdG8gbXlzZWxmLCB0aGF0IHdoZW4gdXNpbmcKICB0aGUgJS1zeW50YXggZm9yIHZhcmlhYmxlcyBpbiBET1MgY29tbWFuZCBwcm9tcHRzLCB5b3UgbXVzdCB1c2UgdHdvICUtCiAgbGV0dGVycyBmb3IgZWFjaCBvbmUgc2luY2UgdGhhdCBpcyBhbiBlc2NhcGUgbGV0dGVyIHRoZXJlISBNYXliZSBJIHNob3VsZAogIHVzZSBhbm90aGVyIGxldHRlciBpbnN0ZWFkIQoKLSBBZGRlZCBtb3JlIHZhcmlhYmxlcyB0byAtdzoKCiAgJ2h0dHBfY29kZScKICAndGltZV9uYW1lbG9va3VwJwogICd0aW1lX2Nvbm5lY3QnCiAgJ3RpbWVfcHJldHJhbnNmZXInCiAgJ3VybF9lZmZlY3RpdmUnCgotIE1hZGUgLXdAZmlsZW5hbWUgcmVhZCB0aGUgc3ludGF4IGZyb20gYSBmaWxlIGFuZCAtd0AtIHJlYWRzIHRoZSBzeW50YXggZnJvbQogIHN0ZGluIGluIHRoZSBnb29kIG9sZCAic3RhbmRhcmQiIGN1cmwgd2F5LgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDAwKToKLSBSZWxlYXNlZCBhIDYuNXByZTEgdmVyc2lvbiB0byBnZXQgc29tZSB0ZXN0IGFuZCB1c2VyIGZlZWRiYWNrLgoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDAwKToKCi0gSSBhZGRlZCB0aGUgLXcvLS13cml0ZS1vdXQgZmxhZyBhbmQgc29tZSB2YXJpYWJsZXMgdG8gZ28gd2l0aCBpdC4gLXcgaXMgYQogIHNpbmdsZSBzdHJpbmcsIHdoYXRldmVyIHlvdSBlbnRlciB0aGVyZSB3aWxsIGJlIHdyaXR0ZW4gb3V0IHdoZW4gY3VybCBoYXMKICBjb21wbGV0ZWQgYSBzdWNjZXNzZnVsIHJlcXVlc3QuIFRoZXJlIGFyZSBzb21lIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMgYW5kCiAgdGhleSBhcmUgc3BlY2lmaWVkIGFzICcle3ZhcmlhYmxlfScgKHdpdGhvdXQgdGhlIHF1b3RlcykuIFZhcmlhYmxlcyB0aGF0CiAgZXhpc3QgYXMgb2YgdGhpcyBtb21lbnQgYXJlOgoKICAgICAgICB0b3RhbF90aW1lICAgICAtIHRvdGFsIHRyYW5zZmVyIHRpbWUgaW4gc2Vjb25kcyAod2l0aCAyIGRlY2ltYWxzKQogICAgICAgIHNpemVfZG93bmxvYWQgIC0gdG90YWwgZG93bmxvYWRlZCBhbW91bnQgb2YgYnl0ZXMKICAgICAgICBzaXplX3VwbG9hZCAgICAtIHRvdGFsIHVwbG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNwZWVkX2Rvd25sb2FkIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSBkb3dubG9hZAogICAgICAgIHNwZWVkX3VwbG9hZCAgIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSB1cGxvYWQKCiAgSSB3aWxsIG9mIGNvdXJzZSBhZGQgbW9yZSB2YXJpYWJsZXMsIGJ1dCBJIG5lZWQgaW5wdXQgb24gdGhlc2UgYW5kIG90aGVycy4KCi0gSXQgc3RydWNrIG1lIHRoYXQgdGhlIC0jIHByb2dyZXNzIGJhciB3aWxsIGJlIGhhcmQgdG8ganVzdCBhcHBseSBvbiB0aGUgbmV3CiAgcHJvZ3Jlc3MgYmFyIGNvbmNlcHQuIEkgbmVlZCBzb21lIGZlZWRiYWNrIG9uIHRoaXMgYmVmb3JlIHRoYXQnbGwgZ2V0IHJlLQogIGludHJvZHVjZWQhIDotLwoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDAwKToKLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgc29tZSBmaXhlcyBmb3IgdGhlIHByb2dyZXNzIG1ldGVyIGFuZCBJIGNvbnRpbnVlZAogIHdvcmtpbmcgb24gaXQuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIGh0dHAgZG93bmxvYWQsIGh0dHAgcG9zdCwgZnRwIGRvd25sb2FkCiAgYW5kIGZ0cCB1cGxvYWQuIEl0IHNob3VsZCBiZSBhIHByZXR0eSBnb29kIHRlc3QgaXQgd29ya3MgZ2VuZXJhbGx5IGdvb2QuCgotIFN0aWxsIG5lZWQgdG8gYWRkIHRoZSAtIyBwcm9ncmVzcyBiYXIgaW50byB0aGUgbmV3IHN0eWxlIHByb2dyZXNzIGludGVyZmFjZS4KCi0gR29ubmEgaGF2ZSBhIGdvIGF0IG15IG5ldyBvdXRwdXQgb3B0aW9uIHBhcmFtZXRlciBuZXh0LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAwKToKLSBUaGUgcHJvZ3Jlc3MgbWV0ZXIgc3R1ZmYgaXMgc2xvd2x5IHRha2luZyBwbGFjZS4gVGhlcmUncyBtb3JlIGxlZnQgYmVmb3JlIGl0CiAgaXMgd29ya2luZyBvayBhbmQgZXZlcnl0aGluZyBpcyB0ZXN0ZWQsIGJ1dCB3ZSdyZSByZWFjaGluZyB0aGVyZS4gU2xvd2x5IQoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDAwKToKLSBQYXVsIE1hcnF1aXMgZml4ZWQgdGhlIGNvbmZpZyBmaWxlIHBhcnNpbmcgb2YgY3VybCB0bwogIGRlYWwgd2l0aCBhbnktbGVuZ3RoIGxpbmVzLCByZW1vdmluZyB0aGUgcHJldmlvdXMgbGltaXQgb2YgNEsuCgotIEVldHUgT2phbmVuJ3Mgc3VnZ2VzdGlvbiBvZiBzdXBwb3J0aW5nIHRoZSBALXN0eWxlIGZvciAtYgogIGlzIGltcGxlbWVudGVkLiBOb3cgLWJAPGZpbGVuYW1lPiB3b3JrcyBhcyB3ZWxsIGFzIHRoZSBvbGQgc3R5bGUuIC1iQC0gYWxzbwogIHNpbWlsYXJseSByZWFkcyB0aGUgY29va2llcyBmcm9tIHN0ZGluLgoKLSBSZW1pbmRlcjogLUQgc2hvdWxkIG5vdCB3cml0ZSB0byB0aGUgZmlsZSB1bnRpbCBpdCBuZWVkcyB0bywgaW4gdGhlIHNhbWUgd2F5CiAgLW8gZG9lcy4gVGhhdCB3b3VsZCBlbmFibGUgY3VybCB0byB1c2UgLWIgYW5kIC1EIG9uIHRoZSBzYW1lIGZpbGUuLi4KCi0gRWxsaXMgUHJpdGNoYXJkIG1hZGUgZ2V0ZGF0ZS55IHdvcmsgZm9yIE1hY09TIFguCgotIFBhdWwgSGFycmluZ3RvbiBoZWxwZWQgbWUgb3V0IGZpbmRpbmcgdGhlIGNyYXNoIGluIHRoZQogIGNvb2tpZSBwYXJzZXIuIEhlIGFsc28gcG9pbnRlZCBvdXQgY3VybCdzIGhhYml0IG9mIHNlbmRpbmcgZW1wdHkgY29va2llcyB0bwogIHRoZSBzZXJ2ZXIuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMCk6CiAtIFJvbiBaYXBwIGNvcnJlY3RlZCBhIHByb2JsZW0gaW4gc3JjL3VybGdsb2IuYyB0aGF0CiAgIHByZXZlbnRlZCBjdXJsIGZyb20gZ2V0dGluZyBjb21waWxlZCBvbiBzdW5vcyA0LiBUaGUgcHJvYmxlbSBoYWQgdG8gZG8KICAgd2l0aCB0aGUgZGlmZmVyZW5jZSBpbiBzcHJpbnRmKCkgcmV0dXJuIGNvZGUgdHlwZXMuCgogLSBUcmFuc2ZlcigpIHNob3VsZCBub3cgYmUgYWJsZSB0byBkb3dubG9hZCBhbmQgdXBsb2FkIHNpbXVsdGFuZW91c2x5LiBMZXQncwogICBkbyBzb21lIHByb2dyZXNzIG1ldGVyIGZpeGVzIGxhdGVyIHRoaXMgd2Vlay4KCkRhbmllbCAoMzEgSmFudWFyeSAyMDAwKToKIC0gUGF1bCBIYXJyaW5ndG9uIGZvdW5kIGFub3RoZXIgY29yZSBkdW1wIGluIHRoZSBjb29raWUKICAgcGFyc2VyLiBDdXJsIGRvZXNuJ3QgcHJvcGVybHkgcmVjb2duaXplIHRoZSAndmVyc2lvbicga2V5d29yZCBhbmQgSSB0aGluawogICB0aGF0IGlzIHdoYXQgY2F1c2VkIHRoaXMuIEkgbmVlZCB0byByZWZyZXNoIHNvbWUgc3BlY3Mgb24gY29va2llcyBhbmQgc2VlCiAgIHdoYXQgZWxzZSBjdXJsIGxhY2tzIHRvIGltcHJvdmUgdGhpcyBhIGJpdCBtb3JlIG9uY2UgYW5kIGZvciBhbGwuCgogICBSRkMgMjEwOSBjbGVhcmx5IHNwZWNpZmllcyBob3cgY29va2llcyBzaG91bGQgYmUgZGVhbHQgd2l0aCB3aGVuIHRoZXkgYXJlCiAgIGNvbXBsaWFudCB3aXRoIHRoYXQgc3BlYy4gSSBkb24ndCB0aGluayBtYW55IHNlcnZlcnMgYXJlIHRob3VnaC4uLgoKIC0gTWFyayBXLiBFaWNoaW4gZm91bmQgdGhhdCB3aGlsZSBjdXJsIGlzIHVwbG9hZGluZyBhIGZvcm0KICAgdG8gYSB3ZWIgc2l0ZSwgaXQgZG9lc24ndCByZWFkIGluY29taW5nIGRhdGEgd2h5IGl0J2xsIGhhbmcgYWZ0ZXIgYSB3aGlsZQogICBzaW5jZSB0aGUgc29ja2V0ICJwaXBlIiBiZWNvbWVzIGZ1bGwuCgogICBJdCB0b29rIG1lIHR3byBob3VycyB0byByZXdyaXRlIERvd25sb2FkKCkgYW5kIFVwbG9hZCgpIGludG8gdGhlIG5ldwogICBzaW5nbGUgZnVuY3Rpb24gVHJhbnNmZXIoKS4gSXQgZXZlbiBzZWVtcyB0byB3b3JrISBNb3JlIHRlc3RpbmcgaXMgcmVxdWlyZWQKICAgb2YgY291cnNlLi4uIEkgc2hvdWxkIGdldCB0aGUgaGVhZGVyLXNlbmRpbmcgdG9nZXRoZXIgaW4gYSBraW5kIG9mIHF1ZXVlCiAgIGFuZCBsZXQgdGhlbSBnZXQgInVwbG9hZGVkIiBpbiBUcmFuc2ZlcigpIGFzIHdlbGwuCgogLSBaaGliaWFvIFd1IHBvaW50ZWQgb3V0IGEgY3VybCBidWcgaW4gdGhlIGxvY2F0aW9uOiBhcmVhLAogICBhbHRob3VnaCBJIGRpZCBub3QgZ2V0IGEgcmVwcm9kdWNpYmxlIHdheSB0byBkbyB0aGlzIHdoeSBJIGhhdmUgdG8gd2FpdAogICB3aXRoIGZpeGluZyBhbnl0aGluZy4KCiAtIEJvYiBTY2hhZGVyIHN1Z2dlc3RlZCBJIHNob3VsZCBpbXBsZW1lbnQgcmVzdW1lCiAgIHN1cHBvcnQgZm9yIHRoZSBIVFRQIFBVVCBvcGVyYXRpb24sIGFuZCBhcyBJIHRoaW5rIGl0IGlzIGEgdmFsaWQgc3VnZ2VzdGlvbgogICBJJ2xsIHdvcmsgb24gaXQuCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwMCk6CiAtIE0gVHJhdmlzIE9iZW5oYXVzIHBvaW50ZWQgb3V0IGEgbWFudWFsIG1peHVwIHdpdGggLXkgYW5kIC1ZIHRoYXQgd2FzCiAgIGNvcnJlY3RlZC4KCiAtIEplbnMgU2NobGV1c2VuZXIgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHRvIGNvbXBpbGUKICAgY3VybCBvbiBBSVggNC4xLjQgYW5kIGdhdmUgbWUgYSBzb2x1dGlvbi4gVGhpcyBwcm9ibGVtIHdhcyBhbHJlYWR5IGZpeGVkCiAgIGJ5IEr2cm4ncyByZWNlbnQgI2luY2x1ZGUgbW9kaWZpY2F0aW9ucyEKCkRhbmllbCAoMTkgSmFudWFyeSAyMDAwKToKIC0gT3NrYXIgTGlsamVibGFkIHBvaW50ZWQgb3V0IGFuZCBjb3JyZWN0ZWQgYSBwcm9ibGVtCiAgIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIHN5c3RlbSB0aGF0IG1hZGUgY3VybCBmb2xsb3dpbmcgYSBsb2NhdGlvbjogdG8gYQogICBkaWZmZXJlbnQgcHJvdG9jb2wgdG8gZmFpbC4KCiAgIEF0IEphbnVhcnkgMzFzdCBJIHJlLWNvbnNpZGVyZWQgdGhpcyBmaXggYW5kIHRoZSBzdXJyb3VuZGluZyBzb3VyY2UgY29kZS4gSQogICBjb3VsZCBub3QgcmVhbGx5IHNlZSB0aGF0IHRoZSBwYXRjaCBkaWQgYW55IGRpZmZlcmVuY2UsIHdoeSBJIHJlbW92ZWQgaXQKICAgYWdhaW4gZm9yIGZ1cnRoZXIgcmVzZWFyY2ggYW5kIGRlYnVnZ2luZy4gKEl0IGRpc2FibGVkIGxvY2F0aW9uOiBmb2xsb3dpbmcKICAgb24gc2VydmVyIG5vdCBydW5uaW5nIG9uIGRlZmF1bHQgcG9ydHMuKQoKIC0gSvZybiBIYXJ0cm90aCBicm91Z2h0IGEgZml4IHRoYXQgb25jZSBhZ2FpbgogICBtYWRlIGl0IHBvc3NpYmxlIHRvIHNlbGVjdCBwcm9ncmVzcyBiYXIuCgogLSBK9nJuIGFsc28gZml4ZWQgYSBmZXcgaW5jbHVkZSBwcm9ibGVtcy4KClZlcnNpb24gNi40CgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMCk6CiAtIEJhc2VkIG9uIHN1Z2dlc3Rpb25zIGZyb20gQmr2cm4gU3RlbmJlcmcsIEkgbWFkZSB0aGUKICAgcHJvZ3Jlc3MgZGVhbCBiZXR0ZXIgd2l0aCBsYXJnZXIgZmlsZXMgYW5kIGFkZGVkIGEgIlRpbWUiIGZpZWxkIHdoaWNoIHNob3dzCiAgIHRoZSB0aW1lIHNwZW50IG9uIHRoZSBkb3dubG9hZCBzbyBmYXIuCiAtIEknbSBub3cgdXNpbmcgdGhlIENWUyByZXBvc2l0b3J5IG9uIHNvdXJjZWZvcmdlLm5ldCwgd2hpY2ggYWxzbyBhbGxvd3Mgd2ViCiAgIGJyb3dzaW5nLiBTZWUgaHR0cDovL2N1cmwuaGF4eC5udS4KCkRhbmllbCAoMTAgSmFudWFyeSAyMDAwKToKIC0gUmVudW1iZXJlZCBzb21lIGVudW1zIGluIGN1cmwvY3VybC5oIHNpbmNlIHRhZyBudW1iZXIgMzUgd2FzIHVzZWQgdHdpY2UhCiAtIEFkZGVkICJwb3N0cXVvdGUiIHN1cHBvcnQgdG8gdGhlIGZ0cCBzZWN0aW9uIHRoYXQgZW5hYmxlcyBwb3N0LWZ0cC10cmFuc2ZlcgogICBxdW90ZSBjb21tYW5kcy4KIC0gTm93IG1hZGUgdGhlIC1RLy0tcXVvdGUgcGFyYW1ldGVyIHJlY29nbml6ZSAnLScgYXMgYSBwcmVmaXgsIHdoaWNoIG1lYW5zCiAgIHRoYXQgY29tbWFuZCB3aWxsIGJlIGlzc3VlZCBBRlRFUiBhIHN1Y2Nlc3NmdWwgZnRwIHRyYW5zZmVyLiBUaGlzIGNhbiBvZgogICBjb3Vyc2UgYmUgdXNlZCB0byBkZWxldGUgb3IgcmVuYW1lIGEgZmlsZSBhZnRlciBpdCBoYXMgYmVlbiB1cGxvYWRlZCBvcgogICBkb3dubG9hZGVkLiBVc2UgeW91ciBpbWFnaW5hdGlvbiEgOy0pCiAtIFNpbmNlIEkgZG8gdGhlIG1haW4gZGV2ZWxvcG1lbnQgb24gc29sYXJpcyAyLjYgbm93LCBJIGhhZCB0byBkb3dubG9hZCBhbmQKICAgaW5zdGFsbCBHTlUgZ3JvZmYgdG8gZ2VuZXJhdGUgdGhlIGh1Z2VoZWxwLmMgZmlsZS4gVGhlIHNvbGFyaXMgbnJvZmYgY29yZXMKICAgb24gdGhlIG1hbiBwYWdlISBTbywgaW4gb3JkZXIgdG8gbWFrZSB0aGUgc29sYXJpcyBjb25maWd1cmUgc2NyaXB0IGZpbmQgYQogICBiZXR0ZXIgcmVzdWx0IEkgbWFkZSBnbnJvZmYgZ2V0IGNoZWNrZWQgcHJpb3IgdG8gdGhlIHJlZ3VsYXIgbnJvZmYuCiAtIEFkZGVkIGFsbCB0aGUgY3VybCBleGl0IGNvZGVzIHRvIHRoZSBtYW4gcGFnZS4KIC0gSmltIEdhbGxhZ2hlciBwcm9wZXJseSB0cmFja2VkIGRvd24gYSBidWcgaW4gYXV0b2NvbmYKICAgMi4xMy4gVGhlIEFDX0NIRUNLX0xJQigpIG1hY3JvIHdyb25nZnVsbHkgdXNlcyB0aGUgLWwgZmxhZyBiZWZvcmUgdGhlIC1MCiAgIGZsYWcgdG8gJ2xkJyB3aGljaCBjYXVzZXMgdGhlIEhQLVVYIDEwLjIwIGZsYXZvdXIgdG8gZmFpbCBvbiBhbGwgbGliY2hlY2tzCiAgIGFuZCB0aGVyZWZvcmUgeW91IGNhbid0IG1ha2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCB0aGUgb3BlbnNzbCBsaWJzIQoK