ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpWZXJzaW9uIDcuOS4yCgpEYW5pZWwgKDUgRGVjZW1iZXIgMjAwMSkKLSBKb24gVHJhdmlzIGZvdW5kIG91dCB0aGF0IGlmIHlvdSB1c2VkIGxpYmN1cmwgYW5kIENVUkxPUFRfVVBMT0FEIGFuZCB0aGVuCiAgb24gdGhlIHNhbWUgaGFuZGxlIHVzZWQgQ1VSTE9QVF9IVFRQR0VUIGl0IHdvdWxkIHN0aWxsIGF0dGVtcHQgdG8gdXBsb2FkLgogIEhpcyBzdWdnZXN0ZWQgZml4IHdhcyBwZXJmZWN0LgoKRGFuaWVsICg0IERlY2VtYmVyIDIwMDEpCi0gSW5jb3Jwb3JhdGVkIG1vcmUgbWFjb3MgZml4ZXMgYW5kIGFkZGVkIGZvdXIgc3BlY2lmaWMgZmlsZXMgaW4gYSBuZXcKICBzdWJkaXJlY3RvcnkgYmVsb3cgc3JjLgoKRGFuaWVsICgzIERlY2VtYmVyIDIwMDEpCi0gRXJpYyBMYXZpZ25lIHJlcG9ydGVkIHR3byBwcm9ibGVtczoKCiAgRmlyc3Qgb25lIGluIHRoZSBjdXJsX3N0cm5lcXVhbCgpIGZ1bmN0aW9uLiBJIHRoaW5rIHRoaXMgcHJvYmxlbSBpcyByYXRoZXIKICBtYWNvcyA5IHNwZWNpZmljLCBhcyBtb3N0IHBsYXRmb3JtIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gdXNlIGluc3RlYWQgb2YgdGhlCiAgb25lIHByb3ZpZGVkIGJ5IGxpYmN1cmwuCgogIEEgc2Vjb25kLCBtb3JlIGltcG9ydGFudCwgd2FzIGluIHRoZSB3YXkgd2UgdGFrZSBjYXJlIG9mIEZUUCByZXNwb25zZXMuIFRoZQogIGNvZGUgd291bGQgcmVhZCBhIGxhcmdlIGNodW5rIG9mIGRhdGEgYW5kIHNlYXJjaCBmb3IgdGhlIGVuZC1vZi1yZXNwb25zZQogIGxpbmUgd2l0aGluIHRoYXQgY2h1bmsuIFdoZW4gZm91bmQsIGl0IHdvdWxkIGp1c3Qgc2tpcCB0aGUgcmVzdCBvZiB0aGUKICBkYXRhLiBIb3dldmVyLCB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb25zIGFyZSBzcGVjaWFsLCBvciBwZXJoYXBzIHRoZQogIHNlcnZlciBpcywgd2UgY291bGQgYWN0dWFsbHkgZ2V0IG1vcmUgdGhhbiBvbmUgcmVzcG9uc2UgaW4gdGhhdCBjaHVuayBvZgogIGRhdGEgc28gdGhhdCB3aGVuIHRoZSBuZXh0IGludm9rZSB0byB0aGlzIGZ1bmN0aW9uIHdhcyBkb25lLCB0aGUgcmVzcG9uc2UKICBoYWQgYWxyZWFkeSBiZWVuIHJlYWQgYW5kIHRocm93biBhd2F5LiBOb3csIHdlIGNhY2hlIHRoZSBkYXRhIG5vdCB1c2VkIGluCiAgb25lIGNhbGwsIGFzIGl0IGNvdWxkIGJlIHVzZWZ1bCBpbiB0aGUgc3Vic2VxdWVudCBjYWxsLiBUZXN0IGNhc2UgMTI2IHdhcwogIGFkZGVkIGFuZCB0aGUgdGVzdCBmdHAgc2VydmVyIG1vZGlmaWVkLCB0byBleGVyY2lzZSB0aGlzIHBhcnRpY3VsYXIgY2FzZS4KClZlcnNpb24gNy45LjItcHJlOAoKRGFuaWVsICgyIERlY2VtYmVyIDIwMDEpCi0gQnVnIHJlcG9ydCAjNDg3ODI1IGNvcnJlY3RseSBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aGVuIHVzaW5nIGEgcHJveHkgYW5kCiAgZm9sbG93aW5nIGEgcmVkaXJlY3Rpb24gZnJvbSBIVFRQIHRvIEhUVFBTLiBsaWJjdXJsIHRoZW4gcmUtdXNlZCB0aGUgc2FtZQogIHByb3h5IGNvbm5lY3Rpb24gYnV0IHdpdGhvdXQgZG9pbmcgYSBwcm9wZXIgSFRUUFMgcmVxdWVzdC4KCi0gRml4ZWQgd2luMzIgY29tcGlsaW5nIHF1aXJrcy4KClZlcnNpb24gNy45LjItcHJlNwoKRGFuaWVsICgzMCBOb3ZlbWJlciAyMDAxKQotIERvY3VtZW50ZWQgLS1kaXNhYmxlLWVwc3YgYW5kIENVUkxPUFRfRlRQX1VTRV9FUFNWLgoKRGFuaWVsICgyOSBOb3ZlbWJlciAyMDAxKQotIEFkZGVkIC0tZGlzYWJsZS1lcHN2IGFzIGFuIG9wdGlvbi4gV2hlbiB1c2VkLCBjdXJsIHdvbid0IGF0dGVtcHQgdG8gdXNlIHRoZQogIEVQU1YgY29tbWFuZCB3aGVuIGRvaW5nIHBhc3NpdmUgRlRQIGRvd25sb2Fkcy4gV3JvdGUgYSB0ZXN0IGNhc2UgZm9yIGl0LgoKLSBFcmljIHByb3ZpZGVkIGEgZmV3IG1vcmUgZml4ZXMgZm9yIGJ1aWxkaW5nIG9uIE1hY3MuIEhlIGFsc28gcG9pbnRlZCBvdXQKICBhIGZsYXcgaW4gdGhlIHNpZ25hbCBoYW5kbGVyIHJlc3RvcmF0aW9uIGNvZGUuCgpEYW5pZWwgKDI4IE5vdmVtYmVyIDIwMDEpCi0gRmlkZGxlZCB3aXRoIHNvbWUgVHJ1NjQgcHJvYmxlbXMgcmVwb3J0ZWQgYnkgRGltaXRyaXMgU2FycmlzLiBUaGV5IGFwcGVhcmVkCiAgb25seSB3aGVuIHVzaW5nIFZFUkJPU0UgZnRwIHRyYW5zZmVycy4gRG8gd2UgdXNlIGEgdG9vIHNtYWxsIGJ1ZmZlciBmb3IKICBnZXRob3N0YnlhZGRyX3IoKSwgd2FzIHRoZSBsYWNrIG9mIHVzaW5nIGluX2FkZHJfdCB3cm9uZyBvciBpcyBpdCB0aGF0IHRoZQogIGhvc3RlbnQgc3RydWN0IG11c3QgYmUgYmxhbmtlZCBiZWZvcmUgdXNlPyBXaXRoIERpbWl0cmlzIGhlbHAgYW5kIHRoZXNlCiAgcGF0Y2hlcywgdGhlIHByb2JsZW1zIHNlZW0gdG8gYmUgaGlzdG9yeS4KCi0gQ1VSTE9QVF9GVFBfVVNFX0VQU1Ygd2FzIGFkZGVkIGFuZCBjYW4gYmUgc2V0IHRvIEZBTFNFIHRvIHByZXZlbnQgbGliY3VybAogIGZyb20gdXNpbmcgdGhlIEVQU1YgY29tbWFuZCBiZWZvcmUgdHJ5aW5nIHRoZSBub3JtYWwgUEFTVi4gSGVpa2tpIEtvcnBlbGEKICBwb2ludGVkIG91dCB0aGF0IHNvbWUgZmlyZXdhbGxzIGFuZCBzaW1pbGFyIGRvbid0IGxpa2UgdGhlIEVQU1Ygc28gd2UgbXVzdAogIGJlIGFibGUgdG8gc2h1dCBpZiBvZmYgdG8gd29yayBldmVyeXdoZXJlLgoKLSBJIGFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGZvciAnaW5fYWRkcl90JyBhbmQgbWFkZSB0aGUgZnRwIGNvZGUgdXNlIHRoYXQgdG8KICByZWNlaXZlIHRoZSBpbmV0X2FkZHIoKSByZXR1cm4gY29kZSBpbi4gV29ya3Mgb24gU29sYXJpcyBhbmQgTGludXggYXQKICBsZWFzdC4gVGhlIExpbnV4IG1hbiBwYWdlIGZvciBpbmV0X2FkZHIoKSBkb2Vzbid0IGV2ZW4gbWVudGlvbiBpbl9hZGRyX3QuLi4KCi0gQWRqdXN0ZWQgKGFsbW9zdCkgYWxsIEZUUCB0ZXN0cyB0byB0aGUgbmV3IGNvbW1hbmQgc2VxdWVuY2UuCgotIEZUUCBjb21tYW5kIHNlcXVlbmNlIGNoYW5nZXM6CgogIEVQU1YgaXMgbm93IGFsd2F5cyBhdHRlbXB0ZWQgYmVmb3JlIFBBU1YuIEl0IGlzIHRoZSBmaW5hbCB0b3VjaCB0byBtYWtlIElQdjYKICBwYXNzaXZlIEZUUCBkb3dubG9hZHMgdG8gd29yaywgYnV0IEVQU1YgaXMgbm90IHJlc3RyaWN0ZWQgdG8gSVB2NiBidXQgd29ya3MKICBmaW5lIHdpdGggSVB2NCB0b28gb24gdGhlIHNlcnZlcnMgdGhhdCBzdXBwb3J0IGl0LgoKICBTSVpFIGlzIG5vdyBhbHdheXMgaXNzdWVkIGJlZm9yZSBSRVRSLiBJdCBtYWtlcyBjdXJsIGtub3cgdGhlIGFjdHVhbAogIGRvd25sb2FkIHNpemUgYmVmb3JlIHRoZSBkb3dubG9hZCB0YWtlcyBwbGFjZSwgYXMgaXQgbWFrZXMgaXQgbGVzcyBpbXBvcnRhbnQKICB0byBmaW5kIHRoZSBzaXplIHNlbnQgaW4gUkVUUiByZXNwb25zZXMuIE1hbnkgc2l0ZXMgZG9uJ3QgaW5jbHVkZSB0aGUgc2l6ZQogIGluIHRoZXJlLgoKICBCb3RoIHRoZXNlIGNoYW5nZXMgbWFkZSBpdCBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoZSB0ZXN0IHN1aXRlJ3MgZnRwIHNlcnZlcgogIGNvZGUsIGFuZCBhbGwgRlRQIHRlc3QgY2FzZXMgbmVlZCB0byBiZSBjaGVja2VkIGFuZCBhZGp1c3RlZCEKCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMSkKLSBIYW5zIFN0ZWVnZXJzIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHRlbG5ldCBjb2RlIHJlYWQgZnJvbSBzdGRvdXQsIG5vdCBzdGRpbgogIGFzIGl0IGlzIHN1cHBvc2VkIHRvIGRvIQoKVmVyc2lvbiA3LjkuMi1wcmU2CgpEYW5pZWwgKDI3IE5vdmVtYmVyIDIwMDEpCi0gRXJpYyBMYXZpZ25lJ3MgbWlub3IgY2hhbmdlcyB0byBidWlsZCBvbiBNYWNPUyBiZWZvcmUgT1MgWCB3ZXJlIGFwcGxpZWQuCgotIGdyZWVwIGF0IG1pbmRzcHJpbmcuY29tIHByb3ZpZGVkIGEgbWFpbiBpbmRleC5odG1sIHBhZ2UgZm9yIG91ciByZWxlYXNlCiAgYXJjaGl2ZSBkb2NzIGRpcmVjdG9yeS4gSXQganVzdCBsaW5rcyB0byBhbGwgdGhlIGV4aXN0aW5nIEhUTUwgZmlsZXMsIGJ1dAogIEkgdGhpbmsgaXQgbWF5IGNvbWUgdXNlZnVsIHRvIHBlb3BsZS4KCi0gVGhlcmUncyBub3cgc29tZSBpbml0aWFsIGNvZGUgdG8gc3VwcG9ydCB0aGUgRVBTViBGVFAgY29tbWFuZC4gVGhhdCBzaG91bGQKICBiZSB1c2VkIHRvIGRvIHBhc3NpdmUgdHJhbnNmZXJzIElQdjYtc3R5bGUuIFRoZSBjb2RlIGlzIHN0aWxsICNpZiAwJ2VkIGluCiAgbGliL2Z0cC5jIGFzIEkgaGF2ZSBubyBJUHY2IGZ0cCBzZXJ2ZXIgdG8gdGVzdCB0aGlzIHdpdGguCgpEYW5pZWwgKDI2IE5vdmVtYmVyIDIwMDEpCi0gUm9iZXJ0IFNjaGxhYmJhY2ggaGFkIHByb2JsZW1zIHRvIHVuZGVyc3RhbmQgaG93IHRvIGRvIHJlc3VtZWQgdHJhbnNmZXJzLAogIGFuZCBJIGNsYXJpZmllZCB0aGUgbWFuIHBhZ2UgLUMgc2VjdGlvbiBzb21ld2hhdC4KClZlcnNpb24gNy45LjItcHJlNQoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDAxKQotIEFuZHLpcyBHYXJj7WEgaGVscGVkIG1lIG91dCB0byB0cmFjayBkb3duIHRoZSByb290cyBvZiBidWcgcmVwb3J0ICM0Nzk1MzcsCiAgd2hpY2ggd2FzIGNvbmNlcm5pbmcgY3VybCByZXR1cm5pbmcgdGhlIHdyb25nIGVycm9yIGNvZGUgd2hlbiBmYWlsaW5nIHRvCiAgY29ubmVjdC4gVGhpcyBkaWRuJ3QgaGFwcGVuIG9uIGFsbCBzeXN0ZW1zLCBhbmQgbW9yZSBzcGVjaWZpY2x5IEkndmUgc28gZmFyCiAgb25seSBzZWVuIHRoaXMgaGFwcGVuIG9uIElQdjQtb25seSBMaW51eCBob3N0cy4KCi0gSSBhcHBsaWVkIHRoZSBmaXhlcyBmb3IgdGhlIHR3byBidWdzIEVyaWMgTGF2aWduZSBmb3VuZCB3aGVuIGRvaW5nIGhpcyBNYWNPUwogIHBvcnQuIEEgbWlzc2luZyBjb21tYSBpbiBhcnBhX3RlbG5ldC5oIGFuZCBhIHByZXR0eSB3aWxkIHdyaXRlIGluIHRoZSBGVFAKICByZXNwb25zZSByZWFkZXIgZnVuY3Rpb24uIFRoZSBsYXR0ZXIgd3JpdGUgaXMgaG93ZXZlciBsaWtlbHkgdG8gb2NjdXIgaW4gb3VyCiAgb3duIGJ1ZmZlciB1bmxlc3MgdmVyeSBiaWcgRlRQIHNlcnZlciByZXBsaWVzICg+MjVLKSBhcmUgcmVhZC4gSSd2ZSBuZXZlcgogIHNlZW4gc3VjaCBhIHJlcGx5IGV2ZXIsIHNvIEkgdGhpbmsgdGhpcyBpcyBhIHJlbGF0aXZlbHkgbWlub3Igcmlzay4KCkRhbmllbCAoMjEgTm92ZW1iZXIgMjAwMSkKLSBNb29uZXNhbXkgcHJvdmlkZWQgY29kZSB0byBwcmV2ZW50IGp1bmsgZnJvbSBiZWluZyBvdXRwdXQgd2hlbiBsaWJjdXJsCiAgcmV0dXJucyBhbiBlcnJvciBjb2RlIGJ1dCBubyBlcnJvciBkZXNjcmlwdGlvbiBhbmQgdGhhdCBjb3JyZWN0cyBob3cgbWFrZSBpcwogIHJ1biBpbiB0aGUgTWFrZWZpbGUuZGlzdCBmaWxlICh0aGF0IGFwcGVhcnMgYXMgcm9vdCBNYWtlZmlsZSBpbiByZWxlYXNlCiAgYXJjaGl2ZXMpLgoKLSBFcmljIExhdmlnbmUgbWFpbGVkIG1lIGJ1Z2ZpeGVzIGFuZCBwYXRjaGVzIGZvciBidWlsZGluZyBsaWJjdXJsIG9uIE1hY09TCiAgKG5vbi1YKS4KCi0gS2V2aW4gUm90aCBtb2RpZmllZCB0aGUgY3lnd2luIGZpbGVzIG9uY2UgYWdhaW4sIG5vdyB0byBidWlsZCBhZ2FpbnN0IHRoZQogIHNoYXJlZCBPcGVuU1NMIERMTHMuCgpWZXJzaW9uIDcuOS4yLXByZTQKCkRhbmllbCAoMjAgTm92ZW1iZXIgMjAwMSkKLSBHZW9yZyBIb3JuIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGludHJvZHVjZWQgQ1VSTElORk9fU1RBUlRUUkFOU0ZFUl9USU1FLAogIGNvbXBsZXRlIHdpdGggbWFuIHBhZ2UgdXBkYXRlcyEKCkRhbmllbCAoMTkgTm92ZW1iZXIgMjAwMSkKLSBNaWtsb3MgTmVtZXRoIHByb3ZpZGVkIGRldGFpbHMgZW5vdWdoIHRvIHVwZGF0ZSB0aGUgQm9ybGFuZCBtYWtlZmlsZQogIHByb3Blcmx5LgoKLSBMYXJzIE0gR3VzdGFmc3NvbiBmb3VuZCBhIGNhc2Ugd2l0aCBhIGJhZCBmcmVlKCkuIEluIGZhY3QsIGl0IHdhcyBzbyBiYWQgSSdtCiAgYW1hemVkIHdlIG5ldmVyIHNhdyB0aGlzIGJlZm9yZSEKCi0gS2V2aW4gUm90aCBwYXRjaGVkIHRoZSBjeWd3aW4gTWFrZmlsZS4KCkRhbmllbCAoMTYgTm92ZW1iZXIgMjAwMSkKLSBLbGV2dHNvdiBWYWRpbSBmaXhlZCBhIGJ1ZyBpbiBob3cgdGltZS1jb25kaXRpb25hbHMgd2VyZSBzZW50IHdoZW4gZG9pbmcKICBIVFRQLgoKVmVyc2lvbiA3LjkuMi1wcmUzCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDEpCi0gU2FtdWVsIExpc3RvcGFkIHBhdGNoZWQgYXdheSB0aGUgcHJvYmxlbSB3aXRoIFNTTCB3ZSBnb3Qgd2hlbiBzb21lb25lIGNhbGwKICBjdXJsX2dsb2JhbF9pbml0KCkgPT4gY3VybF9nbG9iYWxfY2xlYW51cCgpID0+IGN1cmxfZ2xvYmFsX2luaXQoKS4gVGhlCiAgc2Vjb25kIGluaXQgd291bGQgbm90ICJ0YWtlIiBhbmQgU1NMIHdvdWxkIGJlIHVudXNhYmxlIHdpdGggY3VybCBmcm9tIHRoYXQKICBwb2ludC4gVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgZmFjdCB0aGF0IGNhbGxpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHdheSBpcwogIHdyb25nLiBjdXJsX2dsb2JhbF9pbml0KCkgc2hvdWxkIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYW5kIG5vdCBtb3JlLgoKRGFuaWVsICgxMyBOb3ZlbWJlciAyMDAxKQotIEZpeGVkIHNvbWUgbWlub3IgdmFyaWFibGUgdHlwZSBtaXh1cHMgaW4gZnRwLmMgdGhhdCBjYXVzZWQgY29tcGlsZXIgd2FybmluZ3MKICBvbiBIUC1VWCAxMS4wMC4KCi0gVGhlIEZUUCBmaXggSSBkaWQgeWVzdGVyZGF5IHVzZWQgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSB0aGF0IGNhdXNlZAogIHNwdXJpb3VzIGVycm9ycyB3aGVuIGRvaW5nIEZUUC4KClZlcnNpb24gNy45LjItcHJlMgoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDAxKQotIFJpY2FyZG8gQ2FkaW1lIGZlbGwgb3ZlciBhIG11bHRpcGxlLXJlcXVlc3RzIHByb2JsZW0gd2hlbiBmaXJzdCBhIEZUUAogIGRpcmVjdG9yeSBmZXRjaCBmYWlsZWQgYW5kIHRoZW4gYSBzZWNvbmQgcmVxdWVzdCBpcyBtYWRlIGFmdGVyIHRoYXQuIFRoZQogIHNlY29uZCByZXF1ZXN0IGhhcHBlbmVkIHRvIGdldCB0aGUgRlRQIHNlcnZlciByZXNwb25zZSBiYWNrIGZyb20gdGhlCiAgcHJldmlvdXMgcmVxdWVzdCwgd2hlbiBpdCBkaWQgaXRzIGluaXRpYWwgQ1dEIGNvbW1hbmQuCgotIEJqb3JuIFJlZXNlIHBvaW50ZWQgb3V0IHRoYXQgd2UgY291bGQgaW1wcm92ZSB0aGUgdGltZSBkaWZmIGZ1bmN0aW9uIHRvCiAgcHJldmVudCB0cnVuY2F0aW9uIGEgYml0LgoKLSBLYWktVXdlIFJvbW1lbCBtYWRlIG1lIGF3YXJlIHRoYXQgLXAgKGh0dHAgcHJveHkgdHVubmVsKSBzaWxseSBlbm91Z2ggZGlkbid0CiAgd29yayBmb3IgcGxhaW4gSFRUUCByZXF1ZXN0cyEgU28gSSBtYWRlIHRoYXQgd29yay4KClZlcnNpb24gNy45LjItcHJlMQoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDAxKQotIFJld3JvdGUgdGhlIEN1cmxfQ29ubmVjdEhUVFBQcm94eVR1bm5lbCgpLiBJdCBzaG91bGQgbm93IG5vdCBvbmx5IHdvcmsgYSBsb3QKICBmYXN0ZXIsIGl0IHNob3VsZCBhbHNvIHN1cHBvcnQgc3VjaCAoImJyb2tlbiIpIHByb3hpZXMgdGhhdCBKb2huIExhc2sKICBwcmV2aW91c2x5IGhhdmUgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aC4gSGlzIHByb3h5IHNlbmRzIGEgdHJhaWxpbmcgemVybyBieXRlCiAgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgKHByb3h5LSkgaGVhZGVycy4gSSd2ZSB0ZXN0ZWQgdGhpcyBteXNlbGYgYW5kIGl0IHNlZW1zCiAgdG8gd29yayBvbiBhIHByb3h5IHRoZSBwcmV2aW91cyB2ZXJzaW9uIGFsc28gd29ya2VkIHdpdGguLi4hIFRoaXMgcmV3cml0ZSBpcwogIGR1ZSB0byB0aGUgcHJvYmxlbXMgSm9obiBMYXNrIHByZXZpb3VzbHkgZXhwZXJpZW5jZWQuCgotIEFuZHLpcyBHYXJj7WEgZm91bmQgb3V0IHdoeSB0aGUgImN1cnJlbnQgc3BlZWQiIG1ldGVyIHNvbWV0aW1lcyBzaG93ZWQgMjA0OEsKICBmb3IgdmVyeSBxdWljayB0cmFuc2ZlcnMuIEl0IHR1cm5lZCBvdXQgdGhlICJ0aW1lIGRpZmYiLWZ1bmN0aW9uIHJldHVybmVkIGEKICB6ZXJvIG1pbGxpc2Vjb25kIGRpZmYuIFdlIG5vdyBhbHdheXMgc2F5IGl0IGlzIGF0IGxlYXN0IG9uZSBtaWxsaXNlY29uZCEgSW4KICByZWFsaXR5LCB0aGVzZSB0aW1lcnMgdmVyeSByYXJlbHkgaGF2ZSB0aGF0IGdvb2QgcmVzb2x1dGlvbiBzbyBldmVuIHRob3VnaAogIHRoZSB0aW1lIGRpZmYgd2FzIGxvbmdlciB0aGFuIDEgbWlsbGlzZWNvbmQsIGl0IHdhcyByZXBvcnRlZCBhcyBubyBkaWZmLgoKLSBJIGFsc28gbW9kaWZpZWQgdGhlIGdldGluZm8oKSBhZ2FpbiB3aGVuIHJldHVybmluZyB0aW1lcywgYXMgUGF1bCBIYXJyaW5ndG9uCiAgcmVwb3J0cyB0aGF0IDcuOS4xIG9ubHkgcmV0dXJucyB0aW1lcyB3aXRoIDEgc2Vjb25kIGFjY3VyYWN5LCB3aGljaCBpbmRlZWQKICBpcyB3cm9uZy4KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDAxKQotIE1hcmN1cyBXZWJzdGVyIGZvdW5kIG91dCB0aGF0IGN1cmxfZm9ybWFkZCgpIGNvdWxkIHJlYWQgb25lIGJ5dGUgb3V0c2lkZSBhCiAgYnVmZmVyIGJvdW5kYXJ5LCB3aGljaCB0aGVuIG9mIGNvdXJzZSBjb3VsZCBsZWFkIHRvIGEgY3Jhc2guIE1hcmN1cyBhbHNvCiAgZ3JhY2VmdWxseSBwcm92aWRlZCBhIHBhdGNoIGZvciB0aGlzIHRoaXMuCgotIEdsZW4gU2NvdHQgcmFuIGNvbmZpZ3VyZSBvbiBoaXMgQ29iYWx0IFF1YmUgYW5kIGl0IGRpZG4ndCBmaWd1cmUgb3V0IHRoZQogIGNvcnJlY3Qgd2F5IG9mIGNhbGxpbmcgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIHRodXMgZmFpbGVkIHRvIHJlc29sdmUgaG9zdHMuCiAgVGhpcyBpcyB0d28gZXJyb3JzOiBpdCBzaG91bGRuJ3QgY29udGludWUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaWYgaXQgZmluZHMKICBnZXRob3N0YnluYW1lX3IoKSBidXQgY2FuJ3QgZmlndXJlIG91dCBob3cgdG8gdXNlIGl0LCBhbmQgaXQgc2hvdWxkIHJlYWxseQogIGZpZ3VyZSBvdXQgaG93IHRvIHVzZSBpdCBhcyBpdCB3YXMgcnVubmluZyBMaW51eCBhbmQgd2Uga25vdyBob3cgdGhhdAogIHdvcmtzLi4uCiAKRGFuaWVsICg3IE5vdmVtYmVyIDIwMDEpCi0gZG9jcy9WRVJTSU9OUyBpcyBhIG5ldyBmaWxlIGluIHRoZSBhcmNoaXZlIHRoYXQgZXhwbGFpbnMgdGhlIHZlcnNpb24gbnVtYmVyCiAgc3lzdGVtIHdlIHVzZSBpbiB0aGUgY3VybCBwcm9qZWN0LgoKLSBEaWQgc29tZSBtb3JlIGZpeGVzIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgb25seSBpZ25vcmUgc2lnbmFscyBhcyBsb25nIGFzCiAgaXQgbmVlZHMgdG8sIGFuZCB0aGVuIHJlc3RvcmUgKGlmIGFueSkgcHJldmlvdXMgc2lnbmFsIGhhbmRsZXIgYWdhaW4uCgpEYW5pZWwgKDYgTm92ZW1iZXIgMjAwMSkKLSBFbnJpayBCZXJraGFuIHBvc3RlZCBidWcgcmVwb3J0ICM0Nzg3ODAsIGluIHdoaWNoIGhlIHZlcnkgY29ycmVjdGx5IHBvaW50ZWQKICBvdXQgdHdvIGJhZCB0aW1lb3V0IG1hdHRlcnMgaW4gbGliY3VybDogd2UgZGlkbid0IHJlc3RvcmUgdGhlIHNpZ2FjdGlvbgogIHN0cnVjdCAodGhlIGFsYXJtIGhhbmRsZXIgZm9yIFNJR0FMUk0pIG5vciBkaWQgd2UgcmVzdG9yZSB0aGUgcHJldmlvdXMKICBhbGFybSgpIHRpbWVvdXQgdGhhdCBjb3VsZCd2ZSBiZWVuIHNldCBieSBhICJwYXJlbnQiIHByb2Nlc3Mgb3Igc2ltaWxhci4KCi0gS2V2aW4gUm90aCBtYWRlIHRoZSBjeWd3aW4gYmluYXJ5IGdldCBzdHJpcHBlZCBiZWZvcmUgaW5zdGFsbC4KCkRhbmllbCAoNSBOb3ZlbWJlciAyMDAxKQotIERldGxlZiBTY2htaWVyIHJlcG9ydGVkIHRoYXQgY3VybCBkaWRuJ3QgY29tcGlsZSB1c2luZyBTb2xhcmlzIDggd2l0aCB0aGUKICBuYXRpdmUgY2MgY29tcGlsZXIuIEl0IHdhcyBkdWUgdG8gYSBiYWQgZnVuY3Rpb24gcHJvdG90eXBlLiBGaXhlZCBub3cuCiAgVW5mb3J0dW5hdGVseSwgSSBjYW4ndCBlbmFibGUgdGhlIC1Xc3RyaWN0LXByb3RvdHlwZXMgaW4gbXkgZGVidWcgYnVpbGRzCiAgdGhvdWdoLCBhcyBnY2MgdGhlbiBjb21wbGFpbnMgbGlrZSBjcmF6eSBvbiBPcGVuU1NMIGluY2x1ZGUgZmlsZXMuLi4gOi0oCgotIEpvaG4gTGFzayBwcm92aWRlZCBTU0wgb3ZlciBIVFRQIHByb3h5IGZpeGVzLiBUaGV5J2xsIG5lZWQgc29tZSB0d2Vha2luZwogIHRvIHdvcmsgb24gYWxsIHBsYXRmb3Jtcy4KCi0gSm9obiBMYXNrIGFkZGVkIHRoZSAtMS8tLVRMU3YxIG9wdGlvbnMgdGhhdCBmb3JjZXMgU1NMIGludG8gdXNpbmcgVExTCiAgdmVyc2lvbiAxIHdoZW4gc3BlYWtpbmcgSFRUUFMuCgotIEpvaG4gTGFzayBicm91Z2h0IGEgYnJhbmQgbmV3IFZDKysgbWFrZWZpbGUgZm9yIHRoZSBsaWIgZGlyZWN0b3J5LCB0aGF0CiAgd29ya3MgYSBsb3QgYmV0dGVyIHRoYW4gdGhlIHByZXZpb3VzIQoKLSBSYW1hbmEgTW9ra2FwYXRpIGJyb3VnaHQgc29tZSBjbGV2ZXIgaW5zaWdodHMgb24gdGhlIExEQVAgZmFpbHVyZXMgKGJ1ZwogIHJlcG9ydCAjNDc1NDA3KSwgYW5kIGhpcyBzdWdnZXN0ZWQgY2hhbmdlcyBhcmUgbm93IGFwcGxpZWQuCgpWZXJzaW9uIDcuOS4xCgpEYW5pZWwgKDQgTm92ZW1iZXIgMjAwMSkKLSBJJ3ZlIGFkZGVkIGEgbnVtYmVyIG9mIG5ldyB0ZXN0IGNhc2VzIHRoZSBsYXN0IGZldyBkYXlzLiBBIGZldyBvZiB0aGVtIHNpbmNlCiAgSSBnb3QgcmVwb3J0cyB0aGF0IGhpbnRlZCBvbiBwcm9ibGVtcyBvbiB0aW1lb3V0cywgc28gSSBhZGRlZCBmb3VyIHRlc3RzCiAgd2l0aCB0aW1lb3V0cyBmb3IgYWxsIHNvcnRzIG9mIHByb3RvY29scyBhbmQgc3R1ZmYuIEkgYWxzbyBjYW1lIHRvIHRoaW5rIG9mCiAgYSBmZXcgb3RoZXIgZXJyb3Igc2NlbmFyaW9zIHRoYXQgd2UgY3VycmVudGx5IGRpZG4ndCB0ZXN0IHByb3Blcmx5LCBzbyBJCiAgd3JvdGUgdXAgdGVzdHMgZm9yIGEgZmV3IG9mIHRob3NlIHRvby4KCkRhbmllbCAoMiBOb3ZlbWJlciAyMDAxKQotIFJlcGxhY2VkIHJlYWQoKSBhbmQgd3JpdGUoKSB3aXRoIHJlY3YoKSBhbmQgc2VuZCgpIGZvciBzb2NrZXQgb3BlcmF0aW9ucwogIGV2ZW4gdW5kZXIgbm9ybWFsIHVuaXhlcy4KCkRhbmllbCAoMSBOb3ZlbWJlciAyMDAxKQotIFdoZW4gYW4gRlRQIHRyYW5zZmVyIHdhcyBhYm9ydGVkIGR1ZSB0byBhIHRpbWVvdXQsIGl0IHdhc24ndCByZWFsbHkgYXdhcmUgb2YKICBob3cgbWFueSBieXRlcyB0aGF0IGhhZCBiZWVuIHRyYW5zZmVycmVkIGFuZCB0aGUgZXJyb3IgdGV4dCBhbHdheXMgc2FpZCAwCiAgYnl0ZXMuIEkgbW9kaWZpZWQgdGhpcyB0byBvdXRwdXQgdGhlIGFjdHVhbGx5IHRyYW5zZmVycmVkIGFtb3VudCEgOi0pCgotIFRoZSBGVFAgZml4ZXMgaW4gcHJlNyBkaWRuJ3QgY29tcGlsZSBvbiBJUHY2IGVuYWJsZWQgaG9zdHMuIERvZXMgbm93LiBJIGFsc28KICBhZGRlZCBtb3JlIGNvbW1lbnRzIGluIHRoZSBsaWIvZnRwLmMgc291cmNlIGZpbGUuCgotIE1pbm9yIHVwZGF0ZXMgdG8gdGhlIEZBUSwgYWRkZWQgYSBicmFuZCBuZXcgc2VjdGlvbiB0byB0aGUgd2ViIHNpdGUgYWJvdXQKICB0aGUgbmFtZSBpc3N1ZSAod2hvIG93bnMgImN1cmwiPyB3aWxsIHNvbWVvbmUgc3VlIHVzPyBldGMgZXRjKToKICBodHRwOi8vY3VybC5oYXh4LnNlL2xlZ2FsL3RoZW5hbWUuaHRtbAoKVmVyc2lvbiA3LjkuMS1wcmU3CgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwMSkKLSBUaGUgY3VybF9lYXN5X2dldGluZm8oKSB0aW1lcnMgYWNjaWRlbnRhbGx5IGxvc3QgdGhlaXIgc3Vic2Vjb25kIGFjY3VyYWN5IGFzCiAgdGhlIGNhbGN1bGF0aW9ucyB1c2VkIGxvbmdzIGluc3RlYWQgb2YgZG91YmxlcyEgUGF1bCBIYXJyaW5ndG9uIHJlcG9ydGVkLgoKLSBUaGUgU1NMIFNvY2tldElzRGVhZCgpIGNoZWNrcyB3ZXJlbid0IGdvb2QgZW5vdWdoIChhcyBleHBlY3RlZCByZWFsbHkpLCBzbyBJCiAgaGFkIHRvIGFkZCBhIGdlbmVyaWMgaW50ZXJuYWwgdHJ5LWl0LW91dCBzeXN0ZW0uIElmIHRoZSByZXF1ZXN0IG9uIGEgcmUtdXNlZAogIGNvbm5lY3Rpb24gc2VlbXMgdG8gZmFpbCwgdGhlbiB3ZSBnbyBiYWNrIGFuZCBnZXQgYSBuZXcgKGZyZXNoKSBjb25uZWN0aW9uCiAgYW5kIHJlLXRyaWVzIHRoZSByZXF1ZXN0IG9uIHRoYXQgaW5zdGVhZC4gSXQga2luZCBvZiBtYWtlcyB0aGUKICBTb2NrZXRJc0RlYWQoKSBjaGVjayBvYnNvbGV0ZSwgYnV0IEkgdGhpbmsgaXQgaXMgYSBxdWlja2VyIHdheSBmb3IgdGhvc2UKICBjYXNlcyB3aGVyZSBpdCBhY3R1YWxseSBkaXNjb3ZlcnMgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBkZWFkLgoKLSBXaGVuIGZpeGluZyB0aGUgYWJvdmUsIEkgbm90aWNlZCB0aGF0IHdlIGRpZCBxdWl0ZSBhIGZldyB3cml0ZXMgdG8gc29ja2V0cwogIGluIGxpYmN1cmwgd2hlcmUgd2UgZGlkbid0IGNoZWNrIHRoZSByZXR1cm4gY29kZSAodGhhdCBpdCBhY3R1YWxseSB3b3JrZWQgdG8KICBzZW5kIHRoZSBkYXRhKS4gV2l0aCB0aGUgbmV3ICJhdHRlbXB0ZWQgcmVxdWVzdCIgc3lzdGVtIHdlIG11c3QgZGV0ZWN0IHRob3NlCiAgc2l0dWF0aW9ucyBzbyBJIHdlbnQgb3ZlciBhIGJ1bmNoIG9mIGZ1bmN0aW9ucywgY2hhbmdlZCByZXR1cm4gdHlwZXMgYW5kCiAgYWRkZWQgY2hlY2tzIGZvciB3aGF0IHRoZXkgYWN0dWFsbHkgcmV0dXJuLgoKVmVyc2lvbiA3LjkuMS1wcmU2CgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwMSkKLSBQYXVsIEhhcnJpbmd0b24gZGV0ZWN0ZWQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGFudCBTU0wgY29ubmVjdGlvbnMuIE9yIHRvIGJlCiAgbW9yZSBleGFjdCwgd2UgZGlkbid0IHByb3Blcmx5IGRldGVjdCB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBkZWFkIGFuZCB0aGVuCiAgYSBzZWNvbmQgY29ubmVjdGlvbiB3b3VsZCB0cnkgdG8gcmUtdXNlIGl0IHdyb25nbHkuIFRoZSBzb2x1dGlvbiB0byB0aGlzCiAgcHJvYmxlbSBpcyBzdGlsbCBub3QgdmVyeSBjbGVhciBhbmQgSSdtIHdvcmtpbmcgb24gaXQuIE9uZSBPcGVuU1NMIGluc2lkZXIKICBzYWlkIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IGlmIHRoZSBTU0wgY29ubmVjdGlvbiBpcyBhbGl2ZSBvciBub3Qgd2l0aG91dAogIGFjdHVhbGx5IHRyeWluZyBhbiBvcGVyYXRpb24uCgpEYW5pZWwgKDMwIE9jdG9iZXIgMjAwMSkKLSBJZiBhIGNvb2tpZSB3YXMgcmVhZCBmcm9tIGEgZmlsZSwgaXQgY291bGQgYWNjaWRlbnRhbGx5IHN0cmR1cCgpIGEgTlVMTAogIHBvaW50ZXIuIFBhdWwgSGFycmluZ3RvbiByZXBvcnRlZC4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9jb29raWUuYy5kaWZmP3IxPTEuMjUmcjI9MS4yNl0KCi0gVGhlIE1BTlVBTCBmaWxlIG5vdyBkb2N1bWVudHMgLXQgY29ycmVjdGx5LiBJIGFsc28gZml4ZWQgdGhlIC1UIGRlc2NyaXB0aW9uCiAgaW4gdGhlIGN1cmwuMSBtYW4gcGFnZS4KCkRhbmllbCAoMjkgT2N0b2JlciAyMDAxKQotIEpvaG4gSmFuc3NlbiBmb3VuZCBvdXQgdGhhdCBjdXJsX2Zvcm1hZGQgd2FzIG1pc3NpbmcgaW4gdGhlIGxpYmN1cmwuZGVmIGZpbGUKICBhbmQgdGhhdCB0aGUgZG9jcyBzdGF0ZWQgdGhlIHdyb25nIHJldHVybiB0eXBlIGZvciB0aGUgZnVuY3Rpb24uCgotIEFuZHLpcyBHYXJj7WEgZm91bmQgYSBidWcgd2l0aCBtdWx0aXBsZSBmaWxlcyBpbiB0aGUgY3VybF9mb3JtYWRkKCkgZnVuY3Rpb24sCiAgdGhhdCBJIHJlbW92ZWQgd2l0aCB0aGlzIHBhdGNoIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvZm9ybWRhdGEuYy5kaWZmP3IxPTEuMjUmcjI9MS4yNl0uCgotIEtldmluIFJvdGggYnJvdWdodCBhbm90aGVyIHBhdGNoIHRoYXQgbW92ZWQgdGhlIGN5Z3dpbiBwYWNrYWdlIGZpbGVzIHRvIHRoZQogIHBhY2thZ2VzL1dpbjMyL2N5Z3dpbiBkaXJlY3RvcnkuCgotIEEgYnVnIGluIHRoZSBjb25uZWN0aW9uIHJlLXVzZSBsb2dpYyBtYWRlIHJlcGVhdGVkIHJlcXVlc3RzIHRvIHRoZSBzYW1lIEZUUAogIHNlcnZlciAod2hlbiB1c2luZyBuYW1lK3Bhc3dvcmQgaW4gdGhlIFVSTCkgc29tZXRpbWVzIHVzZSBtb3JlIHRoYW4gb25lCiAgY29ubmVjdGlvbi4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi91cmwuYy5kaWZmP3IxPTEuMTY2JnIyPTEuMTY3XQoKLSBNb29uZXNhbXkgdHJhY2tlZCBkb3duIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aCB0aGUgbmV3IDcuOS4xIGNvbm5lY3QKICBjb2RlLiBUaGlzIGNvcnJlY3RlZCB0aGUgZXJyb3IgS2V2aW4gUm90aCByZXBvcnRlZCBvbiB0aGUgNy45LjEtcHJlNSByZWxlYXNlCiAgKHRlc3QgMTkpLi4uCiAgW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9jb25uZWN0LmMuZGlmZj9yMT0xLjEzJnIyPTEuMTRdCgpEYW5pZWwgKDI2IE9jdG9iZXIgMjAwMSkKLSBBZGRlZCB0ZXN0Mjggd2hpY2ggdmVyaWZpZXMgdGhhdCAiTG9jYXRpb246Ii1mb2xsb3dpbmcgd29ya3MgZXZlbiBpZiB0aGUKICBjb250ZW50cyBpcyBzZXBhcmF0ZWQgd2l0aCBtb3JlIHRoYW4gb25lIHNwYWNlLgoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDEpCi0gUmFtYW5hIE1va2thcGF0aSBwb2ludGVkIG91dCB0aGF0IExEQVAgdHJhbnNmZXJzIHdvdWxkICdoYW5nJyBhZnRlciB0aGUKICBjb3JyZWN0IGRhdGEgaGFzIGJlZW4gb3V0cHV0LgoKVmVyc2lvbiA3LjkuMS1wcmU1CgpEYW5pZWwgKDI0IE9jdG9iZXIgMjAwMSkKLSBULiBCaGFyYXRoIGZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGNvb2tpZSBlbmdpbmUuIFdoZW4gd2UgdXBkYXRlIGEgY29va2llCiAgdGhhdCB3ZSBhbHJlYWR5IGtuZXcgYWJvdXQsIHdlIGxvc3QgYSBjaHVuayBvZiBtZW1vcnkgaW4gdGhlIHByb2dyZXNzLi4uIFRoZQogIGJyYW5kIG5ldyB0ZXN0IGNhc2UgMjcgbm93IHRlc3RzIGZvciB0aGlzIG9jY3VycmVuY2UuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvY29va2llLmMuZGlmZj9yMT0xLjI0JnIyPTEuMjVdCgpEYW5pZWwgKDIzIE9jdG9iZXIgMjAwMSkKLSBwYWNrX2hvc3RlbnQoKSBkaWRuJ3QgcHJvcGVybHkgYWxpZ24gc29tZSBwb2ludGVycywgc28gYXQgbGVhc3QgU1BBUkMgQ1BVcwogIHdvdWxkIGNvcmUuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvaG9zdGlwLmMuZGlmZj9yMT0xLjM0JnIyPTEuMzVdCgpEYW5pZWwgKDIyIE9jdG9iZXIgMjAwMSkKLSBUb20gQmVub2lzdCByZXBvcnRlZCB0aGF0IHRoaXMgU0dJIElSSVggY29tcGlsZXIgZGlkbid0IGhhbmRsZSBpbmRlbnRlZAogIHByZXByb2Nlc3NvciBpbnN0cnVjdGlvbnMsIHNvIHRoZXkncmUgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgY29kZSEKCi0gQXBwbGllZCBLZXZpbiBSb3RoJ3MgcGF0Y2hlcyB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCBjeWd3aW4gcGFja2FnZXMgZnJvbQogIHRoZSBvdXQtb2YtdGhlLWJveCBjdXJsIHJlbGVhc2UgYXJjaGl2ZXMuCgotIEkgZm9yZ290IHRvIG1lbnRpb24gaXQgYmVsb3csIGJ1dCBsaWJjdXJsIG5vdyBjbG9zZXMgY29ubmVjdGlvbnMgdGhhdCByZXBvcnQKICB0cmFuc2ZlciBmYWlsdXJlcy4gVW5jb25kaXRpb25hbGx5LiBUaGlzIGNvdWxkIGJlIG1hZGUgbW9yZSBuaWNlbHkgaW4gdGhlCiAgZnV0dXJlIGlmIHdlIHNldCBhIGZsYWcgb3Igc29tZXRoaW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgZ29vZCB0byBiZQogIHVzZWQgZm9yIHRoZSBlcnJvcnMgdGhhdCBrbm93IHRoYXQgZm9yIGEgZmFjdC4gV2UgaGF2ZSB0byBjbG9zZSB0aGUKICBjb25uZWN0aW9uIGZvciB0aGUgY2FzZXMgd2hlcmUgd2UgYWJvcnQgZm9yIGV4YW1wbGUgYSBIVFRQIHRyYW5zZmVyIGluIHRoZQogIG1pZGRsZSwgb3Igb3RoZXJ3aXNlIHdlIG1pZ2h0IHJlLXVzZSB0aGF0IGNvbm5lY3Rpb24gbGF0ZXIgd2l0aCBsb3RzIG9mIGRhdGEKICBzdGlsbCBiZWluZyBzZW50IHRvIHVzIG9uIGl0LiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL3RyYW5zZmVyLmMuZGlmZj9yMT0xLjYzJnIyPTEuNjRdCgpEYW5pZWwgKDE5IE9jdG9iZXIgMjAwMSkKLSBDVVJMRV9HT1RfTk9USElORyBpcyBub3cgcmV0dXJuZWQgd2hlbiBhIEhUVFAgc2VydmVyIGRvZXNuJ3QgcmV0dXJuCiAgYW55dGhpbmcsIG5vdCBldmVuIGEgaGVhZGVyLiB0ZXN0IGNhc2UgMzcgd2FzIGFkZGVkIHRvIHRlc3QgZm9yIHRoaXMuCgotIFQuIEJoYXJhdGggbWFkZSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgcHJvcGVybHkgY2xvbmUgdGhlIGNvb2tpZSBzdGF0dXMgYXMKICB3ZWxsLgoKVmVyc2lvbiA3LjkuMS1wcmU0CgpEYW5pZWwgKDE4IE9jdG9iZXIgMjAwMSkKLSBDVVJMT1BUX0ZBSUxPTkVSUk9SLCBzZXQgd2l0aCAiY3VybCAtLWZhaWwiIG5vIGxvbmdlciByZXR1cm5zIGFuIGVycm9yIGlmCiAgdGhlIEhUVFAgcmV0dXJuIGNvZGUgaXMgYmVsb3cgNDAwLgoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDEpCi0gVGhlIHRlc3Qgc3VpdGUgbm93IGtpbGxzIGFueSBydW5uaW5nIHRlc3QgaHR0cCBzZXJ2ZXIgd2hlbiB5b3UgcmUtc3RhcnQgdGhlCiAgdGVzdHMuCgotIFdlIGhhZCB0byByZW1vdmUgJ3VzZSBzdHJpY3QnIGZyb20gdHdvIHBlcmwgc2NyaXB0cywgYXMgdGhlIGN5Z3dpbgogIGFkanVzdG1lbnRzIGRpZG4ndCBwbGF5IG5pY2VseSBvdGhlcndpc2UgZm9yIHNvbWUgcmVhc29uLiBBbnkgcGVybCB3aXphcmQKICBvdXQgdGhlcmUgd2hvIGNhbiBwdXQgdGhlIHNjcmljdCBiYWNrIGFuZCBzdGlsbCBtYWtlIGl0IHJ1biBnb29kIG9uIHVuaXggYW5kCiAgY3lnd2luPwoKLSBBIHBvdGVudGlhbCBtZW1vcnkgbGVhayBwb2ludGVkIG91dCB0byB1cyBieSBZYW5pY2sgUGVsbGV0aWVyIHdhcyByZW1vdmVkLgogIEl0IHdvdWxkIG9jY3VyIHdoZW4gYSBodHRwIGZpbGUgdHJhbnNmZXIgZmFpbHMuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvdHJhbnNmZXIuYy5kaWZmP3IxPTEuNjAmcjI9MS42MV0KCi0gVGhlIG1lbW9yeSBkZWJ1Z2dpbmcgc3lzdGVtIHNob3VsZCBubyBsb25nZXIgZGlzcGxheSBhbnl0aGluZyB0byBzdGRlcnIKICBpZiB0aGUgY3VybF9tZW1kZWJ1ZygpIGhhc24ndCBiZWVuIHVzZWQgdG8gZXhwbGljaXRseSBzYXkgc28uIFRoaXMgbWFrZXMgaXQKICBlYXNpZXIgdG8gdXNlIHRoZSBtZW1vcnkgZGVidWcgc3lzdGVtIGFuZCBzd2l0Y2ggdGhlIGxvZ2dpbmcgb24vb2ZmLgoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBmaXhlcyBmb3IgYnVpbGRpbmcgY3VybCBuaWNlciBpbiBjeWd3aW4gZW52aXJvbm1lbnRzLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDEpCi0gQ2xlYW5pbmcgdXAgdGhlIHByb2dyZXNzIG1ldGVyL2luZm8gY29kZS4gVGhlICJjdXJyZW50IHNwZWVkIiBpcyBub3cgbW9yZQogIGFjY3VyYXRlIHRoYW4gYmVmb3JlIGFzIHdlIG5vdyB1c2UgdGhlIHRydWUgdGltZSBzcGVudCBiZXR3ZWVuIHRoZSBtZWFzdXJlcywKICBhbmQgbm90IGp1c3QgImFzc3VtaW5nIiBldmVyeS1zZWNvbmQtdXBkYXRlIGxpa2UgYmVmb3JlLiBUaGUgb3V0cHV0IHNob3VsZAogIG5vdyBhbHNvIGJlIG9mIHRoZSBzYW1lIHdpZHRoIGF0IGFsbCB0aW1lcywgbmV2ZXIgdG8gc2hvdyAiZXh0cmEiIHplcm9lcyBvbgogIHRoZSByaWdodCBlZGdlLgoKLSBBZnRlciB0YWxraW5nIGFib3V0IHBvc3NpYmxlIExvY2F0aW9uOiBidWdzIG9uIHRoZSBtYWlsaW5nIGxpc3QsIEkgbW9kaWZpZWQKICB0aGUgImFic29sdXRlIFVSTCIgY2hlY2tlciBpbiBsaWIvdHJhbnNmZXIuYyB0byBiZSBtb3JlIHN0cmljdCB3aGVuIGNoZWNraW5nCiAgaWYgdGhlIHJlZGlyZWN0ZWQgVVJMIGlzIGFic29sdXRlLgoKRGFuaWVsICgxMSBPY3RvYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBwYXRjaGVzIHRoYXQgbWFrZSB0aGUgdGVzdCBzdWl0ZSBydW4gZmluZSBvbiBXaW5kb3dzCiAgMjAwMCBydW5uaW5nIGN5Z3dpbi4KCkRhbmllbCAoMTAgT2N0b2JlciAyMDAxKQotIFNldHRpbmcgdGhlIC1jIG9yIHRoZSBDVVJMT1BUX0NPT0tJRUpBUiBvcHRpb24gbm93IGVuYWJsZXMgdGhlIGNvb2tpZSBwYXJzZXIuCiAgUHJldmlvdXNseSAtYiBvciBDVVJMT1BUX0NPT0tJRUZJTEUgd2FzIGFsc28gcmVxdWlyZWQgZm9yIHRoZSBqYXIgdG8gd29yay4KClZlcnNpb24gNy45LjEtcHJlMwoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMSkKLSBBZGRlZCBhIG5ldyBvcHRpb24gdG8gdGhlIGNvbW1hbmQgbGluZSBjbGllbnQ6IC0wLy0taHR0cDEuMC4gSXQgdXNlcyB0aGUgbmV3CiAgbGliY3VybCBvcHRpb24gQ1VSTE9QVF9IVFRQX1ZFUlNJT04gdG8gcmVxdWVzdCB0aGF0IGxpYmN1cmwgdXNlcyBIVFRQIDEuMAogIHJlcXVlc3RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgdmVyc2lvbiAoMS4xKS4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UKICByZWFsbHkgTVVTVCBkbyB0aGF0IGJlY2F1c2Ugb2YgYSBzaWxseSByZW1vdGUgc2VydmVyLgoKLSBSZW5hbWVkIHRoZSAnVGltZUNvbmQnIHR5cGVkZWYgaW4gY3VybC9jdXJsLmggdG8gdXNlIGEgJ2N1cmxfJyBwcmVmaXggYXMKICBhbGwgcHVibGljIGN1cmwtc3ltYm9scyBzaG91bGQuCgotIGxpYmN1cmwgbm93IGV4cGxpY2l0bHkgaWdub3JlcyB0aGUgU0lHUElQRSBzaWduYWwuCgpEYW5pZWwgKDggT2N0b2JlciAyMDAxKQotIEtldmluIFJvdGgncyBjaGFuZ2UgdG8gdGhlIGNvb2tpZS1qYXIgY29tbWVudCAoaW4gdGhlIHN0b3JlZCBmaWxlKSB3YXMKICBhcHBsaWVkLgoKLSBMdWNhcyBBZGFtc2tpJ3MgbWlub3IgYnVnIGluIHRoZSBiaW5kIGVycm9yIGNvZGUgZmFpbGYoKSB3YXMgZml4ZWQuCgpEYW5pZWwgKDUgT2N0b2JlciAyMDAxKQotIE1vb25lc2FteSBmaXhlZCB0aGUgQ3VybF9jb25uZWN0aG9zdCgpIGZ1bmN0aW9uIHRvIG5vdCBnaXZlIGNvbXBpbGVyIGVycm9ycwogIG9uIGEgYnVuY2ggb2YgY29tcGlsZXJzLCBkdWUgdG8gdGhlIGFyZ3VtZW50IG5hbWVkICdzb2NrZXQnLgoKLSBNb29uZXNhbXkgYWxzbyBwcm92aWRlZCB1cGRhdGVkIFZDKysgbWFrZWZpbGVzIGFuZCBwcm9qZWN0IGZpbGVzLgoKVmVyc2lvbiA3LjkuMS1wcmUyCgpEYW5pZWwgKDQgT2N0b2JlciAyMDAxKQotIEFsYmVydCBDaGluIHByb3ZpZGVkIGEgY29uZmlndXJlIHBhdGNoIHRoYXQgbWFrZXMgdGhlIHNjcmlwdCBkZXRlY3QgcHJvcGVyCiAgZ2V0aG9zdGJ5bmFtZV9yKCkgbWV0aG9kIHdpdGhvdXQgYWN0dWFsbHkgcnVubmluZyBhbnkgY29kZSwgb25seSBjb21waWxpbmcKICBpcyBuZWNlc3NhcnkuIFRoaXMgYWxzbyByZW1vdmVzIHRoZSBuZWVkIG9mIGhhdmluZyBhIHJlc29sdmluZyAnbG9jYWxob3N0JwogIG5hbWUuCgotIEZvdW5kIGFuZCByZW1vdmVkIG1lbW9yeSBsZWFrYWdlIChuYW1lIHJlc29sdmUgZGF0YSkgaW4gbGliY3VybCBvbgogIElQdjYtZW5hYmxlZCBob3N0cy4gVGhlc2UgY291bGQgc25lYWsgdGhyb3VnaCBiZWNhdXNlIHdlIGRpZG4ndCBoYXZlIGFueQogIHJlc291cmNlIHRyYWNpbmcgb24gdGhlIElQdjYtcmVsYXRlZCBmdW5jdGlvbnMuIFdlIGRvIG5vdy4KCkRhbmllbCAoMyBPY3RvYmVyIDIwMDEpCi0gS2VpdGggTWNHdWlnYW4gcGF0Y2hlZCBhd2F5IGEgKG1haW5seSBXaW5kb3dzLSkgcHJvYmxlbSB3aXRoIHRoZSBuYW1lCiAgcmVzb2x2ZXIgZGF0YSBiZWluZyBrZXB0IGluIHRoZSBzdGF0aWMgbWVtb3J5IGFyZWEsIHdoaWNoIGlzIHJlbW92ZWQgd2hlbiBhCiAgdGhyZWFkIGlzIGtpbGxlZC4gVGhlIGN1cmwgaGFuZGxlIGl0c2VsZiB0aG91Z2ggcGVyZmVjdGx5IGhhbmRsZXMgYmVpbmcKICBwYXNzZWQgYmV0d2VlbiB0aHJlYWRzLgoKLSBEaXJrIEVkZGVsYnVldHRlbCByZXBvcnRlZCBhbiBvZGQgYnVnIHRoYXQgdHVybmVkIG91dCB0byBiZSBoaXMgcHJveHkgdGhhdAogIHJlcXVpcmVkIGFuIEF1dGhvcml6YXRpb246IGhlYWRlci4gTm93LCBwcm94aWVzIGFyZSBub3Qgc3VwcG9zZWQgdG8gcmVxdWlyZQogIHRoYXQgaGVhZGVyLCB0aGF0IGlzIGZvciB0cnVlIHNlcnZlcnMuLi4KCi0gSSBhY2NpZGVudGFsbHkgcnVpbmVkIEdlb3JnJ3MgY3VybF9mb3JtYWRkKCkuIFVoLCBiYWQgbWUuIENvcnJlY3RlZCBub3cuCgpWZXJzaW9uIDcuOS4xLXByZTEKCkRhbmllbCAoMyBPY3RvYmVyIDIwMDEpCi0gR2VvcmcgSHVldHRlbmVnZ2VyIG9uY2UgYWdhaW4gbWFkZSBhbiBlZmZvcnQgYmV5b25kIHRoZSBjYWxsIG9mIGR1dHkgYW5kIG5vdAogIG9ubHkgaW1wcm92ZWQgdGhlIGN1cmxfZm9ybWFkZCgpIGZ1bmN0aW9uLCBidXQgYWxzbyB0b29rIGNhcmUgb2YgYWRqdXN0aW5nCiAgdGhlIGN1cmwgY29tbWFuZCBsaW5lIGNsaWVudCB0byB1c2UgdGhpcyBuZXcgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUKICBvYnNvbGV0ZWQgY3VybF9mb3JtcGFyc2UuCgpEYW5pZWwgKDIgT2N0b2JlciAyMDAxKQotIE1ham9yIGZpeCBpbiBob3cgbGliY3VybCBkb2VzIFRDUCBjb25uZWN0cy4gSXQgbm93IGRvZXMgbm9uLWJsb2NraW5nCiAgY29ubmVjdHMgdG8gZW5hYmxlIGdvb2QgdGltZW91dHMgd2l0aG91dCBzaWduYWxzLCBhbmQgaXQgbm93IHRyaWVzIGFsbCBJUAogIGFkZHJlc3NlcyBmb3IgYW55IGdpdmVuIGhvc3QgKGlmIGl0IHJlc29sdmVzIG1vcmUgdGhhbiBvbmUgYW5kIHRoZSBmaXJzdAogIG9uZShzKSBkb24ndCBjb25uZWN0KS4gQWRkZWQgYSBuZXcgc291cmNlIGZpbGUgJ2Nvbm5lY3QuYycgdG8gZGVhbCB3aXRoIGFsbAogIHRoZSBUQ1AgY29ubmVjdCBzdHVmZi4KCi0gV2Ugbm93IHN1cHBvcnQgSVB2NC1zdHlsZSBJUC1hZGRyZXNzZXMgaW4gcmZjMjczMi1mb3JtYXQsIHRvIGJldHRlciBzdXBwb3J0CiAgcGVvcGxlIHdyaXRpbmcgc2NyaXB0cyB3aXRob3V0IGtub3dpbmcgd2hhdCBhZGRyZXNzIHRoZXJlIGlzLgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMSkKLSBDbGVhbnVwcyBpbiB0aGUgRlRQIHNvdXJjZSBjb2RlLiBEaXZpZGVkIHRoZSBjb2RlIGludG8gZXZlbiBtb3JlIHNtYWxsZXIKICBmdW5jdGlvbnMgYW5kIGdlbmVyYWxseSB0cmllZCB0byBtYWtlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIElQdjQgYW5kIElQdjYKICBnZXQgbGVzcyBub3RpY2FibGUgaW4gdGhlIHNvdXJjZXMuCgotIElmIHRoZSByZW1vdGUgZmlsZSB0aW1lIGlzIG5vdCByZWFkYWJsZS9hY2Nlc3NhYmxlL3VuZGVyc3Rvb2QgYnkgbGliY3VybCwKICBsaWJjdXJsIG5vdyByZXR1cm5zIC0xIGluIHRoZSBDVVJMSU5GT19GSUxFVElNRSBkYXRhLCBub3QgMCBhcyBpdCBwcmV2aW91c2x5CiAgZGlkLiBUaGlzIHNob3VsZCBtYWtlIGN1cmwgbm90IHRvdWNoIHRoZSBmaWxlIGRhdGEgdW5sZXNzIHRoZXJlIHdhcyBhIGtub3duCiAgcmVtb3RlIGRhdGUgd2hlbiAtUiBpcyB1c2VkLgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwMSkKLSBXb3JraW5nIG9uIGdldHRpbmcgbm9uLWJsb2NraW5nIGNvbm5lY3RzIHdvcmtpbmcgcGxhdGZvcm0gaW5kZXBlbmRlbnQuIFdlCiAgd2lsbCBhbHNvIG1ha2UgY3VybCB0cnkgYWxsIElQcyBmb3IgYSBnaXZlbiBob3N0IGlmIHRoZSBmaXJzdCBvbmUgc2hvdWxkCiAgZmFpbC4KCkRhbmllbCAoMjYgU2VwdGVtYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBhIGNvb2tpZSBleGFtcGxlIHRoYXQgcHJvdmVkIHRoZSBjb29raWUgamFyCiAgZnVuY3Rpb25hbGl0eSB3YXNuJ3Qgd29ya2luZyBwcm9wZXJseS4gSSBhZGRlZCB0ZXN0IGNhc2UgNDYgYW5kIG1hZGUgaXQKICB3b3JrLgoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwMSkKLSBK9nJuIEhhcnRyb3RoIHVwZGF0ZWQgdGhlIG1pbmd3MzIgbWFrZWZpbGVzLgoKVmVyc2lvbiA3LjkKCkRhbmllbCAoMjMgU2VwdGVtYmVyIDIwMDEpCi0gRm91bmQgYW5kIHJlbW92ZWQgYSAnc29ja2V0IGxlYWsnIHRoYXQgd291bGQgb2NjdXIgb24gSVB2NiBlbmFibGVkIGhvc3RzCiAgd2hlbiBGVFAgUkVUUiBmYWlsZWQuCgotIE1hZGUgdGhlIEZUUCB1cGxvYWQgdGVzdHMgcnVuIGZpbmUgb24gbWFjaGluZXMgd2l0aCBJUHY2IGVuYWJsZWQuCgpWZXJzaW9uIDcuOS1wcmU4CgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDAxKQotIFZvanRlY2ggTWluYXJpayBzZXQgdXAgYSBzcGVjaWFsLXB1cnBvc2UgdGVzdCBzZXJ2ZXIgYW5kIHByb3ZpZGVkIG1lIHdpdGgKICB0ZXN0IGNlcnRpZmljYXRlcyBpbiBvcmRlciBmb3IgbWUgdG8gcmVwZWF0IHRoZSBidWcgcmVwb3J0cyAjNDQwMDY4IGFuZAogICM0NDAzNzMuIEl0IHR1cm5lZCBvdXQgd2UgZGlkbid0IGNoZWNrIGFsbCB0aGUgZXJyb3IgY29kZXMgcHJvcGVybHkuIFdlIGRvCiAgbm93LCBhbmQgY29ubmVjdGluZyB3aXRoIGEgdW5hY2NlcHRhYmxlIGNlcnRpZmljYXRlIHdpbGwgbWFrZSBsaWJjdXJsIGZhaWwKICB0byBjb25uZWN0IHdpdGggYW4gZXJyb3IgY29kZSByZXR1cm5lZC4KCi0gUmFtYW5hIE1va2thcGF0aSBmb3VuZCBhIGNhc2Ugd2hlbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBjb2RlIGRpZCB3cm9uZy4KICBJIHdyb3RlIGEgdGVzdCBjYXNlIGZvciB0aGlzICg0NSkuCgpWZXJzaW9uIDcuOS1wcmU3CgpEYW5pZWwgKDE3IFNlcHRlbWJlciAyMDAxKQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgZml4ZWQgdGVsbmV0IGZvciB3aW4zMi4gSXQgbWFrZXMgbGliY3VybCByZXF1aXJlCiAgd2luc29jayAyLjAuCgpWZXJzaW9uIDcuOS1wcmU2CgotIGxpYnRvb2wgMS40LjIgaXMgbm93IGluIHVzZSEKClZlcnNpb24gNy45LXByZTUKCkRhbmllbCAoMTQgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgYW5vdGhlciAxNCBmdHAgdGVzdHMuCgpEYW5pZWwgKDEzIFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB0byB0aGUgZWFzeS5oIGhlYWRlciBmaWxlLiBJdCBoYXMgbm93IGJlZW4KICB0ZXN0ZWQgYW5kIHByb3ZlZCB0byB3b3JrIGluIGEgcmVhbC13b3JsZCB0ZXN0cyBieSBUIEJoYXJhdGguIFdlIHN0aWxsIG5lZWQKICB0byB3cml0ZSB1cCBzb21lIGRvY3MgZm9yIHRoaXMgZnVuY3Rpb24uCgotIEFkZGVkIGZvdXIgbW9yZSBmdHAgdGVzdHMgdG8gdGhlIHRlc3Qgc3VpdGUuCgpEYW5pZWwgKDEyIFNlcHRlbWJlciAyMDAxKQotIENVUkxPUFRfU1NMX0NJUEhFUl9MSVNUIHdhcyBhZGRlZCwgYW5kIHRoZSBjdXJsIHRvb2wgb3B0aW9uIGlzIG5hbWVkCiAgLS1jaXBoZXJzLiBVc2UgdGhlbSB0byBzcGVjaWZ5IGEgbGlzdCBvZiBjaXBoZXJzIHRvIHVzZSBpbiB0aGUgU1NMCiAgY29ubmVjdGlvbi4KCi0gVC4gQmhhcmF0aCBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIGxpYmN1cmwncyB3aW5kb3dzIHZlcnNpb24uIEl0IHR1cm5lZCBvdXQKICB0byBiZSB0aGUgbmV3IGR1cGhhbmRsZSgpIHRoYXQgZGlkbid0IHF1aXRlIHdvcmsgeWV0LgoKVmVyc2lvbiA3LjktcHJlNAoKRGFuaWVsICgxMSBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCB2ZXJib3NlIG91dHB1dCBmb3IgU1NMIGNvbm5lY3Rpb25zIHRoYXQgb3V0cHV0IHRoZSBzZXJ2ZXIKICBjZXJ0aWZpY2F0ZSdzIHN0YXJ0IGFuZCBleHBpcmUgZGF0ZXMuIEFzIHN1Z2dlc3RlZCBieSBQYXVsIEhhcnJpbmd0b24uCgotIEhlaWtraSBLb3JwZWxhIGZvdW5kIHByb2JsZW1zIGluIHRoZSBwZXJsIGZ0cCBzZXJ2ZXIgdXNlZCBmb3IgdGhlIHRlc3QKICBzdWl0ZSwgd2hlbiBoZSBydW5zIG9uIG9uIE9wZW5CU0Qgd2l0aCBwZXJsIDUuNi4gU29tZSBjaGFuZ2VzIGhhdmUgYmVlbgogIG1hZGUsIGJ1dCBub3RoaW5nIHJlYWxseSBjZXJ0YWluLgoKLSBULiBCaGFyYXRoIGhhcyBleHBlcmllbmNlZCBwcm9ibGVtcyB3aXRoIGxpYmN1cmwncyBzdGFjayB1c2FnZSBvbiB3aW5kb3dzCiAgYW5kIHdvcmtzIG9uIHJlZHVjaW5nIGl0LgoKRGFuaWVsICgxMCBTZXB0ZW1iZXIgMjAwMSkKLSBDcmlzIEJhaWxpZmYgZml4ZWQgdGhlIHBlcmwgaW50ZXJmYWNlLiBJdCBzdG9wcGVkIHdvcmtpbmcgc2luY2UgdGhlIGNoYW5nZWQKICBiZWhhdmlvciB3aXRoIFdSSVRFSEVBREVSIGFuZCBOVUxMIHBvaW50ZXJzLgoKLSBUaGUgIm91dHB1dCBjb29raWVzIiBmdW5jdGlvbiBjb3VsZCBkdW1wIGNvcmUgaWYgbm8gY29va2llcyB3ZXJlIGVuYWJsZWQuCgpEYW5pZWwgKDcgU2VwdGVtYmVyIDIwMDEpCi0gU00gcG9pbnRlZCBvdXQgdGhhdCB0aGUgU1NMIGNvZGUgZGlkbid0IGNvbXBpbGUgYW55IGxvbmdlciBpZiBTU0wgd2FzCiAgZGlzYWJsZWQuLi4gQWxzbywgd2UgbmVlZGVkIHRvIGNvcnJlY3QgdGhlICNpbmNsdWRlIGZvciB0aGUgdXRpbWUgc3R1ZmYgb24KICB3aW5kb3dzLgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDAxKQotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSBTU0wgc2Vzc2lvbiBjYWNoZSBjb2RlIHRoYXQgbWFkZSBpdAogIHNvbWV0aW1lcyByZWFkIGZyb20gYSBOVUxMIHBvaW50ZXIuCgpWZXJzaW9uIDcuOS1wcmUzCgpEYW5pZWwgKDMgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgdGhlIC1SLy0tcmVtb3RlLXRpbWUgb3B0aW9uLCB0aGF0IHVzZXMgdGhlIHJlbW90ZSBmaWxlJ3MgZGF0ZXN0YW1wIHRvCiAgc2V0IHRoZSBsb2NhbCBmaWxlJ3MgZGF0ZXN0YW1wLiBUaHVzLCB3aGVuIHlvdSBnZXQgYSByZW1vdGUgZmlsZSB5b3VyIGxvY2FsCiAgZmlsZSB3aWxsIGdldCB0aGUgc2FtZSB0aW1lIGFuZCBkYXRlLiBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIHdoZW4geW91IHVzZQogIC1vIG9yIC1PLgoKLSBJbnN0YWxsZWQgbGlidG9vbCAxLjQuMSwgbGlidG9vbGl6ZWQgYW5kIGV2ZXJ5dGhpbmcuCgpEYW5pZWwgKDEgU2VwdGVtYmVyIDIwMDEpCi0gSGVpa2tpIEtvcnBlbGEgcG9pbnRlZCBvdXQgdGhhdCBJIGRpZCBub3Qgc2hpcCB0aGUgcHJvcGVyIGxpYnRvb2wgc3R1ZmYgaW4gCiAgdGhlIHByZS1yZWxlYXNlcywgZXZlbiB0aG91Z2ggdGhhdCB3YXMgbXkgaW50ZW50aW9uLiBsaWJ0b29saXplIGhhcyBub3cKICBiZWVuIHJlLXJ1bi4KCi0gSGVpa2tpIGFsc28gcGF0Y2hlZCBhd2F5IHRoZSBiYWQgdXNlIG9mICdtYWtlIC1DJyBpbiB0aGUgdGVzdCBzdWl0ZQogIG1ha2VmaWxlLiBtYWtlIC1DIGlzIG5vdCB2ZXJ5IHBvcnRhYmxlIGFuZCBpcyBub3cgYmFubmVkIGZyb20gaGVyZS4KClZlcnNpb24gNy45LXByZTIKCkRhbmllbCAoMzEgQXVndXN0IDIwMDEpCi0gSSBqdXN0IG1hZGUgYSBodWdlIGludGVybmFsIHN0cnVjdCByZWhhdWwsIGFuZCBhbGwgdGhlIGJpZyBpbnRlcm5hbGx5IHVzZWQKICBzdHJ1Y3RzIGhhdmUgYmVlbiByZW5hbWVkLCByZWRlc2lnbmVkIGFuZCBzdHVmZiBoYXZlIGJlZW4gbW92ZWQgYXJvdW5kIGEgYml0CiAgdG8gbWFrZSB0aGUgc291cmNlIGVhc2llciB0byBmb2xsb3csIG1vcmUgbG9naWNhbGx5IGdyb3VwZWQgYW5kIHRvIGhvcGVmdWxseQogIGRlY3JlYXNlIGZ1dHVyZSBidWdzLiBJIGFsc28gaG9wZSB0aGF0IHRoaXMgd2lsbCBtYWtlIG5ldyBmdW5jdGlvbnMgdG8gZ2V0CiAgZWFzaWVyIHRvIGFkZCwgYW5kIG1ha2UgaXQgbGVzcyBsaWtlbHkgdGhhdCB3ZSBoYXZlIGJ1Z3MgbGVmdCBsaWtlIHRoZSBVUkwtCiAgZnJlZSBidWcgZnJvbSBBdWd1c3QgMjMuCgpWZXJzaW9uIDcuOS1wcmUxCgpEYW5pZWwgKDI5IEF1Z3VzdCAyMDAxKQotIFRoZSBuZXcgY29va2llIGNvZGUgaGF2ZSBlbmFibGVkIHRoZSBicmFuZCBuZXcgJy1jLy0tY29va2llLWphcicgb3B0aW9uLiBVc2UKICB0aGF0IHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBpbiB3aGljaCB5b3Ugd2FudCB0byBoYXZlIGFsbCBjb29raWVzIGN1cmwKICBrbm93cyBvZiwgZHVtcGVkIHRvLiBJdCdsbCBiZSB3cml0dGVuIHVzaW5nIHRoZSBuZXRzY2FwZSBjb29raWUgZm9ybWF0LgoKICBUaGlzIGlzIGludGVybmFsbHkgZG9uZSB3aXRoIHRoZSBuZXcgQ1VSTE9QVF9DT09LSUVKQVIgb3B0aW9uIHRvIGxpYmN1cmwsCiAgd2hpY2ggaW4gdHVybiBkdW1wcyB0aGlzIGluZm9ybWF0aW9uIHdoZW4gY3VybF9lYXN5X2NsZWFudXAoKSBpcyBpbnZva2VkLgogIFRoZXJlIG1pZ2h0IGJlIHJlYXNvbnMgdG8gcmUtY29uc2lkZXIgbXkgY2hvaWNlIG9mIHB1dHRpbmcgaXQgdGhlcmUuIFBlcmhhcHMKICBpdCBpcyBiZXR0ZXIgcGxhY2VkIHRvIGdldCBkb25lIGp1c3QgYmVmb3JlICpfcGVyZm9ybSgpIGlzIGRvbmUuIEl0IGlzIGFsbAogIG9mIGNvdXJzZSBkZXBlbmRpbmcgb24gaG93IHlvdSBndXlzIHdhbnQgdG8gdXNlIHRoaXMgZmVhdHVyZS4uLgoKLSBBZGRlZCBmdHB1cGxvYWQuYyBpbiB0aGUgc291cmNlIGV4YW1wbGVzIHNlY3Rpb24sIGJhc2VkIG9uIHNvdXJjZSBjb2RlIHBvc3RlZAogIGJ5IEVyaWNrIE51d2VuZGFtLgoKRGFuaWVsICgyOCBBdWd1c3QgMjAwMSkKLSBOb3cgcnVubmluZyBsaWJ0b29sIENWUyBicmFuY2gtMS00IHRvIGdlbmVyYXRlIHN0dWZmLiBTaG91bGQgZml4IHByb2JsZW1zCiAgb24gT3BlbkJTRCBhbmQgaG9wZWZ1bGx5IG9uIEZyZWVCU0QgYXMgd2VsbCEKCi0gR2VvcmcgSHVldHRlbmVnZ2VyIG1vZGlmaWVkIHRoZSBjdXJsX2Zvcm1hZGQoKSBmdW5jdGlvbmFsaXR5IHNsaWdodGx5LCBhbmQKICBhZGRlZCBzdXBwb3J0IGZvciBlcnJvciBjb2RlIDQxNyB3aGVuIGRvaW5nIGZvcm0gcG9zdCBhbmQgdXNpbmcgdGhlIEV4cGVjdDoKICBoZWFkZXIuIEdyZWF0IHdvcmshCgotIE1hZGUgc29tZSB0ZXN0cyB3aXRoIGNhY2hlZCBTU0wgc2Vzc2lvbiBJRHMsIGFuZCB0aGV5IHNlZW0gdG8gd29yay4gVGhlcmUKICBzaG91bGQgYmUgYSBzaWduaWZpY2FudCBzcGVlZCBpbXByb3ZlbWVudCBpbiB0aGUgU1NMIGNvbm5lY3Rpb24gcGhhc2UsIGJ1dAogIGluIG15IHRpbnkgdGVzdHMgaXQganVzdCBpc24ndCBwb3NzaWJsZSB0byBub3RpY2UgYW55IGRpZmZlcmVuY2UuIExpa2Ugb3RoZXIKICBjYWNoaW5nIGluIGxpYmN1cmwsIHlvdSBtdXN0IHJldXNlIHRoZSBzYW1lIGhhbmRsZSBmb3IgdGhlIGNhY2hpbmcgdG8gdGFrZQogIGVmZmVjdC4gU1NMIHNlc3Npb24gSUQgY2FjaGluZyBpcyBkb25lIG9uIGEgcGVyIGhvc3QtbmFtZSBhbmQgZGVzdGluYXRpb24KICBwb3J0IG51bWJlciBiYXNpcy4KCiAgU2V0IHZlcmJvc2UsIGFuZCB5b3UnbGwgZ2V0IGluZm9ybWF0aW9uYWwgdGVzdHMgd2hlbiBsaWJjdXJsIGRldGVjdHMgYW5kCiAgdXNlcyBhIHByZXZpb3VzIFNTTCBzZXNzaW9uIElELgoKLSBVcGdyYWRlZCB0byBhdXRvbWFrZSAxLjUgb24gbXkgZGV2ZWxvcG1lbnQvcmVsZWFzZSBtYWNoaW5lLgoKRGFuaWVsICgyNyBBdWd1c3QgMjAwMSkKLSBTbG93bHkgc3RhcnRlZCB3cml0aW5nIFNTTCBzZXNzaW9uIElEIGNhY2hpbmcgY29kZQoKRGFuaWVsICgyNCBBdWd1c3QgMjAwMSkKLSBULiBCaGFyYXRoIHJlbW92ZWQgY29tcGlsZXIgd2FybmluZ3Mgb24gd2luZG93cyBhbmQgdXBkYXRlZCB0aGUgTVMgcHJvamVjdAogIGZpbGVzLgoKLSBLZXZpbiBSb3RoIHJlcG9ydGVkIHR3byBraW5kcyBvZiBjb21tYW5kIGxpbmUgY29uc3RydWN0cyB3aXRoIHRoZSBuZXcgLUcgdGhhdAogIGN1cmwgZGlkbid0IHJlYWxseSBkZWFsIHdpdGggdGhlIHdheSBvbmUgd291bGQgbGlrZS4KCi0gVGltIENvc3RlbGxvIHBhdGNoZWQgYXdheSBhIHVzZSBvZiBzdHJjYXNlY21wKCkgaW4gdGhlIFNTTCBjb2RlLiBXZSBoYXZlIG91cgogIG93biBwb3J0YWJsZSB2ZXJzaW9uIG5hbWVkIHN0cmVxdWFsKCkgdGhhdCBzaG91bGQgYmUgdXNlZCEKCi0gVGltIGFsc28gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIGluIHRoZSBsaWIvTWFrZWZpbGUudmM2IGZpbGUgdGhhdCBtYWRlIGl0IG1peAogIGRlYnVnIG9iamVjdCBtb2R1bGVzIGNhdXNpbmcgY29uZnVzaW9ucy4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDEpCi0gVC4gQmhhcmF0aCBhY2N1cmF0ZWx5IGZvdW5kIGEgbGliY3VybCBidWcgdGhhdCB3b3VsZCBoYXBwZW4gd2hlbiBkb2luZyBhCiAgc2Vjb25kIGludm9rZSBvZiBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdpdGggYSBuZXcgVVJMIHdoZW4gdGhlIHByZXZpb3VzIGludm9rZQogIGZvbGxvd2VkIGEgTG9jYXRpb246IGhlYWRlci4KCi0gU3RhcnRlZCB0aGUgaW1wcm92ZW1lbnQgd29yayBvbiB0aGUgY29va2llIGVuZ2luZToKICAtIE5vdyBrZWVwcyBjb29raWVzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBjb29raWUgZmlsZQogIC0gQSB3cml0ZSB0byB0aGUgcG9zc2libHkgc3RhdGljIHN0cmluZyB3YXMgcmVtb3ZlZAogIC0gQWRkZWQgYSBmdW5jdGlvbiB0aGF0IGNhbiBvdXRwdXQgYWxsIGNvb2tpZXMKICAtIE5vdyBzdXBwb3J0cyByZWFkaW5nIG11bHRpcGxlIGNvb2tpZSBmaWxlcwoKLSBTdGV2ZSBMaG9tbWUgY29ycmVjdGVkIGEgRExMIG5hbWluZyBpc3N1ZSBpbiB0aGUgTVNWQysrIHByb2plY3QgZmlsZS4KCi0gU3BsaXQgdXAgdGhlIG1vbnN0ZXIgZnVuY3Rpb24gaW4gbGliL2Z0cC5jIHRvIHVzZSBtb3JlIHNtYWxsaXNoIGZ1bmN0aW9ucyB0bwogIGluY3JlYXNlIHJlYWRhYmlsaXR5IGFuZCBtYWludGFpbmFiaWxpdHkuCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAxKQotIEdlb3JnIEh1ZXR0ZW5lZ2dlcidzIGJpZyBwYXRjaCB3YXMgYXBwbGllZC4gTm93IHdlIGhhdmU6CiAgbyAiRXhwZWN0OiAxMDAtY29udGludWUiIHN1cHBvcnQuIFdlIHdpbGwgZnJvbSBub3cgb24gc2VuZCB0aGF0IGhlYWRlciBpbgogICAgYWxsIHJmYzE4NjctcG9zdHMsIGFzIHRoYXQgbWFrZXMgdXMgYWJvcnQgbXVjaCBmYXN0ZXIgd2hlbiB0aGUgc2VydmVyCiAgICByZWplY3RzIG91ciBQT1NULiBQb3N0aW5nIHdpdGhvdXQgdGhlIEV4cGVjdDogaGVhZGVyIGlzIHN0aWxsIHBvc3NpYmxlIGluCiAgICB0aGUgc3RhbmRhcmQgcmVwbGFjZS1pbnRlcm5hbC1oZWFkZXIgc3R5bGUuCiAgbyBjdXJsX2Zvcm1hZGQoKSBpcyBhIG5ldyBmb3JtcG9zdCBidWlsZGluZyBmdW5jdGlvbiB0aGF0IGlzIGludHJvZHVjZWQgdG8KICAgIHJlcGxhY2UgdGhlIG5vdyBkZXByZWNhdGVkIGN1cmxfZm9ybXBhcnNlKCkgZnVuY3Rpb24uIFRoZSBsYXR0ZXIgZnVuY3Rpb24KICAgIHdpbGwgc3RpbGwgaGFuZyBhcm91bmQgZm9yIGEgd2hpbGUsIGJ1dCB0aGUgY3VybF9mb3JtYWRkKCkgaXMgdGhlIG5ldyB3YXkKICAgIGFuZCBjb3JyZWN0IHdheSB0byBidWlsZCBmb3JtIHBvc3RzLgogIG8gRG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlc2UgY2hhbmdlcwoKICBUaGVzZSBjaGFuZ2VzIGFyZSByZWFzb24gZW5vdWdoIHRvIG5hbWUgdGhlIG5leHQgY3VybCByZWxlYXNlIDcuOS4uLgoKLSBXZSBub3cgY29udmVydCBtYW4gcGFnZXMgdG8gSFRNTCBwYWdlcyBhbmQgaW5jbHVkZSB0aGVtIGluIHRoZSByZWxlYXNlCiAgYXJjaGl2ZS4gRm9yIHRoZSBwbGVhc3VyZSBvZiBldmVyeW9uZSB3aXRob3V0IG5yb2ZmIHdpdGhpbiByZWFjaC4KCi0gQW5kculzIEdhcmPtYSdzIHN1Z2dlc3RlZCBmbHVzaGluZyBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgb3V0cHV0IHN0cmVhbSB3YXMKICBhZGRlZC4gSXQgc2hvdWxkIG1ha2UgdGhlIHByb2dyZXNzIG1ldGVyIGxvb2sgYmV0dGVyIG9uIFdpbmRvd3MuCgotIFRyb3kgRW5nZWwgcG9pbnRlZCBvdXQgYSBtaXN0YWtlIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHRoYXQgbWFkZSBpdCBmYWlsCiAgb24gbWFueSBSZWQgSGF0IGJveGVzIQoKRGFuaWVsICgyMCBBdWd1c3QgMjAwMSkKLSBXZSBuZWVkIGFuIHVwZGF0ZWQgbGlidG9vbCB0byBtYWtlIGEgYmV0dGVyIGJ1aWxkIGVudmlyb25tZW50IGZvciBPcGVuQlNECiAgYXMgd2VsbCBhcyBGcmVlQlNECgpWZXJzaW9uIDcuOC4xCgpEYW5pZWwgKDIwIEF1Z3VzdCAyMDAxKQotIEJyYWQgcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaGlwIHR3byBleHRyYSBsaWJ0b29sIGZpbGVzIGluIHRoZSB0YXJiYWxscyB0aGF0CiAgd2UgcmVhbGx5IGRvbid0IG5lZWQgdG8hIFJlbW92aW5nIHRoZW0gbWFrZXMgdGhlIGd6LWFyY2hpdmUgYWJvdXQgNjBLCiAgc21hbGxlciEKCi0gQWxiZXJ0IENoaW4gYnJvdWdodCBmaXhlcyBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZGV0ZWN0IHNvY2tsZW5fdAogIHByb3Blcmx5IGFzIHdlbGwgYXMgbW92aW5nIGxvdHMgb2Ygb3VyIGN1c3RvbSBhdXRvY29uZiBtYWNyb3MgdG8KICBhY2luY2x1ZGUubTQuCgpEYW5pZWwgKDE5IEF1Z3VzdCAyMDAxKQotIE1vb25lc2FteSBpbXByb3ZlZCBoaXMgLUcgZmVhdHVyZSBmb3IgaG9zdCBuYW1lcyBvbmx5IFVSTHMuLi4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDEpCi0gRmluYWxseSBjbGVhbmVkIHVwIHRoZSBrZXJiZXJvcyBjb2RlIHRvIHVzZSBDdXJsXyBwcmVmaXhlcyBvbiBhbGwgZ2xvYmFsCiAgc3ltYm9scyBhbmQgdG8gbm90IHVzZSBnbG9iYWwgdmFyaWFibGVzLgoKVmVyc2lvbiA3LjguMS1wcmU2CgpEYW5pZWwgKDE2IEF1Z3VzdCAyMDAxKQotIFMuIE1vb25lc2FteSBhZGRlZCB0aGUgLUcgb3B0aW9uIHRvIGN1cmwsIHRoYXQgY29udmVydHMgdGhlIGRhdGEgc3BlY2lmaWVkCiAgd2l0aCAtZCB0byBhIEdFVCByZXF1ZXN0LiBEZWZhdWx0IGFjdGlvbiB3aGVuIHVzaW5nIC1kIGlzIFBPU1QuIFdoZW4gLUcgaXMKICB1c2VkLCB0aGUgLWQgc3BlY2lmaWVkIGRhdGEgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgVVJMIHdpdGggYSAnPycKICBzZXBhcmF0b3IuIEFzIHN1Z2dlc3RlZCBwcmV2aW91c2x5IGJ5IEtldmluIFJvdGguCgotIGN1cmwtY29uZmlnIC0tbGlicyBzaG91bGQgbm93IGRpc3BsYXkgYWxsIGxpbmtlciBvcHRpb25zIHJlcXVpcmVkIHRvIGxpbmsKICB3aXRoIGxpYmN1cmwuIEl0IGluY2x1ZGVzIHRoZSBwYXRoIGFuZCBvcHRpb25zIGZvciBsaWJjdXJsIGl0c2VsZi4KICBjdXJsLWNvbmZpZyAtLWNmbGFncyBkaXNwbGF5cyB0aGUgY29tcGlsZXIgb3B0aW9uKHMpIG5lZWRlZCB0byBjb21waWxlCiAgc291cmNlIGZpbGVzIHRoYXQgdXNlIGxpYmN1cmwgZnVuY3Rpb25zLiBCYXNpY2FsbHksIHRoYXQgc2V0cyB0aGUgaW5jbHVkZQogIHBhdGggY29ycmVjdC4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDEpCi0gQXJrYWRpdXN6IE1pc2tpZXdpY3ogcG9pbnRlZCBvdXQgYSBtaXN0YWtlIGluIGhvdyBJUHY2LXN0eWxlIElQLWFkZHJlc3NlcwogIHdlcmUgcGFyc2VkIGFuZCB1c2VkLiAoUkZDMjczMi1mb3JtYXQpCgotIEJ1ZyAjMTI3MzMgb3ZlciBvbiBwaHAubmV0IGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIGxpYmN1cmwgdGhhdCBtYWRlIGl0IGNvcmUKICBkdW1wIGlmIHlvdSB1c2VkIENVUkxPUFRfUE9TVCB3aXRob3V0IHNldHRpbmcgYW55IGRhdGEgdG8gcG9zdCB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTISBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZS4gTm90IHVzaW5nIENVUkxPUFRfUE9TVEZJRUxEUwogIG5vdyBlcXVhbHMgc2V0dGluZyBpdCB0byBubyBkYXRhIGF0IGFsbC4KCi0gUmFtYW5hIE1va2thcGF0aSByZXBvcnRlZCB0aGF0IGN1cmwgd2l0aCAnLXcgJXtodHRwX2NvZGV9JyBkaWRuJ3Qgd29yawogIHByb3Blcmx5IHdoZW4gdXNlZCBmb3IgbXVsdGlwbGUgVVJMcyBvbiBhIHNpbmdsZSBjb21tYW5kIGxpbmUuIEluZGVlZCwgdGhlCiAgdmFyaWFibGUgd2FzIG5vdCByZXNldCBiZXR3ZWVuIHRoZSByZXF1ZXN0cy4gVGhpcyBpcyBub3cgZml4ZWQuCgotIERhdmlkIEphbWVzIGZpeGVkIHRoZSBCb3JsYW5kIG1ha2VmaWxlIHNvIHRoYXQgbGliY3VybCBzdGlsbCBjb21waWxlcyBhbmQKICBidWlsZHMgd2l0aCB0aGF0IGNvbXBpbGVyLgoKRGFuaWVsICgxNCBBdWd1c3QgMjAwMSkKLSBPb3BzLiBJIHJ1aW5lZCBOaWNvJ3Mgc29ja2xlbl90IGRlZmluZSBpbiBjb25maWctdm1zLmgsIGNvcnJlY3RlZCBpdCBub3cuCgotIEFuIG9sZGVyIGl0ZW0gbm90IG1lbnRpb25lZCBoZXJlIGJlZm9yZTogQ1VSTF9HTE9CQUxfV0lOMzIgaXMgYSBkZWZpbmUgZm9yCiAgd2luZG93cyB1c2VycyB0byBjdXJsX2dsb2JhbF9pbml0KCksIHRoYXQgbWFrZXMgbGliY3VybCBpbml0IHRoZSB3aW5zb2NrCiAgc3R1ZmYuIElmIGxpYmN1cmwgaXMgYWxsIHNvY2tldCBzdHVmZiB5b3UgZG8sIHRoZW4gYWxsb3dpbmcgaXQgdG8gZmlkZGxlCiAgd2l0aCB0aGlzIGlzIGEgY29tZm9ydGFibGUgc2hvcnRjdXQgdG8gZmFtZS4KClZlcnNpb24gNy44LjEtcHJlNQoKRGFuaWVsICgxNCBBdWd1c3QgMjAwMSkKLSBOaWNvIEJhZ2d1cyBwcm92aWRlZCBtb3JlIGZlZWRiYWNrIGZyb20gaGlzIFZNUyBwb3J0aW5nIGVmZm9ydHMgYW5kIGEgZmV3CiAgbWlub3IgY2hhbmdlcyB3ZXJlIG5lY2Vzc2FyeS4KCi0gSSBtb2RpZmllZCBjb25maWd1cmUuaW4gc28gdGhhdCAtLWVuYWJsZS1kZWJ1ZyBzZXRzIG1vcmUgcGlja3kgZ2NjIG9wdGlvbnMuCiAgSSB0aGVuIHJlbW92ZWQgYWxtb3N0IGFsbCB0aGUgbmV3IHdhcm5pbmdzIHRoYXQgYXBwZWFyZWQsIGFuZCBieSBkb2luZyBzbyBJCiAgY29ycmVjdGVkIHRoZSBzaXplX3QtdHJlYXRlZC1hcy1zaWduZWQgcHJvYmxlbSB0aGF0IGhhcyBiZWVuIGRpc2N1c3NlZCBvbgogIHRoZSBtYWlsaW5nIGxpc3QgcHJldmlvdXNseS4gSSBhbHNvIHJlbW92ZWQgYSBidW5jaCBvZiB0aGUganVzdCByZWNlbnRseQogIGFkZGVkICNpZmRlZiBWTVMgbGluZXMuCgotIEkgcmVtb3ZlZCB0aGUgdXNlIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSBTU0wgY29kZS4gSXQgd2FzIG9uY2UKICBuZWNlc3NhcnkgYnV0IGhhc24ndCBiZWVuIG5lZWRlZCBzaW5jZSBPcGVuU1NMIDAuOS40LiBUaGUgb2xkIGNvZGUgc2hvdWxkCiAgKGhvcGVmdWxseSkgc3RpbGwgd29yayBpZiBsaWJjdXJsIGlzIGJ1aWx0IGFnYWluc3QgYW4gYW5jaWVudCB2ZXJzaW9uIG9mCiAgT3BlblNTTC4KCkRhbmllbCAoMTMgQXVndXN0IDIwMDEpCi0gUGV0ZXIgVG9kZCBwb3N0ZWQgYSBwYXRjaCB0aGF0IG5vdyBhbGxvd3Mgbm9uLWZpbGUgcmMxODY3LXN0eWxlIGZvcm0gcG9zdHMKICB0byBiZSBsYXJnZXIgdGhhbiA0Sy4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDEpCi0gUy4gTW9vbmVzYW15IGZpeGVkIGJ1Z3MgZm9yIGJ1aWxkaW5nIGRlYnVnIGFuZCBTU0wgbGliIGluIFZDIG1ha2VmaWxlCgpEYW5pZWwgKDkgQXVndXN0IDIwMDEpCi0gVGhlIHJlZGlyZWN0ZWQgZXJyb3Igc3RyZWFtIHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjdXJsX2Vhc3lfY2xlYW51cCgpIGNhbGwKICB3YXMgbWFkZSwgYW5kIHdoZW4gVkVSQk9TRSB3YXMgZW5hYmxlZCwgdGhlIGNsZWFudXAgZnVuY3Rpb24gdHJpZWQgdG8gdXNlCiAgdGhlIHN0cmVhbS4gSXQgY291bGQgbGVhZCB0byBhIHNlZ21lbnRhdGlvbiBmYXVsdC4gQWxzbywgdGhlIHN0cmVhbSB3YXMKICBjbG9zZWQgZXZlbiBpZiB3ZSBsb29wZWQgdG8gZ2V0IG1vcmUgZmlsZXMuICBDb3JyZWN0cyBEdXN0aW4gQm9zd2VsbCdzIGJ1ZwogIHJlcG9ydCAjNDQxNjEwCgotIE5vdyBnZW5lcmF0ZXMgdGhlIHJlbGVhc2UgY29uZmlndXJlIHNjcmlwdCB3aXRoIGF1dG9jb25mIDIuNTIKClZlcnNpb24gNy44LjEtcHJlNAoKRGFuaWVsICg4IEF1Z3VzdCAyMDAxKQotIGN1cmwgLUUgdXNlcyBhIGNvbG9uIHRvIHNlcGFyYXRlIGEgZmlsZSBuYW1lIGZyb20gYSBwYXNzcGhyYXNlLiBUaGlzIHR1cm5lZAogIG91dCByZWFsbHkgYmFkIGZvciB0aGUgd2luZG93cyBwZW9wbGUgd2hvIHdhbnRzIHRvIGluY2x1ZGUgYSBkcml2ZSBsZXR0ZXIgaW4KICB0aGUgZmlsZSBuYW1lIGxpa2UgImM6XGNlcnQucGVtIi4gVGhlcmUncyBub3cgYSB3aW4zMiB3b3JrLWFyb3VuZAogIGltcGxlbWVudGVkIHRoYXQgdHJpZXMgd29yayBhcm91bmQgdGhhdCwgd2hlbiB0aGUgY29sb24gc2VlbXMgdG8gYmUgdXNlZCBmb3IKICB0aGlzIGtpbmQgb2YgY29uc3RydWN0LgoKLSBQYXRyaWNrIEJpaGFuLUZhb3UgaW50cm9kdWNlZCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCB3aGljaCBtYWtlcyBjdXJsCiAgdmVyaWZ5IHRoZSBzZXJ2ZXIncyBDTiBmaWVsZCB3aGVuIHRhbGtpbmcgaHR0cHM6Ly8uIElmIC0tY2FjZXJ0IGlzIG5vdCB1c2VkLAogIGFueSBmYWlsdXJlcyBpbiBtYXRjaGluZyBpcyBvbmx5IGRpc3BsYXllZCBhcyBpbmZvcm1hdGlvbiAoLXYpLgoKRGFuaWVsICg3IEF1Z3VzdCAyMDAxKQotIFdyb3RlIHVwIG5pbmUgbW9yZSB0ZXN0IGNhc2VzLCBtb3JlIG9yIGxlc3MgY29udmVydGVkIGZyb20gdGhlIGZvcm1lciB0ZXN0CiAgc3VpdGUuCgpEYW5pZWwgKDYgQXVndXN0IDIwMDEpCi0gSGVpa2tpIEtvcnBlbGEgcG9zdGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyAnY3VybC1jb25maWcgLS1saWJzJyBpbmNsdWRlIHRoZQogIGRpcmVjdG9yeSBpbiB3aGljaCBsaWJjdXJsIGl0c2VsZiBpcyBpbnN0YWxsZWQgaW4uIFdoaWxlIHRoaXMgd2Fzbid0IG15CiAgaW5pdGlhbCBpbnRlbnRpb24gd2l0aCB0aGlzIG9wdGlvbiwgaXQgbWFrZXMgc2Vuc2UgYW5kIG1ha2VzIGxpbmtpbmcgd2l0aAogIGxpYmN1cmwgZWFzaWVyLgoKLSBTdGVmYW4gVWxyaWNoIHBvaW50ZWQgb3V0IHRvIHVzIHRoYXQgb3RoZXIgdG9vbHMgYW5kIGxpYnJhcmllcyB0cmVhdCBmaWxlOi8vCiAgVVJMcyB3aXRoIG9ubHkgb25lIHNsYXNoIGFmdGVyIHRoZSBob3N0IG5hbWUgc2xpZ2hseSBkaWZmZXJlbnQgdGhhbiBsaWJjdXJsCiAgZG9lcy4gU2luY2UgYWxsIHRoZSBvdGhlcnMgc2VlbSB0byBhZ3JlZSwgd2UgYmV0dGVyIGZvbGxvdyB0aGVtLgoKLSBOaWNvIEJhZ2d1cyBwcm92aWRlZCB1cyB3aXRoIGEgaHVnZSBzZXQgb2YgZml4ZXMgdG8gbWFrZSBjdXJsIGNvbXBpbGUgYW5kCiAgYnVpbGQgdW5kZXIgT3BlblZNUy4KClZlcnNpb24gNy44LjEtcHJlMwoKRGFuaWVsICg2IEF1Z3VzdCAyMDAxKQotIEpvbmF0aGFuIEhzZXUgbm90aWNlZCB0aGF0IHlvdSBjb3VsZG4ndCBnZXQgYSBoZWFkZXIgY2FsbGJhY2sgdW5sZXNzIHlvdQogIHNldCBDVVJMT1BUX1dSSVRFSEVBREVSIHRvIG5vbi1OVUxMLCBldmVuIGlmIHlvdSBkaWRuJ3QgY2FyZSBhYm91dCB0aGF0CiAgZGF0YS4gVGhpcyBpcyBub3cgZml4ZWQuCgpEYW5pZWwgKDUgQXVndXN0IDIwMDEpCi0gU2VyZ2lvIEJhbGxlc3RyZXJvIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIHJlYWRpbmcgcmVzcG9uc2VzIGZyb20gTkNTQSBodHRwZAogIDEuNS54IHNlcnZlcnMsIGFzIHRoZXkgcmV0dXJuIHJlYWxseSBzY3Jld2VkIHVwIHJlc3BvbnNlIGhlYWRlcnMgd2hlbiBhc2tlZAogIGZvciB3aXRoIEhUVFAgMS4xLgoKLSBjdXJsX2VzY2FwZSgpIG5vIGxvbmdlciB0cmVhdHMgYWxyZWFkeSBlbmNvZGVkIGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0CiAgc3RyaW5nIGVzcGVjaWFsbHkuCgpEYW5pZWwgKDMgQXVndXN0IDIwMDEpCi0gSSByZXBsYWNlZCB0aGUgZm9ybWVyIGxpYi9hcnBhX3RlbG5ldC5oIGZpbGUgd2l0aCBvbmUgSSB3cm90ZSBteXNlbGYsIHRvCiAgYXZvaWQgdGhlIEJTRCBhbm5vdWNlbWVudCBjbGF1c2Ugb2YgdGhlIGxpY2Vuc2UgaW4gdGhlIGZvcm1lciBmaWxlLgoKLSBBbmRyZXcgRnJhbmNpcyBwcm92aWRlZCBhIG5ldyB2ZXJzaW9uIG9mIGJhc2U2NC5jIHRvIHdvcmsgYXJvdW5kIHRoZSBsaWNlbnNlCiAgYm9pbGVyIHBsYXRlIHRoYXQgY2FtZSB3aXRoIHRoZSBwcmV2aW91cyBvbmUuIEkgcGF0Y2hlZCBpdCwgYnV0IHRoZSBnbG9yeQogIHNob3VsZCBnbyB0byBBbmRyZXcgZm9yIGhpcyBoZWFkcyB1cC4KCi0gVG9tYXN6IExhY2tpIG5vdGljZWQgdGhhdCB3aGVuIHlvdSBkbyByZXBlYXRlZCB0cmFuc2ZlcnMgd2l0aCBsaWJjdXJsIHlvdQogIGNvdWxkbid0IGFsd2F5cyByZWxpYWJseSBjaGFuZ2UgSFRUUCByZXF1ZXN0LiBUaGlzIGhhcyBub3cgYmVlbiBmaXhlZCBhbmQgYQogIG5ldyBsaWJjdXJsIG9wdGlvbiB3YXMgYWRkZWQ6IENVUkxPUFRfSFRUUEdFVCwgdGhhdCBjYW4gZm9yY2UgdGhlIEhUVFAKICByZXF1ZXN0ciAoYmFjaykgdG8gR0VULgoKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHBvaW50ZWQgb3V0IHRoYXQgaHR0cHNzZXJ2ZXIucGwgd2Fzbid0IGluY2x1ZGVkIGluCiAgcmVsZWFzZSBhcmNoaXZlcy4gSXQgc2hvdWxkIGJlIG5vdy4KCkRhbmllbCAoMiBBdWd1c3QgMjAwMSkKLSBGcmFuayBLZWVuZXkgcG9pbnRlZCBvdXQgYSBtYW51YWwgbWlzdGFrZSBmb3IgY2VydGlmaWNhdGUgY29udmVydGlvbnMuCgotIFRvbWFzeiBMYWNraSBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIHRyYW5zZmVyIGxvb3AgdGhhdCBjb3VsZCBtYWtlIHRoZQogIHNlbGVjdCgpIGxvb3AgdXNlIGZhciB0b28gbXVjaCBDUFUuCgotIFBhd2VsIEEuIEdhamRhIHBvaW50ZWQgb3V0IGFuIG91dHB1dCBtaXN0YWtlIGRvbmUgd2hlbiB1c2luZyBsaWJjdXJsJ3MKICBwcm9ncmVzcyBjYWxsYmFjay4KCkRhbmllbCAoMjkgSnVuZSAyMDAxKQotIE5hdmVlbiBOb2VsIG5vdGljZWQgdGhhdCB0aGUgQm9ybGFuZCBsaWJyYXJ5IG1ha2VmaWxlIHdhc24ndCB1cGRhdGVkLgoKLSBOaWMgUm9ldHMgYnJvdWdodCBhIGZpeCBmb3IgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiB3aGVuIHVzaW5nIFNTTC4KCkRhbmllbCAoMjcgSnVuZSAyMDAxKQotIE1hZGUgdGhlIEZUUCB0ZXN0cyBydW4gT0sgZXZlbiBvbiBtYWNoaW5lcyBydW5uaW5nIGN1cmwgSVB2Ni1lbmFibGVkLgoKLSBUcm95IEVuZ2VsIGNvcnJlY3RlZCBzb21lIFJQTSBwYWNrYWdlIGRldGFpbHMuCgpWZXJzaW9uIDcuOC4xLXByZTIKCkRhbmllbCAoMjUgSnVuZSAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIGNvcnJlY3RseSBpZGVudGlmaWVkIGEgcHJvYmxlbSB0aGF0IG9jY3VycmVkIHdoZW4gZG93bmxvYWRpbmcKICBzZXZlcmFsIGZpbGVzIHdpdGggY3VybCwgYW5kIHVzaW5nIHJlc3VtZS4gVGhlIGZpcnN0IGZpbGUncyByZXN1bWUgaW5kZXggd2FzCiAgdGhlbiB1c2VkIGZvciBhbGwgZmlsZXMsIHJlc3VsdGluZyBpbiB3ZWlyZCByZXN1bHRzLi4uCgotIEFudG9uIEthbG15a292IHByb3ZpZGVkIGEgZml4IHRoYXQgbWFrZXMgY3VybCB3b3JrIHdpdGggZm9ybSBmaWVsZCBuYW1lcwogIHdpdGggc3BhY2VzIGxpa2Ugd2hlbiAtRiBpcyB1c2VkLgoKVmVyc2lvbiA3LjguMS1wcmUxCgpEYW5pZWwgKDIwIEp1bmUgMjAwMSkKLSBNaWtlIEJ5dG5hciBwcm92aWRlZCBhIGZpbmUgcmVwb3J0IHRoYXQgcHJvdmVkIHRoYXQgdGhlIC0td2l0aC1zc2wgb3B0aW9uCiAgZm9yIGNvbmZpZ3VyZSBuZWVkZWQgdHdlYWtpbmcuIEl0IG5vIGxvbmdlciBzZWFyY2hlcyB0aGUgZGVmYXVsdCBkaXJlY3RvcmllcwogIGZvciBPcGVuU1NMIGxpYnMgb3IgZGlyZWN0b3JpZXMgd2hlbiBhIHNwZWNpZmllZCBwYXRoIGlzIGdpdmVuLgoKRGFuaWVsICgxOSBKdW5lIDIwMDEpCi0gV2hlbiBhbiBGVFAgdHJhbnNmZXIgaXMgY3V0IG9mZiBkdXJpbmcgdHJhbnNmZXIsIGN1cmwgY291bGQgcHJlc2VudCBhIHRydWx5CiAgZ2FyYmFnZWQgZXJyb3IgbWVzc2FnZSBhbmQgaW4gd29yc3QgY2FzZSBkdW1wIGNvcmUuIFRoYW5rcyB0byBkZXRhaWxlZAogIHJlcG9ydHMgZnJvbSBTaGF3biBQb3Vsc29uIHdlIG5haWxlZCB0aGlzLgoKRGFuaWVsICgxMiBKdW5lIDIwMDEpCi0gU2FsdmFkb3IgROF2aWxhIHByb3ZpZGVkIGEgZml4IGZvciBGVFAgcmFuZ2UgZG93bmxvYWRzLgoKLSBBZGRlZCBhIGZldyBtb3JlIHRlc3QgY2FzZXMgZnJvbSB0aGUgZm9ybWVyIHRlc3Qgc3VpdGUgdG8gdGhlIG5ldyBmaWxlCiAgZm9ybWF0LiBXZSdyZSBub3cgYXQgYSB0b3RhbCBvZiAyNiB0ZXN0cy4KCkRhbmllbCAoMTEgSnVuZSAyMDAxKQotIGxpYmN1cmwncyB2ZXJzaW9uLWluZm8gd2FzIHdyb25nLCBhcyBub3RlZCBieSBib3RoIERvbWVuaWNvIEFuZHJlb2xpIGFuZAogIERhdmlkIE9kaW4uCgpEYW5pZWwgKDcgSnVuZSAyMDAxKQotIEr2cm4gZml4ZWQgdGhlIGN1cmxfdW5lc2NhcGUgZHVwbGljYXRlIGVudHJ5IGluIGxpYi9saWJjdXJsLmRlZgoKLSBJIG1hZGUgU1NMIGNlcnRpZmljYXRlIGZhaWx1cmUgbWVzc2FnZXMgdG8gYmUgbW9yZSBkZXRhaWxlZC4KClZlcnNpb24gNy44CgpEYW5pZWwgKDcgSnVuZSAyMDAxKQotIFNEYXZpbGEgcHJvdmlkZWQgYSByZXN1bWVkIGRvd25sb2FkIGZpeC4KClZlcnNpb24gNy44LXByZTQKCkRhbmllbCAoMSBKdW5lIDIwMDEpCi0gU3RlcmxpbmcgcHJvdmlkZWQgc29tZSBuZXcgUEhQIGV4YW1wbGVzLgoKLSBDaGFuZ2VkIHRoZSBDVlMgaGllcmFyY2h5IGFuZCB0aGUgb2xkZXIgY2hlY2tvdXQgaW5zdHJ1Y3Rpb24gZG9lcyBubyBsb25nZXIKICB3b3JrLiBXZSBtb3ZlZCB0aGUgZW50aXJlIHNvdXJjZSBjb2RlIGludG8gYSBDVlMgbW9kdWxlIG5hbWVkICdjdXJsJy4KCkRhbmllbCAoMzEgTWF5IDIwMDEpCi0gQ1VSTE9QVF9NVVRFIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuIEl0IGlzIHN0aWxsIHByZXNlbnQgaW4gdGhlIGluY2x1ZGUgZmlsZQogIHRvIG5vdCBjYXVzZSBjb21waWxlciBlcnJvcnMgZm9yIGFwcGxpY2F0aW9ucyB1c2luZyBpdCwgYnV0IGl0IGlzbid0IHVzZWQKICBhbnl3aGVyZSBpbiB0aGUgbGlicmFyeS4KClZlcnNpb24gNy44LXByZTMKCkRhbmllbCAoMzEgTWF5IDIwMDEpCi0gT25jZSBhbmQgZm9yIGFsbCBmaXhlZCB0aGUgX1JFRU5UUkFOVCBtZXNzIGZvciBTb2xhcmlzIGNvbXBpbGVzIHRvIHByZXNlbnQKICBsZXNzIHdhcm5pbmdzLgoKLSBTdGVybGluZyBIdWdoZXMgdGlyZWxlc3NseSBwb2ludHMgb3V0IGFuZCBjb3JyZWN0cyBteSBtaXN0YWtlcy4uLiEgU28sCiAgY3VybF9nbG9iYWxfaW5pdCgpIG5vdyBsZXRzIHRoZSBhcmd1bWVudCBmbGFncyAqU0VUKiB3aGF0IHBhcnRzIHRvCiAgaW5pdC4gQ1VSTF9HTE9CQUxfREVGQVVMVCBtYWtlcyBhIG5pY2UgZGVmYXVsdCwgQ1VSTF9HTE9CQUxfQUxMIGluaXRzIGFsbAogIGtub3duIHN1YnN5c3RlbXMgYW5kIENVUkxfR0xPQkFMX05PTkUgaW5pdHMgbm90aGluZyBtb3JlIHRoYW4gYWJzb2x1dGVseQogIG5lY2Vzc2FyeS4gTWFuIHBhZ2UgdXBkYXRlZCBhY2NvcmRpbmdseS4KCi0gRml4ZWQgdGhlIHN0cnRvay5oIGluY2x1ZGUgZmlsZSBhcyBpdCB3b3VsZG4ndCBjb21waWxlIG9uIGFsbCBwbGF0Zm9ybXMhCgpEYW5pZWwgKDMwIE1heSAyMDAxKQotIE1hZGUgbGliY3VybCBieSBkZWZhdWx0IGFjdCBhcyBpZiBDVVJMT1BUX01VVEUgYW5kIENVUkxPUFRfTk9QUk9HUkVTUyB3ZXJlCiAgc2V0IFRSVUUuIFNldCB0aGVtIHRvIEZBTFNFIHRvIG1ha2UgbGliY3VybCBtb3JlIHRhbGthdGl2ZS4gVGhlICpfTVVURQogIG9wdGlvbiBpcyBzdWJqZWN0IGZvciBjb21wbGV0ZSByZW1vdmFsLi4uCgpWZXJzaW9uIDcuOC1wcmUyCgpEYW5pZWwgKDMwIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiB3cm90ZSBhIG1ha2VmaWxlIGZvciBidWlsZGluZyBTb2xhcmlzIHBhY2thZ2VzLgoKLSBTdGVybGluZyBIdWdoZXMgYnJvdWdodCBmaXhlcyBmb3IgJ2J1aWxkY29uZicgKHRoZSBidWlsZC1mcm9tLUNWUyB0b29sKSBhbmQKICB3ZSBkaXNjdXNzZWQgYW5kIGFkZGVkIGEgZmV3IENVUkxfR0xPQkFMXyogZmxhZ3MgaW4gaW5jbHVkZS9jdXJsLmgKCi0gS2pldGlsIEphY29ic2VuIHByaXZhdGVseSBhbm5vdW5jZWQgaGlzIHB5dGhvbiBpbnRlcmZhY2UgdG8gbGliY3VybCwKICBhdmFpbGFibGUgYXQgaHR0cDovL3B5Y3VybC5zb3VyY2Vmb3JnZS5uZXQvCgpEYW5pZWwgKDI5IE1heSAyMDAxKQotIFN0ZXJsaW5nIEh1Z2hlcyBmaXhlZCBhIHN0cnRvaygpIHByb2JsZW0gaW4gbGliY3VybC4gSXQgaXMgbm90IGEgdGhyZWFkLQogIHNhZmUgZnVuY3Rpb24uIE5vdyBjb25maWd1cmUgY2hlY2tzIGZvciBhIHRocmVhZC1zYWZlIHZlcnNpb24sIGFuZAogIGxpYi9zdHJ0b2suYyBvZmZlcnMgb25lIGZvciB0aGUgc3lzdGVtcyB0aGF0IGRvbid0IGNvbWUgd2l0aCBvbmUgaW5jbHVkZWQhCgotIE1ldHRndXQgSmFtYWxsYSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIHdhcyB3cml0dGVuCiAgdG8gc3RkZXJyIGV2ZW4gdGhvdWdoIC0tc3RkZXJyIHJlZGlyZWN0aW9uIHdhcyB1c2VkLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEkgbW92ZWQgb3V0IHRoZSBsaXN0IG9mIGNvbnRyaWJ1dG9ycyBmcm9tIHRoZSBjdXJsLjEgbWFuIHBhZ2UgYW5kIG1hZGUgYQogIHNlcGFyYXRlIGRvY3MvVEhBTktTIGZpbGUuIEl0IG1ha2VzIHRoZSBsaXN0IGVhc2llciB0byBmaW5kLCBhbmQgbWFkZSBpdAogIGVhc2llciBmb3IgbWUgdG8gbWFrZSBhIHNlcGFyYXRlIHdlYiBwYWdlIHdpdGggdGhhdCBzYW1lIGluZm9ybWF0aW9uLgoKICBJIHJlYWxseSBkbyB3YW50IGFsbCB5b3UgZ3V5cyBtZW50aW9uZWQgaW4gdGhlcmUgdG8gZmVlbCB5b3UgZ2V0IHRoZSBjcmVkaXQKICB5b3UgZGVzZXJ2ZS4KCi0gbGliL2Vhc3kuYyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBpbiB0aGUgNy44LXByZTEgZHVlIHRvIGEgc2lsbHkgbWlzdGFrZQoKVmVyc2lvbiA3LjgtcHJlMQoKRGFuaWVsICgyOCBNYXkgMjAwMSkKLSBjdXJsLWNvbmZpZyBub3cgc3VwcG9ydHMgJy0tdmVybnVtJyB0aGF0IG91dHB1dHMgYSBwbGFpbiBoZXhhZGVjaW1hbCB2ZXJzaW9uCiAgb2YgdGhlIGxpYmN1cmwgdmVyc2lvbiBudW1iZXIgKHVzaW5nIDggYml0cyBmb3IgZWFjaCAzIG51bWJlcnMpLiBWZXJzaW9uCiAgNy43LjQgYXBwZWFycyBhcyAwNzA3MDQKCi0gV3JvdGUgbWFuIHBhZ2VzIGZvciBjdXJsX2dsb2JhbF9pbml0IGFuZCBjdXJsX2dsb2JhbF9jbGVhbnVwLi4uCgotIFQuIEJoYXJhdGggYnJvdWdodCBuZXdzIGFib3V0IHRoZSB1c2FnZSBvZiB0aGUgT3BlblNTTCBpbnRlcmZhY2UgdGhhdCB3YXMKICBub3QgcHJldmlvdXNseSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24gYW5kIHRodXMgY2F1c2VkIGxpYmN1cmwgdG8gbGVhawogIG1lbW9yeS4gIFRoZSBvbmx5IHNvbWV3aGF0IHNhbmUgYXBwcm9hY2ggdG8gZml4IHRoaXMgZGlsZW1tYSwgaXMgYWRkaW5nIHR3bwogIHR3byBuZXcgZnVuY3Rpb25zIGN1cmxfZ2xvYmFsX2luaXQoKSBhbmQgY3VybF9nbG9iYWxfY2xlYW51cCgpIHRoYXQgc2hvdWxkCiAgYmUgY2FsbGVkICpPTkNFKiBieSB0aGUgYXBwbGljYXRpb24gdXNpbmcgbGliY3VybC4gVGhlIGluaXQgc2hvdWxkIGJlIGRvbmUKICBvbmx5IGF0IHN0YXJ0dXAsIG5vIG1hdHRlciBob3cgbWFueSB0aHJlYWRzIHRoZSBhcHBsaWNhdGlvbiBpcyBnb25uYSB1c2UsCiAgYW5kIHRoZSBjbGVhbnVwIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaGFzIGZpbmlzaGVkIHVzaW5nCiAgbGliY3VybCBjb21wbGV0ZWx5LgoKICAqKiogVVBHUkFERSBOT1RJQ0UgKioqCgogIElmIHlvdSB3cml0ZSBhcHBsaWNhdGlvbnMgdXNpbmcgbGliY3VybCwgeW91IHJlYWxseSB3YW50IHRvIHVzZSB0aGUgdHdvCiAgZnVuY3Rpb25zIG1lbnRpb25lZCBhYm92ZSAhISEKCiAgSSBjYW4ndCBzYXkgSSB0aGluayB0aGlzIGlzIGEgdmVyeSBiZWF1dGlmdWwgc29sdXRpb24sIGJ1dCBhcyBPcGVuU1NMCiAgaW5zaXN0cyBvbiBtYWtpbmcgbG90cyBvZiBzdHVmZiBvbiBhICJnbG9iYWwiIHNjb3BlLCB3ZSdyZSBmb3JjZWQgdG8gd2FsawogIHRoZSBwYXRoIHRoZXkgcG9pbnQgdXMgdG8uCgotIE1vdmluZyBtb3JlIHRlc3QgY2FzZXMgaW50byB0aGUgbmV3IGZpbGUgZm9ybWF0LgoKVmVyc2lvbiA3LjcuNC1wcmUzCgpEYW5pZWwgKDIzIE1heSAyMDAxKQotIEludHJvZHVjZWQgYSBuZXcgZmlsZSBmb3JtYXQgZm9yIHN0b3JpbmcgdGVzdCBjYXNlcywgYW5kIHRodXMgSSBoYWQgdG8KICBtb2RpZnkgYWxsIHRoZSBwZXJsIHRlc3Qgc2NyaXB0cyBhbmQgbW9yZSAoSSBhZGRlZCBhIG5ldyBvbmUpLiBJIGhhdmUgbm90CiAgInBvcnRlZCIgYWxsIHRoZSBvbGQgdGVzdCBjYXNlcyB0byB0aGUgbmV3IGZvcm1hdCB5ZXQsIGJ1dCBpdCdsbCBjb21lLgoKICBUaGUgbWFpbiBhZHZhbnRhZ2Ugb2YgdGhpcyBuZXcgZm9ybWF0IGlzIHRoYXQgYWxsIHRlc3QgZGF0YSBmb3IgZWFjaCB0ZXN0CiAgY2FzZSBpcyBzdG9yZWQgaW4gYSBzaW5nbGUgZmlsZS4gSXQgZ2l2ZXMgYSBiZXR0ZXIgb3ZlcnZpZXcgZm9yIGVhY2ggdGVzdAogIGNhc2UgYW5kIGEgbG90IGxlc3MgZmlsZXMuCgotIEFuZHLpcyBHYXJj7WEgYnJvdWdodCBhIGZpeCBmb3IgdGhlIG5ldHNjYXBlL21vemlsbGEgY29va2llIGZpbGUgcGFyc2luZwogIGZ1bmN0aW9uLCBhcyBpdCB0dXJucyBvdXQgaXQgZG9lc24ndCBhbHdheXMgc3RvcmUgdGhlIHBhdGghCgpEYW5pZWwgKDIyIE1heSAyMDAxKQotIEFzIHdhcyByZXBvcnRlZCBhbm9ueW1vdXNseSwgd2hlbiBGQUlMT05FUlJPUiB3YXMgdXNlZCwgdGhlIGh0dHBjb2RlIHdhcwogIG5vdCBzdG9yZWQgcHJvcGVybHkgYW5kIHRodXMgd2Fzbid0IHBvc3NpYmx5IHRvIHJlYWQgYWZ0ZXIgYSB0cmFuc2ZlciB3aXRoCiAgdGhlIGN1cmxfZWFzeV9nZXRpbmZvKCkgZnVuY3Rpb24uIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCi0gSW5zdGFsbGVkIGFuZCBtYWRlIHVzZSBvZiB0aGUgZm9sbG93aW5nIHRvb2wgdmVyc2lvbnM6CiAgICBhdXRvY29uZiAyLjUwCiAgICBsaWJ0b29sIDEuNAogICAgYXV0b21ha2UgMS40LXAxCgogIEkgd291bGRuJ3QgcmVjb21tZW5kIGFueSBkZXZlbG9wZXIgdG8gdHJ5IHRvIGdlbmVyYXRlIHRoaW5ncyB3aXRoIG9sZGVyCiAgdmVyc2lvbnMgdGhhbiB0aGVzZS4gQnVpbGRpbmcgZnJvbSBDVlMgd2lsbCBwcm9iYWJseSBtb3JlIG9yIGxlc3MgcmVxdWlyZQogIGF0IGxlYXN0IHRoZXNlIHZlcnNpb25zLgoKICBBcyBhIHJlc3VsdCBvZiB0aGlzLCB0aGUgY29uZmlndXJlIHNjcmlwdCBncmV3IHRvIG1vcmUgdGhhbiBkb3VibGUgaXRzCiAgcHJldmlvdXMgc2l6ZSEKCiAgQXJrYWRpdXN6IE1pc2tpZXdpY3ogaGVscGVkIG1lIGJ5IHBvaW50aW5nIG91dCBJIGhhZCB0byByZW1vdmUgbXkKICBhY2luY2x1ZGUubTQgZmlsZSBiZWZvcmUgSSBjb3VsZCBnZXQgaXQgd29ya2luZyEKCkRhbmllbCAoMjEgTWF5IDIwMDEpCi0gSSBtYWRlIGZ0cHM6Ly8gd29yay4gQWRkZWQgdGVzdCBjYXNlIDQwMCB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLCBhcyB0aGUKICBmaXJzdCBmdHBzOi8vIHRlc3QgY2FzZS4gUmVxdWlyZXMgc3R1bm5lbC4KCi0gQWxzbyBtYWRlIHRoZSB0ZXN0IGNhc2VzIHRoYXQgcnVucyBzc2wgdGVzdHMgbm90IHJ1biBpZiBsaWJjdXJsIGlzbid0IGJ1aWx0CiAgd2l0aCBzc2wgc3VwcG9ydC4KCkRhbmllbCAoMTkgTWF5IDIwMDEpCi0gTWFkZSB0aGUgY29uZmlndXJlIG5vdCBhZGQgYW55IGV4dHJhIC1MIExERkxBR1Mgb3IgLUkgQ1BQRkxBR1MgdW5sZXNzIHRoZXkKICBhcmUgYWN0dWFsbHkgbmVlZGVkLiBBbGJlcnQgQ2hpbidzIGFuZCBEb21lbmljbyBBbmRyZW9saSdzIHN1Z2dlc3Rpb25zCiAgaGVscGVkIG91dC4KClZlcnNpb24gNy43LjQtcHJlMgoKRGFuaWVsICgxOCBNYXkgMjAwMSkKLSBOaWNlciBjb25maWd1cmUtY2hlY2sgZm9yIHRoZSBPcGVuU1NMIGhlYWRlcnMsIHdoaWNoIHRoZW4gc2V0cyB0aGUgcHJvcGVyCiAgdmFyaWFibGUgdG8gaGF2ZSBjdXJsLWNvbmZpZyBiZSBnb29kLiAoQWxiZXJ0IENoaW4gcHJvdmlkZWQgdGhlIGZpeCkKCi0gRm9yIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIHRoZWl3IG93biAnc3RybGNhdCgpJyBsaWJjdXJsIHByb3ZpZGVzIGl0cyBvd24uCiAgSXQgd2FzIG5vdyByZW5hbWVkIHRvIHByZXZlbnQgY29sbGlkZXMgd2l0aCBvdGhlciBsaWJzLiAoQWZ0ZXIgZGlzY3Vzc2lvbnMKICB3aXRoIFN0ZXJsaW5nIEh1Z2hlcyBhbmQgdGhlIGltcGxpY2F0aW9ucyB0aGlzIGhhZCBvbiBQSFAgYnVpbGRzLikKCkRhbmllbCAoMTcgTWF5IDIwMDEpCi0gQ29sbSBCdWNrbGV5IHBvc3RlZCBhIGRldGFpbGVkIGJ1ZyByZXBvcnQgb24gKHRoZSBkZWJpYW5pemVkKSA3LjcuMywgdGhhdAogIHR1cm5lZCBvdXQgdG8gYmUgYSBwcm9ibGVtIHdpdGggdGhlIGRlYmlhbi1idWlsdCA3LjcuMy1wYWNrYWdlIHRoYXQKICBjb250YWluZWQgZmlsZXMgZnJvbSB0aGUgNy43LjIgcmVsZWFzZSEKCi0gSSBhZGRlZCB0aGUgQ1VSTEVfQUxSRUFEWV9DT01QTEVURSBhZ2FpbiwgYnV0IHdpdGggYSBmYWtlIHZhbHVlLCBqdXN0IHRvCiAgbWFrZSBwcm9ncmFtcyB0aGF0IHVzZSBpdCwgbm90IGZhaWwgd2hlbiBjb21waWxpbmcgYWdhaW5zdCB0aGlzIHZlcnNpb24gb2YKICBsaWJjdXJsLgoKRGFuaWVsICgxNCBNYXkgMjAwMSkKLSBQYXdlbCBBLiBHYWpkYSBmaXhlZCBhIHByb2JsZW0gd2l0aCByZXN1bWVkIHRyYW5zZmVycyBvbiByZS11c2VkIHBlcnNpc3RlbnQKICBjb25uZWN0aW9ucy4KClZlcnNpb24gNy43LjQtcHJlMQoKRGFuaWVsICgxNCBNYXkgMjAwMSkKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gZml4ZWQgRlRQIFBPUlQgZm9yIElQdjYtZW5hYmxlZCBsaWJjdXJsLgoKLSBBZGRlZCB0aGUgZmlyc3QgSFRUUFMgdGVzdCB0byB0aGUgdGVzdCBzdWl0ZSBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICgxMiBNYXkgMjAwMSkKLSBKdWtrYSBQaWhsIHN1Z2dlc3RlZCB0aGF0IGlmIChsaWIpY3VybCBpcyB0b2xkIHRvIHZlcmlmeSB0aGUgcGVlcidzCiAgY2VydGlmaWNhdGUgYW5kIHRoZSBwZWVyIGNhbid0IGJlIHZlcmlmaWVkLCBpdCBzaG91bGQgZmFpbCBhbmQgcmV0dXJuIGEKICBwcm9wZXIgZXJyb3IgY29kZS4gSSBhZGRlZCBhIGJyYW5kIG5ldyBlcnJvciBjb2RlIG5hbWVkCiAgQ1VSTEVfU1NMX1BFRVJfQ0VSVElGSUNBVEUgZm9yIHRoaXMgcHVycG9zZS4KCkRhbmllbCAoMTEgTWF5IDIwMDEpCi0gQXMgd2FzIGRpc2N1c3NlZCB3aXRoIEZyZWRlcmljIExlcGllZCBhIHdoaWxlIGFnbywgSSBub3cgbWFkZSBsaWJjdXJsIG5vdAogIHJldHVybiBlcnJvciBldmVuIHRob3VnaCBubyBkYXRhIHdhcyB0cmFuc2ZlcmVkIG9uIHVwbG9hZC9kb3dubG9hZCByZXN1bWUKICB3aGVuIHRoZSBubyB0cmFuc2ZlciBpcyBuZWVkZWQuIFRoZSBDVVJMRV9BTFJFQURZX0NPTVBMRVRFIGVycm9yIHdhcyByZW1vdmVkCiAgZnJvbSB0aGUgaGVhZGVyIGZpbGUgdG8gbWFrZSBhbnkgaW1wbGVtZW5hdG9yIHRoYXQgdXNlcyB0aGF0IHRvIGJlIGF3YXJlIG9mCiAgdGhlIGZhY3QgdGhhdCBpdCBjYW4ndCBiZSByZXR1cm5lZCBhbnltb3JlIQoKLSBJbXByb3ZlZCBnZW5lcmFsIGhlYWRlci1wYXJzaW5nIHRvIGJldHRlciBhbGxvdyB3aGl0ZSBzcGFjZXMgYW5kIG1vcmUuCgotIFJvZG5leSBTaW1tb25zIHByb3ZlZCB0aGUgZml4IEkgZGlkIHllc3RlcmRheSB3YXMgYmFkIGFuZCBJIGhhZCB0byBwb3N0CiAgYW5vdGhlciBvbmUuCgotIEluZ28gV2lsa2VuIHBhdGNoZWQgYXdheSB0d28gcmVkaXJlY3QgcHJvYmxlbXMgbW9yZSEKICAKRGFuaWVsICgxMCBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgY29ycmVjdGx5IG5vdGVkIHRoYXQgdGhlIHNwYWNlLWFmdGVyLWhlYWRlciBwcm9ibGVtIHdpdGgKICBMb2NhdGlvbjogaXMgcHJlc2VudCBvbiBzZXZlcmFsIG90aGVyIHBsYWNlcyBpbiB0aGUgbGliY3VybCBzb3VyY2VzLgoKLSBJbmdvIFdpbGtlbiBwYXRjaGVkIGF3YXkgYSBwcm9ibGVtIGxpYmN1cmwgaGFkIHdoZW4gZm9sbG93aW5nIExvY2F0aW9uOgogIGhlYWRlcnMgd2l0aCBhbiBleHRyYSBzcGFjZSBhZnRlciB0aGUgY29sb24uCgotIFJvZG5leSBTaW1tb25zIGZvdW5kIG91dCB0aGF0IG11bHRpcGxlIEZUUCB0cmFuc2ZlcnMgZGlkIG5vdCB0cmVhdCByZWxhdGl2ZQogIGRpcmVjdG9yaWVzIGNvcnJlY3RseS4KCkRhbmllbCAoOSBNYXkgMjAwMSkKLSBHZXR0aW5nIGFuIEZUUCBmaWxlIHdpdGggQ1VSTE9QVF9OT0JPRFkgc2V0IChvciAtSSBmcm9tIHRoZSBjb21tYW5kIGxpbmUpLAogIG1ha2VzIGN1cmwgdXNlIHRoZSBub24tc3RhbmRhcmQgZnRwIGNvbW1hbmQgIlNJWkUiLiBJZiBpdCBmYWlsZWQsIGxpYmN1cmwKICByZXR1cm5lZCBlcnJvci4gU3RhcnRpbmcgbm93LCBpdCBqdXN0IGRvbid0IG91dHB1dCB0aGUgZmlsZSBzaXplIGluc3RlYWQuCiAgQW5vbnltb3VzIGJ1ZyByZXBvcnQuCgotIHN0dW5uZWwucG0gd2FzIGFjY2lkZW50YWxseSBsZWZ0IG91dCBmcm9tIHRoZSByZWxlYXNlIGFyY2hpdmUsIGl0IGlzIG5vdwogIGFkZGVkIChzdHVubmVsIGlzIG5lZWRlZCB0byBydW4gdGhlIGh0dHBzLXRlc3RzIGluIHRoZSB0ZXN0IHN1aXRlKQogIApEYW5pZWwgKDcgTWF5IDIwMDEpCi0gQ29ycmVjdGVkIHR3byBtaW5vciBjb21waWxlciB3YXJuaW5ncyBkdWUgdG8gdGhlIEZJTEUgKiB0byB2b2lkICogY29udmVyc2lvbgogIHRoYXQgSSBtaXNzZWQgYXQgdHdvIHBsYWNlcy4gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIHBhdGNoZXMuIFNhbmRlciBHYXRlcwogIGZpbGVkIGEgYnVnIHJlcG9ydCBvbiB0aGlzLgoKVmVyc2lvbiA3LjcuMwoKRGFuaWVsICg0IE1heSAyMDAxKQotIEFsbCBjYWxsYmFjayBmdW5jdGlvbnMgbm93IHRha2UgJ3ZvaWQgKicgaW5zdGVhZCBvZiAnRklMRSAqJy4gVGhpcyBpcyBtYWRlCiAgdGhpcyB3YXkgdG8gbWFrZSBpdCBtb3JlIG9idmlvdXMgdG8gcGVvcGxlIHRoYXQgYW55dGhpbmcgY2FuIGJlIHBhc3NlZCB0bwogIHRoZW0gKGJ5IHVzaW5nIHRoZSBhcHJvcHJpYXRlIG9wdGlvbikuIEFmdGVyIGRpc2N1c3Npb25zIHdpdGggU3RlcmxpbmcKICBIdWdoZXMuCgpEYW5pZWwgKDMgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIGEgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBwcm9ibGVtIHdpdGggcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gdGhhdCBtYWRlIGxpYmN1cmwgZmFpbCBpZiB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHVzZWQgbWl4ZWQKICBjaHVua2VkIGFuZCBub24tY2h1bmtlZCB0cmFuc2ZlcnMuCgotIENyaXMgQmFpbGlmZiBmaXhlZCBhIGJhZCB0cmVhdG1lbnQgb2YgMzA0LXJlcGxpZXMsIGFzIHRoZXkgd291bGQgbm90IGJlCiAgdHJlYXRlZCBhcyBjb250ZW50LWxlbmd0aCAwIHJlcGxpZXMgYnV0IHdvdWxkIGNhdXNlIGEgImhhbmciIHVudGlsIHRoZQogIHNlcnZlciB0aW1lZC1vdXQgYW5kIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4KCi0gQnJhZCBCdXJkaWNrIGZvdW5kIGEgbWlub3IgcHJvYmxlbSBpbiB0aGUgZG9jcy9leGFtcGxlcy9NYWtlZmlsZS5hbQoKRGFuaWVsICgyNyBBcHJpbCAyMDAxKQotIFVwZGF0ZWQgdGhlIElOVEVSQUxTIGRvY3VtZW50IGFnYWluLiBJdCB3YXMgbGFnZ2luZyBhIGJpdC4gSSB0aGluayBJIG1hZGUgaXQKICBtb3JlIGVhc3kgdG8gZm9sbG93IG5vdyBhcyB3ZWxsLgoKLSBCcmFkIEJ1cmRpY2sgZm91bmQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuIGN1cmwgcmVjZWl2ZWQKICBhICJDb250ZW50LUxlbmd0aDogMCIgaGVhZGVyLgoKLSBHaXVzZXBwZSBEJ0FtYnJvc2lvIHdhcyBmaXJzdCBvdXQgdG8gcmVwb3J0IHRoYXQgVEVMTkVUIGRvZXNuJ3Qgd29yayBpbiBjdXJsCiAgY29tcGlsZWQvYnVpbHQgb24gd2luMzIuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIHVuaXhlcyB0aG91Z2ghCgotIERhdmUgSGFtaWx0b24gcmVwb3J0ZWQgd2VpcmQgcHJvYmxlbXMgd2l0aCBDVVJML1BIUCB0aGF0IEkgcmVhbGx5IGNhbid0CiAgZXhwbGFpbiBhdCB0aGUgbW9tZW50LiBJJ20gaG9waW5nIG9uIHNvbWUgaGVscCBmcm9tIHRoZSBQSFAgY3Jldy4KCkRhbmllbCAoMjYgQXByaWwgMjAwMSkKLSBJIHJld3JvdGUgdGhlIEZUUCBjb21tYW5kIHJlc3BvbnNlIGZ1bmN0aW9uLiBJIGhhZCB0byBkbyBpdCB0byBtYWtlIGZ0cHMKICB3b3JrLCBhcyB0aGUgT3BlblNTTCByZWFkKCktZnVuY3Rpb24gZGlkbid0IHdvcmsgdGhlIHNhbWUgd2F5IHRoZSBub3JtYWwKICB1bml4IHJlYWQoKSBkb2VzLCBidXQgaXQgd2FzIGFsc28gYSBodWdlIHBlcmZvcm1hbmNlIGJvb3N0LiBQcmV2aW91c2x5IHRoZQogIGZ1bmN0aW9uIHJlYWQgb25lIGJ5dGUgYXQgYSB0aW1lLCBub3cgaXQgcmVhZHMgdmVyeSBsYXJnZSBjaHVua3MsIGFuZCBpdAogIG1ha2VzIGEgbm90YWJsZSBzcGVlZCBkaWZmZXJlbmNlLgoKRGFuaWVsICgyNSBBcHJpbCAyMDAxKQotIENvbm5lY3Rpb24gcmUtdXNlIHdoZW4gbm90IHVzaW5nIGEgcHJveHkgZGlkbid0IHdvcmsgcHJvcGVybHkgZm9yCiAgbm9uLWRlZmF1bHQgcG9ydCBudW1iZXJzLgoKRGFuaWVsICgyNCBBcHJpbCAyMDAxKQotIEkndmUgbm90aWNlZCB0aGF0IEZUUFMgZG9lc24ndCB3b3JrLiBXZSBhdHRlbXB0IHRvIHVzZSBzc2wgZXZlbiBmb3IgdGhlCiAgZGF0YSB0cmFuc2Zlciwgd2hpY2ggY2F1c2VzIHRoZSB0cmFuc2ZlciB0byAnaGFuZycuLi4gV2UgbmVlZCB0byBmaXggdGhpcy4KCi0gSW1wcm92ZWQgdGhlIHRlc3Qgc3VpdGUgdG8gdXNlICdzdHVubmVsJyB0byBkbyBIVFRQUyBhbmQgRlRQUyB0ZXN0aW5nIG9uCiAgdGhlIGFscmVkeSB3cml0dGVuIHBlcmwgc2VydmVycyBlYXNpbHkuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDEpCi0gVGhlIE9wZW5TU0wgdmVyc2lvbiBzdHJpbmcgcmVjZW50bHkgbW9kaWZpZWQgZGlkbid0IHplcm8gdGVybWluYXRlIG9uZQogIG9mIHRoZSBnZW5lcmF0ZWQgc3RyaW5ncyBwcm9wZXJseSwgd2hpY2ggY291bGQgbGVhZCB0byBhIGNyYXNoIG9yIHNpbXBseQogIHdlaXJkIHZlcnNpb24gc3RyaW5nIG91dHB1dCEKClZlcnNpb24gNy43LjIKCkRhbmllbCAoMjIgQXByaWwgMjAwMSkKLSBSb3NpbWlsZG8gZGEgU2lsdmEgdXBkYXRlZCB0aGUgTWFrZWZpbGVzIGZvciBCb3JsYW5kL1dpbmRvd3MuCgotIEVyaWMgUmF1dG1hbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHRoYXQgd291bGQKICBsZWFkIHRvIGJyb2tlbiBIb3N0OiBoZWFkZXJzIGluIHRoZSBzZWNvbmQgSFRUUCByZXF1ZXN0LgoKRGFuaWVsICgyMCBBcHJpbCAyMDAxKQotIEFkZGVkIG1hbiBwYWdlcyBmb3IgdGhlIGN1cmxfc3RyZXF1YWwoKSBhbmQgY3VybF9tcHJpbnRmKCkgZmFtaWxpZXMuIFdyb3RlCiAgYSAnbGliY3VybCBvdmVydmlldycgbWFuIHBhZ2UuCgotIFNwZWxsLWZpeGVkIHNvbWUgZG9jdW1lbnRzLgoKLSBTLiBNb29uZXNhbXkgY29ycmVjdGVkIG1pc3Rha2VzIGluIHRoZSBtYW4gcGFnZS4KCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIHRoZSBjdXJsX3NsaXN0cyBvcHRpb25zIGluIHRoZSBwZXJsIGludGVyZmFjZSwgcHJlc2VudAogIHNlcGFyYXRlbHkgaW4gdGhlIEN1cmw6OmVhc3kgMS4xLjQgcGFja2FnZS4KCkRhbmllbCAoMTkgQXByaWwgMjAwMSkKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHJlbW92ZWQgdGhlIGRlY2ltYWxzIGZyb20gdGhlIHNpemUgdmFyaWFibGVzIGluIHRoZQogIC0td3JpdGUtb3V0IG91dHB1dC4gV2UgaGFyZGx5IGV2ZXIgZ2V0IGZyYWN0aW9uIG9mIGJ5dGVzISA6LSkKClZlcnNpb24gNy43LjItcHJlMQoKRGFuaWVsICgxOSBBcHJpbCAyMDAxKQoKLSBBbGJlcnQgQ2hpbiBwcm92aWRlZCBhIGNvbmZpZ3VyZSBwYXRjaCBmb3IgdGhlIEFDX1NZU19MQVJHRUZJTEUgbWFjcm8uCgpEYW5pZWwgKDE4IEFwcmlsIDIwMDEpCi0gSW5wdXQgZnJvbSBNaWNoYWVsIE1lYWxsaW5nIG1hZGUgbWUgYWRkIC0tZmVhdHVyZSB0byBjdXJsLWNvbmZpZy4gSXQKICBkaXNwbGF5cyBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhhdCBoYXZlIGJlZW4gYnVpbHQtaW4gaW4gdGhlIGN1cnJlbnQKICBsaWJjdXJsLiBUaGUgY3VycmVudGx5IGF2YWlsYWJsZSBmZWF0dXJlcyB0aGF0IGNhbiBiZSBsaXN0ZWQgYXJlOiBTU0wsIEtSQjQKICBhbmQgSVB2Ni4KCi0gSSBjb21taXR0ZWQgQ3JpcyBhbmQgR2VvcmcncyBwZXJsIGludGVyZmFjZSB3b3JrLiBUaGV5J3ZlIGdvdCBjYWxsYmFja3MKICB3b3JraW5nIGFuZCBvcHRpb25zIHRoYXQgcmVjZWl2ZXMgdGhvc2Ugc2xpc3QgcG9pbnRlcnMuCgotIFB1bmVldCBQYXdhaWEgZGV0ZWN0ZWQgYSBwcm9ibGVtIHdpdGggcmVzdW1lZCBkb3dubG9hZHMgdGhhdCB1c2UgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zIGFuZCBJIG1hZGUgYSByYXRoZXIgbGFyZ2Ugd3JpdGV1cCB0byBjb3JyZWN0IHRoaXMuIEl0IGlzCiAgaW1wb3J0YW50IHRoYXQgYWxsIHNlc3Npb24tZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdCBhbmQgbm90CiAgaW4gdGhlIG1haW4gc3RydWN0IGFzIHRoaXMgcHJldmlvdXNseSBkaWQuCgpEYW5pZWwgKDE3IEFwcmlsIDIwMDEpCi0gRnJlZGVyaWMgTGVwaWVkIGZpeGVkIGEgZnRwIHJlc3VtZWQgZG93bmxvYWQgcHJvYmxlbSBhbmQgaW50cm9kdWNlZCBhIG5ldwogIGVycm9yIGNvZGUgdGhhdCBsZXRzIGFwcGxpY2F0aW9ucyBiZSBhYmxlIHRvIGRldGVjdCB3aGVuIGEgcmVzdW1lZCBkb3dubG9hZAogIGFjdHVhbGx5IGRpZG4ndCBkb3dubG9hZCBhbnl0aGluZyBzaW5jZSB0aGUgd2hvbGUgZmlsZSBpcyBhbHJlYWR5IHByZXNlbnQuCiAgU2hvdWxkIHRoaXMgcmV0dXJuIE9LIGluc3RlYWQ/CgotIEkgYWRkZWQgJ2N1cmwtY29uZmlnLmluJyB0byB0aGUgcm9vdCBkaXIgYW5kIGNvbmZpZ3VyZSBzY3JpcHQuIE5vdywgYQogIGN1cmwtY29uZmlnIHNjcmlwdCBpcyBtYWRlIHdoZW4gY3VybCBpcyBidWlsdC4gVGhlIHNjcmlwdCBjYW4gYmUgdXNlZCB0bwogIGZpZ3VyZSBvdXQgY29tcGlsZSB0aW1lIG9wdGlvbnMgdXNlZCB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0LCB3aGljaCBpbiB0dXJuCiAgc2hvdWxkIGJlIG9wdGlvbnMgWU9VIHNob3VsZCB1c2UgdG8gYnVpbGQgYXBwbGljYXRpb25zIHRoYXQgdXNlIGxpYmN1cmwuCgogIFRoaXMgKi1jb25maWcgc3R5bGUgaXMgbm90IGEgbmV3IGlkZWEsIGJ1dCBzb21ldGhpbmcgdGhhdCBoYXMgYmVlbiB1c2VkCiAgc3VjY2Vzc2Z1bGx5IGluIG90aGVyIChsaWJyYXJ5IGJhc2VkKSBwcm9qZWN0cy4KCi0gUGhpbCBLYXJuIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB3cm9uZ2x5IGRpZCBub3QgYWx3YXlzIHVzZSBHTVQgdGltZSB6b25lCiAgZm9yIHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBzdHlsZSBoZWFkZXJzLgoKLSBHZW9yZyBTY2h3YXJ6IHBvaW50ZWQgb3V0IGFuIGV4dHJhIG5lZWRlZCAjaW5jbHVkZSBmaWxlIG5lZWRlZCBpbiBzcmMvbWFpbi5jCiAgZm9yIGN1cmwgdG8gYnVpbGQgb24gVWx0cml4LgoKRGFuaWVsICgxMSBBcHJpbCAyMDAxKQotIENyaXMgQmFpbGlmZiBwb2ludGVkIG91dCB0d28gcHJvYmxlbXMgdGhhdCBJIGNvcnJlY3RlZC4gRmlyc3QsIGxpYmN1cmwncyB1c2UKICBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSFRUUF9QUk9YWSBpbiB1cHBlcmNhc2UgbWF5IGJlY29tZSBhIHNlY3VyaXR5CiAgaGF6YXJkIHdoZW4gcGVvcGxlIHVzZSBsaWJjdXJsIGluIGEgc2VydmVyL2NnaSBzaXR1YXRpb24gd2hlcmUgdGhlIHNlcnZlcgogIHNldHMgdGhlIEhUVFBfKi12YXJpYWJsZXMgYWNjb3JkaW5nIHRvIGluY29taW5nIGhlYWRlcnMgaW4gdGhlIEhUVFAKICByZXF1ZXN0LiBUaHVzLCBhICJQcm94eToiLWhlYWRlciB3b3VsZCBzZXQgdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZSEKCiAgVGhlbiwgaW52b2tpbmcgY3VybF9lYXN5X3BlcmZvcm0oKSB3aXRob3V0IGhhdmluZyBhbiBVUkwgc2V0IGNhdXNlZCBhIGNyYXNoLgoKLSBTLiBNb29uZXNhbXkgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZSBjdXJsIHVzZSBub24tYmxvY2tpbmcgY29ubmVjdHMgb24KICB3aW5kb3dzIHdoZW4gY29ubmVjdGlvbiB0aW1lb3V0IGlzIHNldCwgYXMgaXQgYWxsb3dzIHdpbmRvd3MgdXNlcnMgdG8gc2V0CiAgdGhhdCB0aW1lb3V0IQoKLSBIaXJvdGFrYSBNYXRzdXl1a2kgd3JvdGUgYSBSdWJ5IGludGVyZmFjZSB0byBsaWJjdXJsIQoKLSBDcmlzIEJhaWxpZmYsIEZvcnJlc3QgQ2Fob29uIGFuZCBHZW9yZyBIb3JuIHdvcmsgb24gdGhlIFBlcmwgaW50ZXJmYWNlLgoKLSBJJ3ZlIHdyaXR0ZW4gYSBmaXJzdCBzaG90IGF0IGEgSmF2YSBpbnRlcmZhY2UgdG8gbGliY3VybC4gTWFueSB0aGFua3MgdG8KICBEYW5pZWwgTWFyZWxsIGZvciB0aXJlbGVzc2x5IGFuc3dlcmluZyB0byBhbGwgbXkgYmFzaWMgSmF2YSBxdWVzdGlvbnMuIEl0CiAgd29ya3MsIGJ1dCBpdCBpcyBzdGlsbCB2ZXJ5IGJhc2ljLgoKRGFuaWVsICgxMCBBcHJpbCAyMDAxKQotIFRoZSBwcm9ncmVzcyBkaXNwbGF5IGNvdWxkIGdldCBzaWxseSB3aGVuIGRvaW5nIG11bHRpcGxlIGZpbGUgdHJhbnNmZXJzLCBhcwogIGl0IHdhc24ndCBwcm9wZXJseSByZXNldCBiZXR3ZWVuIHRyYW5zZmVycyEKCi0gRGlzY3Vzc2lvbnMgd2l0aCBDcmlzIEJhaWxpZmYgd2hvIHdyaXRlcyBhIFBlcmwgaW50ZXJmYWNlIHRvIGxpYmN1cmwsIG1hZGUKICBtZSBhZGQgQ1VSTE9QVF9IRUFERVJGVU5DVElPTi4gSXQgY2FuIGJlIHVzZWQgdG8gc2V0IGEgc2VwYXJhdGUgY2FsbGJhY2sKICBmdW5jdGlvbiBmb3Igd3JpdGluZyBoZWFkZXJzLiBQcmV2aW91c2x5IHlvdSBjb3VsZCBvbmx5IHNldCBhIGRpZmZlcmVudCBGSUxFCiAgKiB3aGVuIGhlYWRlcnMgYXJlIHdyaXR0ZW4gZnJvbSB3aXRoaW4gbGliY3VybC4KCkRhbmllbCAoNyBBcHJpbCAyMDAxKQotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBwcm9ibGVtIGluIGN1cmxfZXNjYXBlKCkgYW5kIHBvaW50ZWQgb3V0IGEgZmxhdyBpbgogIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlLgoKRGFuaWVsICg2IEFwcmlsIDIwMDEpCi0gQWRqdXN0ZWQgdGhlIHZlcnNpb24gY29kZSB0byBwcm9wZXJseSBkaXNwbGF5IE9wZW5TU0wgMC45LjZhLiBUaGV5IHN1cmUKICBjaGFuZ2UgdGhlaXIgdmVyc2lvbiBkZWZpbmUgZm9ybWF0IG9mdGVuLi4uCgotIGN1cmxfZm9ybWZyZWUoKSBub3cgYWNjZXB0cyBhIE5VTEwgcG9pbnRlciB3aXRob3V0IGNyYXNoaW5nIQoKVmVyc2lvbiA3LjcuMQoKRGFuaWVsICgzIEFwcmlsIDIwMDEpCi0gUHVuZWV0IFBhd2FpYSBwb2ludGVkIG91dCB0d28gc2VyaW91cyBwcm9ibGVtcy4gTGliY3VybCB3b3VsZCBhdHRlbXB0IHRvCiAgcmVhZCBiYWQgbWVtb3J5IGR1cmluZyBzaXR1YXRpb25zIHdoZW4gYW4gKGZ0cCkgY29ubmVjdGlvbiBhdHRlbXB0IGZhaWxlZC4KICBBbHNvLCB0aGUgbGliL01ha2VmaWxlLnZjNiB3YXMgY29ycmVjdGVkLgoKLSBNb3JlIGludmVzdGlnYXRpb25zIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIGNvZGUgbWFkZSBtZSByZWFsaXplIHRoYXQKICBpdCB3YXMgbm90IGNsZWFuIGVub3VnaCB0byB3b3JrIHRyYW5zcGFyYW50bHkgd2l0aCBwZXJzaXN0ZW50IGFuZCBub24tCiAgcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gSSB0aGluayBJJ3ZlIGZpeGVkIGl0IG5vdy4KCkRhbmllbCAoMjkgTWFyY2ggMjAwMSkKLSBHZW9yZyBIb3JuIG1haWxlZCBtZSBzb21lIGNvcnJlY3Rpb25zIGZvciB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZS4KCi0gRXhwZXJpbWVudGFsIGZ0cHM6Ly8gc3VwcG9ydCBhZGRlZC4gSXQgaXMgYmFzaWNhbGx5IEZUUCBvdmVyIFNTTCBmb3IgdGhlCiAgY29udHJvbCBjb25uZWN0aW9uLiBJdCBzdGlsbCBtYWtlcyBhbGwgZGF0YSB0cmFuc2ZlcnMgZ29pbmcgb3ZlciB1bmVuY3J5cHRlZAogIGNvbm5lY3Rpb25zLiBSYWluZXIgV2Vpa3VzYXQncyBmdHBkLXNzbCBzZXJ2ZXIgaGFjayBzdXBwb3J0cyB0aGlzIGFuZCBJIHVzZWQKICB0aGF0IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCkRhbmllbCAoMjcgTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiBkaXNjb3ZlcmVkIHRoYXQgaWYgeW91IHNldCBhIENVUkxPUFRfVElNRU9VVCBhbmQgdGhlbiB0cmllZAogIHRvIGdldCBhIGZpbGUgZnJvbSBhIHNpdGUgYW5kIGl0IGZhaWxzLCB0aGUgU0lHQUxSTSB3b3VsZCBzdGlsbCBiZSBzZW50CiAgYWZ0ZXIgdGhlIHRpbWVvdXQtdGltZSwgcXVpdGUgaW5leHBlY3RlZGx5IQoKLSBJIGFkZGVkIGFuIGZ0cCB0cmFuc2ZlciBleGFtcGxlIHRvIGRvY3MvZXhhbXBsZXMvIGFuZCBJIGFsc28gd3JvdGUgYSB0aW55CiAgZXhhbXBsZSBtYWtlZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc3RhcnQgd2hlbiBidWlsZGluZyBvbmUgb2YgdGhlCiAgZXhhbXBsZXMuCgpWZXJzaW9uIDcuNy4xLWJldGExCgpEYW5pZWwgKDI2IE1hcmNoIDIwMDEpCi0gTW9oYW1lZCBMcmhhemkgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCA3LjYuMSBhbmQgcGVyc2lzdGVudCBIVFRQLzEuMAogIGNvbm5lY3Rpb25zICh3aGVuIHRoZSBzZXJ2ZXIgcmVwbGllZCBhIENvbm5lY3Rpb246IEtlZXAtQWxpdmUpIGFuZCB0aGlzCiAgcHJvYmxlbSB3YXMgbm90IHByb3Blcmx5IGRlYWx0IHdpdGggaW4gNy43IGVpdGhlci4gQSBwYXRjaCB3YXMgcG9zdGVkIHRvIHRoZQogIGN1cmwtYW5kLXBocCBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgKDI0IE1hcmNoIDIwMDEpCi0gQ29saW4gV2F0c29uIHJlcG9ydGVkIGFib3V0IGEgcHJvYmxlbSBhbmQgYnJvdWdodCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGl0LAogIHdoaWNoIHdhcyBhYm91dCB0aGUgbWFuIHBhZ2UgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgcXVvdGUgKCcpIGluIGEKICB3YXkgdGhhdCBnbnJvZmYgZG9lc24ndCBsaWtlLgoKRGFuaWVsICgyMyBNYXJjaCAyMDAxKQotIFBldGVyIEJyYXkgcmVwb3J0ZWQgY29ycmVjdGx5IHRoYXQgdGhlIHJvb3QgbWFrZWZpbGUgdXNlZCBtYWtlIGluc3RlYWQgb2YKICAkKE1BS0UpIGZvciB0aGUgdGVzdCB0YXJnZXQuCgotIENvcnJlY3RlZCB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZSB0byB1c2UgY3VybF9lYXN5X3NldG9wdCgpIGFuZCBub3QKICBjdXJsX3NldG9wdCgpIHdoaWNoIHdhcyByZW1vdmVkIGluIDcuNyEKCi0gUy4gTW9vbmVzYW15IHByb3ZpZGVkIHVwZGF0ZXMgb24gdGhyZWUgZG9jdW1lbnRzIChNQU5VQUwsIElOU1RBTEwgYW5kIEZBUSkuCgotIFdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246LCBsaWJjdXJsIHdvdWxkIHNvbWV0aW1lcyB3cml0ZSB0byB0aGUgVVJMIHN0cmluZwogIGluIGEgd2F5IGl0IHNob3VsZG4ndC4gQXMgdGhlIHBvaW50ZXIgaXMgcGFzc2VkLWluIHRvIGxpYmN1cmwgZnJvbSBhbgogIGFwcGxpY2F0aW9uLCB3ZSBjYW4ndCBiZSBhbGxvd2VkIHRvIHdyaXRlIHRvIGl0LiBUaGUgcGFydGljdWxhciBidWcgcmVwb3J0CiAgZnJvbSAnbmsnIHRoYXQgYnJvdWdodCB0aGlzIHVwIHdhcyBiZWNhdXNlIGhlIGhhZCBhIHJlYWQtb25seSBVUkwgdGhhdCB0aGVuCiAgY2F1c2VkIGEgbGliY3VybCBjcmFzaCEKCi0gTm8gbG9uZ2VyIHJlYWRzIEhFQUQgcmVzcG9uc2VzIGxvbmdlciB0aGFuIHRvIHRoZSBsYXN0IGhlYWRlci4gUHJldmlvdXNseSwKICBjdXJsIHdvdWxkIHJlYWQgdGhlIGZ1bGwgcmVwbHkgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGEgImNsb3NlIiBvbmUuCgotIGxpYmN1cmwgZGlkIHJlLXVzZSBjb25uZWN0aW9ucyB3YXkgdG9vIG11Y2guIERvaW5nICJjdXJsCiAgaHR0cDovL3d3dy57bWljcm9zb2Z0LGlibX0uY29tIiB3b3VsZCBtYWtlIGl0IHJlLXVzZSB0aGUgY29ubmVjdGlvbiB3aGljaAogIG1hZGUgdGhlIHNlY29uZCByZXF1ZXN0IHJldHVybiB2ZXJ5IG9kZCByZXN1bHRzLgoKRGFuaWVsICgyMiBNYXJjaCAyMDAxKQotIEVkaW4gS2FkcmliYXNpYyBtYWRlIG1lIGF3YXJlIHRoYXQgY3VybCBzaG91bGQgbm90IHJlLXNlbmQgUE9TVCByZXF1ZXN0cwogIHdoZW4gZm9sbG93aW5nIDMwMi1yZWRpcmVjdHMuIEkgbWFkZSAzMDIgd29yayBsaWtlIDMwMyB3aGljaCBtZWFucyBjdXJsIHVzZXMKICBHRVQgaW4gdGhlIGZvbGxvd2luZyByZXF1ZXN0KHMpLgoKLSBsaWJjdXJsIG5vdyByZXNldCB0aGUgImZvbGxvd2VkLWxvY2F0aW9uIiBjb3VudGVyIG9uIGVhY2ggaW52b2tlIG9mCiAgY3VybF9lYXN5X3BlcmZvcm0oKSBhcyBpdCBvdGhlcndpc2Ugd291bGQgc3VtIHVwIGFsbCByZWRpcmVjdHMgb24gdGhlIHNhbWUKICBjb25uZWN0aW9uIGFuZCB0aHVzIGNvdWxkIHJlYWNoIHRoZSBtYXhyZWRpcnMgY291bnRlciB3cm9uZ2x5LgoKLSBKaW0gRHJhc2ggc3VnZ2VzdGVkIGN1cmxfZXNjYXBlKCkgc2hvdWxkIG5vdCByZS1lbmNvZGUgd2hhdCBhbHJlYWR5IGxvb2tzCiAgbGlrZSBhbiBlbmNvZGVkIHNlcXVlbmNlIGFuZCBJIHRoaW5rIHRoYXQncyBhIGZhaXIgc3VnZ2VzdGlvbi4KClZlcnNpb24gNy43CgpEYW5pZWwgKDIyIE1hcmNoIDIwMDEpCi0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGZhaWxzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBnZXRob3N0YnluYW1lX3IoKSBpcwogIGRldGVjdGVkIGJ1dCBpdCBjb3VsZG4ndCBmaWd1cmUgb3V0IGhvdyB0byBpbnZva2UgaXQgKHdoYXQgYW1vdW50IG9mCiAgYXJndW1lbnRzIGl0IGlzIHN1cHBvc2VkIHRvIGdldCkuIFJlcG9ydHMgZnJvbSBBbmRy6XMgR2FyY+1hIG1hZGUgbWUgYXdhcmUKICBvZiB0aGlzIG5lZWQuCgotIFRhbGtpbmcgd2l0aCBKaW0gRHJhc2ggbWFkZSBtZSBmaW5hbGx5IHB1dCB0aGUgY3VybF9lc2NhcGUgYW5kIGN1cmxfdW5lc2NhcGUKICBmdW5jdGlvbnMgaW4gdGhlIGN1cmwuaCBpbmNsdWRlIGZpbGUgYW5kIHdyaXRlIG1hbiBwYWdlcyBmb3IgdGhlbS4gVGhlCiAgZXNjYXBlIGZ1bmN0aW9uIHdhcyBtb2RpZmllZCB0byB1c2UgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZSB1bmVzY2FwZSBvbmUKICBoYWQuCgotIE5vIGJ1ZyByZXBvcnRzIGF0IGFsbCBvbiB0aGUgbGF0ZXN0IGJldGFzLiBSZWxlYXNlIHRpbWUgY29taW5nIHVwLgoKVmVyc2lvbiA3LjctYmV0YTUKCkRhbmllbCAoMTkgTWFyY2ggMjAwMSkKLSBHZW9yZyBPdHRpbmdlciByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIHVzaW5nIC1DIHRvZ2V0aGVyIHdpdGggLUwgaW4gdGhlIHNlbnNlCiAgdGhhdCB0aGUgLUMgaW5mbyBnb3QgbG9zdCB3aGVuIGl0IHdhcyByZWRpcmVjdGVkLiBJIGNvdWxkIG5vdCByZXBlYXQgdGhpcwogIHByb2JsZW0gb24gdGhlIDcuNyBicmFuY2ggd2h5IEkgbGVhdmUgdGhpcyBmb3IgdGhlIG1vbWVudC4gVGVzdCBjYXNlIDM5IHdhcwogIGFkZGVkIHRvIGRvIGV4YWN0bHkgdGhpcywgYW5kIGl0IHNlZW1zIHRvIGRvIHJpZ2h0LgoKLSBDaHJpc3RpYW4gUm9ib3R0b20gUmVpcyByZXBvcnRlZCBob3cgaGlzIDcuNyBiZXRhIGRpZG4ndCBzdWNjZXNzZnVsbHkgZG8KICBmb3JtIHBvc3RzIGFzIGVsZWdhbnRseSBhcyA3LjYuMSBkaWQuIEluZGVlZCwgdGhpcyB3YXMgYSBmbGF3IGluIHRoZSBoZWFkZXIKICBlbmdpbmUsIGFzIEhUVFAgMS4xIGhhcyBpbnRyb2R1Y2VkIGEgbmV3IDEwMCAidHJhbnNpZW50IiByZXR1cm4gY29kZSBmb3IgUFVUCiAgYW5kIFBPU1Qgb3BlcmF0aW9ucyB0aGF0IEkgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IuIFNlY3Rpb24gOC4yLjMgaW4gUkZDMjYxNgogIGhhcyBhbGwgdGhlIGRldGFpbHMuIFNlZW1zIHRvIHdvcmsgbm93IQoKRGFuaWVsICgxNiBNYXJjaCAyMDAxKQotIEFmdGVyIGhhdmluZyBleHBlcmllbmNlZCBhbm90aGVyIG1hY2hpbmUgYnJlYWstZG93biwgd2UncmUgYmFjay4KCi0gR2VvcmcgSG9ybidzIHBlcmwgaW50ZXJmYWNlIEN1cmw6OmVhc3kgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBjdXJsIHJlbGVhc2UKICBhcmNoaXZlLiBUaGUgcGVybC8gZGlyZWN0b3J5IGlzIG5vdyBwcmVzZW50LiBQbGVhc2UgaGVscCBtZSB3aXRoIGRvY3MsCiAgZXhhbXBsZXMgYW5kIHVwZGF0ZXMgeW91IHRoaW5rIGZpdC4KCi0gTWFkZSBhIG5ldyBwaHAvIGRpcmVjdG9yeSBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlIGFuZCBtb3ZlZCB0aGUgUEhQIGV4YW1wbGVzCiAgaW50byBhIHN1YmRpcmVjdG9yeSBpbiB0aGVyZS4gTm90IG11Y2ggUEhQIGluZm8geWV0LCBidXQgSSBwbGFuIHRvLiBQbGVhc2UKICBoZWxwIG1lIGhlcmUgYXMgd2VsbCEKCi0gTWFkZSBsaWJjdXJsIHJldHVybiBlcnJvciBpZiBhIHRyYW5zZmVyIGlzIGFib3J0ZWQgaW4gdGhlIG1pZGRsZSBvZiBhCiAgImNodW5rIi4gSXQgYWN0dWFsbHkgZW5hYmxlcyBsaWJjdXJsIHRvIGRpc2NvdmVyIHByZW1hdHVyZSB0cmFuc2ZlciBhYm9ydHMKICBldmVuIGlmIHRoZSBDb250ZW50LUxlbmd0aDogc2l6ZSBpcyB1bmtub3duLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAxKQotIEFkZGVkIC0tY29ubmVjdC10aW1lb3V0IHRvIGN1cmwsIHdoaWNoIHNldHMgdGhlIG5ldyBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUCiAgb3B0aW9uIGluIGxpYmN1cmwuIEl0IGxpbWl0cyB0aGUgdGltZSBjdXJsIGlzIGFsbG93ZWQgdG8gc3BlbmQgaW4gdGhlCiAgY29ubmVjdGlvbiBwaGFzZS4gVGhpcyBkaWZmZXJzIGZyb20gLW0vLS1tYXgtdGltZSB0aGF0IGxpbWl0cyB0aGUgZW50aXJlCiAgZmlsZSB0cmFuc2ZlciBvcGVyYXRpb24uIFJlcXVlc3RlZCBieSBMYXJyeSBGYWhub2UgYW5kIG90aGVycy4KCiAgSSBhbHNvIHVwZGF0ZWQgdGhlIGN1cmwuMSBhbmQgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlcyBhbmQgcmVtb3ZlZCB0aGUKICBpdGVtIGZyb20gdGhlIFRPRE8uCgpWZXJzaW9uIDcuNy1iZXRhNAoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIE1hZGUgY3VybCBncm9rIElQdjYgd2l0aCBIVFRQIHByb3hpZXMgYW5kIGdvdCBldmVyeXRoaW5nIHRvIGNvbXBpbGUgbmljZWx5CiAgYWdhaW4gd2hlbiBFTkFCTEVfSVBWNiBpcyBzZXQuCgogIEkgbmVlZCB0byByZW1ha2UgdGhpbmdzIGluIHRoZSB0ZXN0IHN1aXRlLiBJIGNhbid0IHRlc3QgdGhlIEZUUCBwYXJ0cyB3aXRoCiAgY3VybCBidWlsdCBmb3IgSVB2NiBhcyBpdCB1c2VzIGEgZGlmZmVyZW50IHNldCBvZiBGVFAgY29tbWFuZHMgdGhlbiEKCi0gSSBmZWxsIG9udG8gYSBidWcgcmVwb3J0IG9uIHBocC5uZXQgKHBvc3RlZCBieSBMYXJzIFRvcmJlbiBXaWxzb24pIHRoYXQgd2FzCiAgYSByZXBvcnQgbWVhbnQgZm9yIG91ciBwcm9qZWN0LiBBbnl3YXksIGl0IHNhaWQgdGhlIC5uZXRyYyBwYXJzaW5nIGRpZG4ndAogIHdvcmsgYXMgc3VwcG9zZWQsIGFuZCBhcyBJIGFncmVlZCB3aXRoIExhcnMsIEkgbWFkZSB0aGUgbmV0cmMgcGFyc2VyIHVzZQogIGdldHB3dWlkKCkgdG8gZmlndXJlIG91dCB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIGVmZmVjdGl2ZSB1c2VyIGFuZCB0cnkKICB0aGF0IG5ldHJjLiBJdCBzdGlsbCB1c2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBIT01FIGZvciB0aG9zZSB0aGF0IGRvbid0CiAgaGF2ZSB0aGF0IGZ1bmN0aW9uIG9yIGlmIHRoZSB1c2VyIGRvZXNuJ3QgcmV0dXJuIHZhbGlkIHB3ZCBpbmZvLgoKLSBFZGluIEthZHJpYmFpYyBwb3N0ZWQgYSBidWcgcmVwb3J0IHdoZXJlIGhlIGdvdCBhIGNyYXNoIHdoZW4gYSBmZXRjaCB3aXRoCiAgdXNlcitwYXNzd29yZCBpbiB0aGUgVVJMIGZvbGxvd2VkIGEgTG9jYXRpb246IHRvIGEgc2Vjb25kIFVSTCAoYWJzb2x1dGUsCiAgd2l0aG91dCBuYW1lK3Bhc3N3b3JkKS4gVGhpcyBidWcgaGFzIGJlZW4gYXJvdW5kIGZvciBhIGxvbmcgd2hpbGUgYW5kCiAgY3Jhc2hlcyBkdWUgdG8gYSByZWFkIGF0IGFkZHJlc3MgemVyby4gRml4ZWQgbm93LiBXcm90ZSB0ZXN0IGNhc2UgMzgsIHRoYXQKICB0ZXN0cyB0aGlzLgoKLSBNb2RpZmllZCB0aGUgdGVzdCBzdWl0ZSdzIGh0dHBzZXJ2ZXIgc2xpZ2h0bHkgdG8gYXBwZW5kIGFsbCBjbGllbnQgcmVxdWVzdAogIGRhdGEgdG8gaXRzIGxvZyBmaWxlIHNvIHRoYXQgdGhlIHRlc3Qgc2NyaXB0IG5vdyBiZXR0ZXIgY2FuIHZlcmlmeSBhIHJhbmdlCiAgb2YgcmVxdWVzdHMgYW5kIG5vdCBvbmx5IHRoZSBsYXN0IG9uZSwgYXMgaXQgZGlkIHByZXZpb3VzbHkuCgotIFVwZGF0ZWQgdGhlIGN1cmwgbWFuIHBhZ2Ugd2l0aCAtLXJhbmRvbS1maWxlIGFuZCAtLWVnZC1maWxlIGRldGFpbHMuCgpWZXJzaW9uIDcuNy1iZXRhMwoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIHByb3ZpZGVkIHNpbWlsYXIgZml4ZXMgYXMgSvZybiBkaWQgYW5kIHNvbWUgYWRkaXRpb25hbCBwYXRjaGVzCiAgZm9yIG5vbi1TU0wgY29tcGlsZXMuCgotIEkgaW5jcmVhc2VkIHRoZSBpbnRlcmZhY2UgbnVtYmVyIGZvciBsaWJjdXJsIGFzIEkndmUgcmVtb3ZlZCB0aGUgbG93IGxldmVsCiAgZnVuY3Rpb25zIGZyb20gdGhlIGludGVyZmFjZS4gSSBhbHNvIHRvb2sgdGhpcyBvcHBvcnR1bml0eSB0byByZW5hbWUgdGhlCiAgQ3VybF9zdHJlcXVhbCBmdW5jdGlvbiB0byBjdXJsX3N0cmVxdWFsIGFuZCBDdXJsX3N0cm5lcXVhbCB0bwogIGN1cmxfc3RybmVxdWFsLCBhcyB0aGV5J3JlIHB1YmxpYyBsaWJjdXJsIGZ1bmN0aW9ucyAoZXZlbiBpZiB0aGV5J3JlIHN0aWxsCiAgdW5kb2N1bWVudGVkKS4KCiAgVGhpcyB3aWxsIG1ha2Ugb2xkZXIgcHJvZ3JhbXMgbm90IGNhcGFibGUgb2YgdXNpbmcgdGhlIG5ldyBsaWJjdXJsIHdpdGgKICBqdXN0IGEgZHJvcC1pbiByZXBsYWNlbWVudC4KCi0gSvZybiBIYXJ0cm90aCB1cGRhdGVkIHN0dWZmIGZvciB3aW4zMiBjb21waWxlczoKICBvIGNvbmZpZy13aW4zMi5oIHdhcyBmaXhlZCBmb3Igc29ja2xlbl90CiAgbyBsaWIvc3NsdXNlLmMgaGFkIGEgYmFkICNlbmRpZiBwbGFjZW1lbnQKICBvIGxpYi9maWxlLmMgd2FzIG1hZGUgdG8gY29tcGlsZSBvbiB3aW4zMiBhZ2FpbgogIG8gbGliL01ha2VmaWxlLm0zMiB3YXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcgZmlsZXMKICBvIGxpYi9saWJjdXJsLmRlZiBtYXRjaGVzIHRoZSBjdXJyZW50IGludGVyZmFjZSBzdGF0ZQoKRGFuaWVsICgxMyBNYXJjaCAyMDAxKQotIEl0IG9ubHkgdG9vayBhbiBob3VyIG9yIHNvIGJlZm9yZSBK9nJuIEhhcnRyb3RoIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUKICBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLiBHaXZlbiBoaXMgZmluZSBleGFtcGxlLXNpdGUsIEkgY291bGQgZWFzaWx5IHNwb3QKICB0aGUgcHJvYmxlbSBhbmQgd2hlbiBJIHJlLXJlYWQgdGhlIHNwZWMgKHRoZSBwYXJ0IEkgaGF2ZSBwYXN0ZWQgaW4gdGhlIHRvcAogIG9mIHRoZSBodHRwX2NodW5rcy5oIGZpbGUpLCBJIHJlYWxpemVkIEkgaGFkIG1hZGUgbXkgc3RhdGUtbWFjaGluZSBzbGlnaHRseQogIHdyb25nIGFuZCBkaWRuJ3QgZXhwZWN0L2hhbmRsZSB0aGUgdHJhaWxpbmcgQ1JMRiB0aGF0IGNvbWVzIGFmdGVyIHRoZSBkYXRhCiAgaW4gZWFjaCBjaHVuayAoYW5kIHRob3NlIGV4dHJhIHR3byBieXRlcyBzdXJlIGZlZWwgd2FzdGVkKS4KCiAgSGFkIHRvIG1vZGlmeSB0ZXN0IGNhc2UgMzQgdG8gbWF0Y2ggdGhpcyBhcyB3ZWxsLgoKVmVyc2lvbiA3LjctYmV0YTIKCkRhbmllbCAoMTMgTWFyY2ggMjAwMSkKLSBBZGRlZCB0aGUgcG9saWN5IHN0dWZmIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIGZvciB0aGUgdHdvIHN1cHBvcnRlZAogIHBvbGljaWVzLgoKLSBJbXBsZW1lbnRlZCBzb21lIHN1cHBvcnQgZm9yIHRoZSBDVVJMT1BUX0NMT1NFUE9MSUNZIG9wdGlvbi4gVGhlIHBvbGljaWVzCiAgQ1VSTENMT1NFUE9MSUNZX0xFQVNUX1JFQ0VOVExZX1VTRUQgYW5kIENVUkxDTE9TRVBPTElDWV9PTERFU1QgYXJlIG5vdwogIHN1cHBvcnRlZCwgYW5kIHRoZSAibGVhc3QgcmVjZW50bHkgdXNlZCIgaXMgdXNlZCBhcyBkZWZhdWx0IGlmIG5vIHBvbGljeQogIGlzIGNob3Nlbi4KCkRhbmllbCAoMTIgTWFyY2ggMjAwMSkKLSBBZGRlZCBDVVJMT1BUX1JBTkRPTV9GSUxFIGFuZCBDVVJMT1BUX0VHRFNPQ0tFVCB0byBsaWJjdXJsIGZvciBzZWVkaW5nIHRoZQogIFNTTCByYW5kb20gZW5naW5lLiBUaGUgcmFuZG9tIHNlZWRpbmcgc3VwcG9ydCB3YXMgYWxzbyBicm91Z2h0IHRvIHRoZSBjdXJsCiAgY2xpZW50IHdpdGggdGhlIG5ldyBvcHRpb25zIC0tcmFuZG9tLWZpbGUgPGZpbGU+IGFuZCAtLWVnZC1maWxlIDxmaWxlPi4gSQogIG5lZWQgc29tZSBwZW9wbGUgdG8gcmVhbGx5IHRlc3QgdGhpcyB0byBrbm93IHRoZXkgd29yayBhcyBzdXBwb3NlZC4gUmVtZW1iZXIKICB0aGF0IGxpYmN1cmwgbm93IGluZm9ybXMgKGlmIHZlcmJvc2UgaXMgb24pIGlmIHRoZSByYW5kb20gc2VlZCBpcyBjb25zaWRlcmVkCiAgd2VhayAoSFRUUFMgY29ubmVjdGlvbnMpLgoKLSBNYWRlIHRoZSBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nIGVuZ2luZSBkZXRlY3RlZCBiYWQgZm9ybWF0dGVkIGRhdGEgbGVuZ3RoCiAgYW5kIHJldHVybiBlcnJvciBpZiBzbyAod2UgY2FuJ3QgcG9zc2libHkgZXh0cmFjdCBzZW5zaWJsZSBkYXRhIGlmIHRoaXMgaXMKICB0aGUgY2FzZSkuIEFkZGVkIGEgdGVzdCBjYXNlIHRoYXQgZGV0ZWN0cyB0aGlzLiBOdW1iZXIgMzYuIE5vdyB0aGVyZSBhcmUgNjAKICB0ZXN0IGNhc2VzLgoKLSBBZGRlZCA1IG5ldyBsaWJjdXJsIG9wdGlvbnMgdG8gY3VybC9jdXJsLmggdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZQogIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdXBwb3J0IGluIGxpYmN1cmwuIFRoZXkncmUgYWxzbyBkb2N1bWVudGVkIChmYWlybHkKICB0aG9yb3VnaGx5KSBpbiB0aGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlLiBUaHJlZSBvZiB0aGVtIGFyZSBub3cKICBpbXBsZW1lbnRlZCwgYWx0aG91Z2ggbm90IHJlYWxseSB0ZXN0ZWQgYXQgdGhpcyBwb2ludC4uLiBBbnl3YXksIHRoZSBuZXcKICBpbXBsZW1lbnRlZCBvcHRpb25zIGFyZSBuYW1lZCBDVVJMT1BUX01BWENPTk5FQ1RTLCBDVVJMT1BUX0ZSRVNIX0NPTk5FQ1QsCiAgQ1VSTE9QVF9GT1JCSURfUkVVU0UuIFRoZSBvbmVzIHN0aWxsIGxlZnQgdG8gd3JpdGUgY29kZSBmb3IgYXJlOgogIENVUkxPUFRfQ0xPU0VQT0xJQ1kgYW5kIGl0cyByZWxhdGVkIG9wdGlvbiBDVVJMT1BUX0NMT1NFRlVOQ1RJT04uCgotIE1hZGUgY3VybCAodGhlIGFjdHVhbCBjb21tYW5kIGxpbmUgdG9vbCkgdXNlIHRoZSBuZXcgbGliY3VybCA3LjcgcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gc3VwcG9ydCBieSByZS11c2luZyB0aGUgc2FtZSBjdXJsIGhhbmRsZSBmb3IgZXZlcnkgc3BlY2lmaWVkIGZpbGUKICB0cmFuc2ZlciBhbmQgYWZ0ZXIgc29tZSBtb3JlIHRlc3QgY2FzZSB0d2Vha2luZyB3ZSBoYXZlIDEwMCUgdGVzdCBjYXNlIE9LLgogIEkgbWFkZSBzb21lIHRlc3QgY2FzZXMgcmV0dXJuIEhUVFAvMS4wIG5vdyB0byBtYWtlIHN1cmUgdGhhdCB3b3JrcyBhcyB3ZWxsLgoKLSBIYWQgdG8gYWRkICdDb25uZWN0aW9uOiBjbG9zZScgdG8gdGhlIGhlYWRlcnMgb2YgYSBidW5jaCBvZiB0ZXN0IGNhc2VzIHNvCiAgdGhhdCBjdXJsIGJlaGF2ZXMgIm9sZC1zdHlsZSIgc2luY2UgdGhlIHRlc3QgaHR0cCBzZXJ2ZXIgZG9lc24ndCBkbyBtdWx0aXBsZQogIGNvbm5lY3Rpb25zLi4uIE5vdyBJIGdldCAxMDAlIHRlc3QgY2FzZSBPSy4KCi0gVGhlIGN1cmwuaGF4eC5zZSBzaXRlLCB0aGUgbWFpbiBjdXJsIG1haWxpbmcgbGlzdCBhbmQgbXkgcGVyc29uYWwgZW1haWwgYXJlCiAgYWxsIGRlYWQgdG9kYXkgZHVlIHRvIHBvd2VyIGJsYWNrb3V0IGluIHRoZSBhcmVhIHdoZXJlIHRoZSBtYWluIHNlcnZlcnMgYXJlCiAgbG9jYXRlZC4gSG9ycmlibGUuCgotIEkndmUgbWFkZSBwZXJzaXN0YW5jZSB3b3JrIG92ZXIgYSBzcXVpZCBIVFRQIHByb3h5LiBJIGZpbmQgaXQgZGlzdHVyYmluZwogIHRoYXQgaXQgdXNlcyBoZWFkZXJzIHRoYXQgYXJlbid0IHByZXNlbnQgaW4gYW55IEhUVFAgc3RhbmRhcmQgdGhvdWdoCiAgKFByb3h5LUNvbm5lY3Rpb246KSBhbmQgdGhhdCBtYWtlcyBtZSBmZWVsIHRoYXQgSSdtIG5vdyBvbiB0aGUgZWRnZSBvZiB3aGF0CiAgdGhlIHN0YW5kYXJkIGFjdHVhbGx5IGRlZmluZXMuIEkgbmVlZCB0byBnZXQgdGhpcyBjb2RlIGV4Y2VyY2lzZWQgb24gYSBsb3QKICBvZiBkaWZmZXJlbnQgSFRUUCBwcm94aWVzIGJlZm9yZSBJIGZlZWwgc2FmZS4KCiAgTm93IEknbSBmYWNpbmcgdGhlIHByb2JsZW0gd2l0aCBteSB0ZXN0IHN1aXRlIHNlcnZlcnMgKGJvdGggRlRQIGFuZCBIVFRQKQogIG5vdCBzdXBwb3J0aW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIGxpYmN1cmwgaXMgZG9pbmcgdGhlbSBub3cuIEkgaGF2ZQogIHRvIGZpeCB0aGUgdGVzdCBzZXJ2ZXJzIHRvIGdldCBhbGwgdGhlIHRlc3QgY2FzZXMgZG8gT0suCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiByZXBvcnRlZCB0aGF0IGxpYmN1cmwgZGlkIG91dHB1dCBlcnJvcnMgdG8gc3RkZXJyIGV2ZW4gaWYKICBNVVRFIGFuZCBOT1BST0dSRVNTIHdhcyBzZXQuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYSBidWcgYW5kIGhhcHBlbnMgaWYKICB0aGVyZSdzIGFuIGVycm9yIGFuZCBubyBFUlJPUkJVRkZFUiBpcyBzZXQuIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KClZlcnNpb24gNy43LWJldGExCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIGlzIG5vIGxvbmdlciBhbnkgdHJvdWJsZSBmb3IgbGliY3VybC4gSSd2ZQogIGFkZGVkIHR3byBzb3VyY2UgZmlsZXMgYW5kIEkndmUgcnVuIHNvbWUgdGVzdCBkb3dubG9hZHMgdGhhdCBsb29rIGZpbmUuCgotIEhUVFAgSEVBRCB3b3JrcyB0b28sIGV2ZW4gb24gMS4xIHNlcnZlcnMuCgpEYW5pZWwgKDUgTWFyY2ggMjAwMSkKLSBUaGUgY3VycmVudCA1NyB0ZXN0IGNhc2VzIG5vdyBwYXNzIE9LLiBJdCB3b3VsZCBzdWdnZXN0IHRoYXQgbGliY3VybCB3b3JrcwogIHVzaW5nIHRoZSBvbGQtc3R5bGUgd2l0aCBvbmUgY29ubmVjdGlvbiBwZXIgaGFuZGxlLiBUaGUgdGVzdCBzdWl0ZSBkb2Vzbid0CiAgaGFuZGxlIG11bHRpcGxlIGNvbm5lY3Rpb25zIHlldCBzbyB0aGVyZSBhcmUgbm8gdGVzdCBjYXNlcyBmb3IgdGhpcy4KCi0gSSBwYXRjaGVkIHRoZSB0ZWxuZXQuYyBoZWF2aWx5IHRvIG5vdCB1c2UgYW55IGdsb2JhbCB2YXJpYWJsZXMgYW55bW9yZS4gSXQKICBzaG91bGQgbWFrZSBpdCBhIGxvdCBuaWNlciBsaWJyYXJ5LXdpc2UuCgotIFRoZSBmaWxlOi8vIHN1cHBvcnQgd2FzIG1vZGlmaWVkIHNsaWdodGx5IHRvIHVzZSB0aGUgaW50ZXJuYWwgY29ubmVjdC1maXJzdC0KICB0aGVuLWRvIGFwcHJvYWNoLgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTW9yZSBidWdzIGVyYXNlZC4KClZlcnNpb24gNy43LWFscGhhMgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTm93LCB0aGVyZSdzIGV2ZW4gYSBiYXNpYyBjaGVjayB0aGF0IGEgcmUtdXNlZCBjb25uZWN0aW9uIGlzIHN0aWxsIGFsaXZlCiAgYmVmb3JlIGl0IGlzIGFzc3VtZWQgc28uIEEgZmV3IGZpcnN0IHRlc3RzIGhhdmUgcHJvdmVuIHRoYXQgbGliY3VybCB3aWxsCiAgdGhlbiByZS1jb25uZWN0IGluc3RlYWQgb2YgcmUtdXNlIHRoZSBkZWFkIGNvbm5lY3Rpb24hCgpEYW5pZWwgKDIgTWFyY2ggMjAwMSkKLSBOb3cgdGhleSB3b3JrIGludGVybWl4ZWQgYXMgd2VsbC4gTWFqb3IgY29vbG5lc3MhCgotIE1vcmUgZmlkZGxpbmcgYXJvdW5kLCBteSAndGlueScgY2xpZW50IEkgaGF2ZSBmb3IgdGVzdGluZyBwdXJwb3NlcyBub3cgaGFzCiAgcHJvdmVkIHRvIGRvd25sb2FkIGJvdGggRlRQIGFuZCBIVFRQIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gVGhleSBkbwogIG5vdCB3b3JrIGludGVybWl4ZWQgeWV0IHRob3VnaC4KCkRhbmllbCAoMSBNYXJjaCAyMDAxKQotIFdpbGZyZWRvIFNhbmNoZXogcG9pbnRlZCBvdXQgYSBtaW5vciBzcGVsbGluZyBtaXN0YWtlIGluIGEgbWFuIHBhZ2UgYW5kIHRoYXQKICBjdXJsX3NsaXN0X2FwcGVuZCgpIHNob3VsZCB0YWtlIGEgY29uc3QgY2hhciAqIGFzIHNlY29uZCBhcmd1bWVudC4gSXQgZG9lcwogIG5vdy4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMSkKLSBUaGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzdGFydCB0byBsb29rIGdvb2QgZm9yIEhUVFAuIE9uIGEgc3Vic2VxdWVudAogIHJlcXVlc3QsIGl0IHNlZW1zIHRoYXQgbGliY3VybCBub3cgY2FuIHBpY2sgYW4gYWxyZWFkeSBleGlzdGluZyBjb25uZWN0aW9uCiAgaWYgYSBzdWl0YWJsZSBvbmUgZXhpc3RzLCBvciBpdCBvcGVucyBhIG5ldyBvbmUuCgotIERvdWdsYXMgUi4gSG9ybmVyIG1haWxlZCBtZSBjb3JyZWN0aW9ucyB0byB0aGUgY3VybF9mb3JtcGFyc2UoKSBtYW4gcGFnZQogIHRoYXQgSSBhcHBsaWVkLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDAxKQotIEFkZGVkIHRoZSBkb2NzL2V4YW1wbGVzL3dpbjMyc29ja2V0cy5jIGZpbGUgZm9yIG91ciB3aW5kb3dzIGZyaWVuZHMuCgotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcHJvdmlkZWQgYnJhbmQgbmV3IFRFTE5FVCBmdW5jdGlvbmFsaXR5IGFuZAogIGltcHJvdmVtZW50czoKCiAgKiBOZWdvdGlhdGlvbiBpcyBub3cgcGFzc2l2ZS4gQ3VybCBkb2VzIG5vdCBuZWdvdGlhdGUgdW50aWwgdGhlIHBlZXIgZG9lcy4KICAqIFBvc3NpYmlsaXR5IHRvIHNldCBuZWdvdGlhdGlvbiBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUsIGN1cnJlbnRseSBvbmx5CiAgICBYRElTUExPQywgVFRZUEUgYW5kIE5FV19FTlZJUk9OIChjYWxsZWQgTkVXX0VOVikuCiAgKiBOb3cgc2VuZHMgdGhlIFVTRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgdGhlIC11IHN3aXRjaCBpcyB1c2VkLgogICogVXNlIC10IHRvIHNldCB0ZWxuZXQgb3B0aW9ucyAoTGludXMgZXZlbiB1cGRhdGVkIHRoZSBtYW4gcGFnZSwgYXdlc29tZSEpCgotIEhhdmVuJ3QgZG9uZSB0aGlzIGJpZyBjaGFuZ2VzIHRvIGN1cmwgZm9yIGEgd2hpbGUuIE1vdmVkIGFyb3VuZCBhIGxvdCBvZgogIHN0cnVjdCBmaWVsZHMgYW5kIHN0dWZmIHRvIG1ha2UgbXVsdGlwbGUgY29ubmVjdGlvbnMgZ2V0IGNvbm5lY3Rpb24gc3BlY2lmaWMKICBkYXRhIGluIHNlcGFyYXRlIHN0cnVjdHMgc28gdGhhdCB0aGV5IGNhbiBjby1leGlzdCBpbiBhIG5pY2Ugd2F5LiBTZWUgdGhlCiAgbWFpbGluZyBsaXN0cyBmb3IgZGlzY3Vzc2lvbnMgYXJvdW5kIGhvdyB0aGlzIGlzIGdvbm5hIGJlIGltcGxlbWVudGVkLiBEb2NzCiAgYW5kIG1vcmUgd2lsbCBmb2xsb3cuCgogIFN0dWRpZWQgdGhlIEhUVFAgUkZDIHRvIGZpbmQgb3V0IGJldHRlciBob3cgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzaG91bGQKICB3b3JrLiBTZWVtcyBjb29sIGVub3VnaC4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwMSkKLSBCb2IgU2NoYWRlciBicm91Z2h0IG1lIHR3byBmaWxlcyB0aGF0IGhlbHAgc2V0IHVwIGEgTVMgVkMrKyBsaWJjdXJsIHByb2plY3QKICBlYXNpZXIuIEhlIGFsc28gcHJvdmlkZWQgbWUgd2l0aCBhbiB1cC10by1kYXRlIGxpYmN1cmwuZGVmIGZpbGUuCgotIEkgbW92ZWQgYSBidW5jaCBvZiBwcm90b3R5cGVzIGZyb20gdGhlIHB1YmxpYyA8Y3VybC9jdXJsLmg+IGZpbGUgdG8gdGhlCiAgbGlicmFyeSBwcml2YXRlIHVybGRhdGEuaC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSB1cGNvbWluZyBjaGFuZ2VzLiBUaGUKICBsb3cgbGV2ZWwgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciBiZWluZyBwbGFubmVkIHRvIGJlY29tZSByZWFsaXR5LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAxKQotIENVUkxPUFRfUE9TVCBpcyBub3QgcmVxdWlyZWQgYW55bW9yZS4gSnVzdCBzZXR0aW5nIHRoZSBQT1NUIHN0cmluZyB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTIHdpbGwgc3dpdGNoIG9uIHRoZSBIVFRQIFBPU1QuIE1vc3Qgb3RoZXIgdGhpbmdzIGluCiAgbGliY3VybCBhbHJlYWR5IHdvcmtzIHRoaXMgd2F5LCBpLmUgdGhleSByZXF1aXJlIG9ubHkgdGhlIHBhcmFtZXRlciB0bwogIHN3aXRjaCBvbiBhIGZlYXR1cmUgc28gSSB0aGluayB0aGlzIHdvcmtzIHdlbGwgd2l0aCB0aGUgcmVzdC4gU2V0dGluZyBhIE5VTEwKICBzdHJpbmcgc3dpdGNoZXMgb2ZmIHRoZSBQT1NUIGFnYWluLgoKLSBFeGNlbGxlbnQgc3VnZ2VzdGlvbnMgZnJvbSBSaWNoIEdyYXksIFJpY2sgSm9uZXMsIEpvaGFuIE5pbHNzb24gYW5kIEJqb3JuCiAgUmVlc2UgaGVscGVkIG1lIGRlZmluZSBhIHdheSBob3cgdG8gaW5jb3Jwb3JhdGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBpbnRvCiAgbGliY3VybCBpbiBhIHZlcnkgc21vb3RoIHdheS4gSWYgZG9uZSByaWdodCwgbm8gY2hhbmdlIG1heSBoYXZlIHRvIGJlIG1hZGUKICB0byBvbGRlciBwcm9ncmFtcyBhbmQgdGhleSB3aWxsIGp1c3Qgc3RhcnQgdXNpbmcgcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuCiAgYXBwbGljYWJsZSEKCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwMSkKLSBDaGFuZ2VkIHRoZSB3b3JkICd0aW1lb3V0ZWQnIHRvICd0aW1lZCBvdXQnIGluIHR3byBkaWZmZXJlbnQgZXJyb3IgbWVzc2FnZXMuCiAgU3VnZ2VzdGVkIGJ5IExhcnJ5IEZhaG5vZS4KClZlcnNpb24gNy42LjEKCkRhbmllbCAoOSBGZWJydWFyeSAyMDAxKQotIEZyYW5rIFJlaWQgYW5kIENhaW4gSG9wd29vZCBwcm92aWRlZCBpbmZvcm1hdGlvbiBhbmQgcmVzZWFyY2ggYXJvdW5kIGEgSFRUUFMKICBQVVQvdXBsb2FkIHByb2JsZW0gd2Ugc2VlbSB0byBoYXZlLiBObyBzb2x1dGlvbiBmb3VuZCB5ZXQuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMSkKLSBBbiBpbnRlcmVzdGluZyBkaXNjdXNzaW9uIGlzIGhvdyB0byBzcGVjaWZ5IGFuIGVtcHR5IHBhc3N3b3JkIHdpdGhvdXQgaGF2aW5nCiAgY3VybCBhc2sgZm9yIGl0IGludGVyYWN0aXZlbHk/IFRoZSBjdXJyZW50IGltcGxtZW50YXRpb24gdGFrZXMgYW4gZW1wdHkKICBwYXNzd29yZCBhcyBhIHJlcXVlc3QgZm9yIGEgcGFzc3dvcmQgcHJvbXB0LiBIb3dldmVyLCBJIHN0aWxsIHdhbnQgdG8KICBzdXBwb3J0IGEgYmxhbmsgdXNlciBmaWVsZC4gVGh1cywgdG9kYXkgaWYgeW91IGVudGVyICItdSA6IiAod2l0aG91dCB1c2VyCiAgYW5kIHBhc3N3b3JkKSBjdXJsIHdpbGwgcHJvbXB0IGZvciB0aGUgcGFzc3dvcmQuIFRyaWNreS4gSG93IHdvdWxkIHlvdQogIHNwZWNpZnkgeW91IHdhbnQgdGhlIHByb21wdCBvdGhlcndpc2U/CgotIE1hZGUgdGhlIG5ldHJjIHBhcnNlIHJlc3VsdCBwb3NzaWJsZSB0byB1c2UgZm9yIG90aGVyIHByb3RvY29scyB0aGFuIEZUUCBhbmQKICBIVFRQIChzdWNoIGFzIHRoZSB1cGNvbWluZyBURUxORVQgZml4ZXMpLgoKLSBUaGUgcHJldmlvdXNseSBtZW50aW9uZWQgIk1TVkMrKyBwcm9ibGVtcyIgdHVybmVkIG91dCB0byBiZSBhIG5vbi1pc3N1ZS4KCi0gQWRkZWQgYSBIVFRQIGZpbGUgdXBsb2FkIGNvZGUgZXhhbXBsZSBpbiB0aGUgZG9jcy9leGFtcGxlcy8gc2VjdGlvbiBvbgogIHJlcXVlc3QuCgotIEFkanVzdGVkIHRoZSBGVFAgcmVzcG9uc2UgZml4IHNsaWdodGx5LgoKVmVyc2lvbiA3LjYuMS1wcmUzCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwMSkKLSBTLiBNb29uZXNhbXkgZm91bmQgYSBmbGF3IGluIHRoZSByZXNwb25zZSByZWFkaW5nIGZ1bmN0aW9uIGZvciBGVFAgdGhhdAogIGNvdWxkIG1ha2UgbGliY3VybCBub3QgZ2V0IG91dCBvZiB0aGUgbG9vcCBwcm9wZXJseSB3aGVuIGl0IHNob3VsZCwgaWYKICBsaWJjdXJsIGdvdCAtMSByZXR1cm5lZCB3aGVuIHJlYWRpbmcgdGhlIHNvY2tldC4KCi0gSSBmb3VuZCBhIHNpbWlsYXIgbWlzdGFrZSBpbiBodHRwLmMgd2hlbiB1c2luZyBhIHByb3h5IGFuZCByZWFkaW5nIHRoZQogIHJlc3VsdHMgZnJvbSB0aGUgcHJveHkgY29ubmVjdGlvbi4KCkRhbmllbCAoNiBGZWJydWFyeSAyMDAxKQotIFMuIE1vb25lc2FteSBwb2ludGVkIG91dCB0aGF0IHRoZSBWQyBtYWtlZmlsZSBpbiBzcmMvIG5lZWRlZCB0aGUgbGlicGF0aCBzZXQKICBmb3IgdGhlIGRlYnVnIGJ1aWxkIHRvIHdvcmsuCgotIERhbmllbCBHZWhyaWdlciBzdGVwcGVkIGluIHRvIGFzc2lzdCB3aXRoIHRoZSBWQysrIHN0dWZmIFJvYmVydCBXZWF2ZXIKICBicm91Z2h0IHVwIHllc3RlcmRheS4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDAxKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBicm91Z2h0IGEgYmlnIHBhdGNoIHRoYXQgYnJpbmdzIElQdjYtYXdhcmVuZXNzIHRvCiAgYSBidW5jaCBvZiBkaWZmZXJlbnQgYXJlYXMgd2l0aGluIGxpYmN1cmwuCgotIFJvYmVydCBXZWF2ZXIgdG9sZCBtZSBhYm91dCB0aGUgcHJvYmxlbXMgdGhlIE1TIFZDKysgNi4wIGNvbXBpbGVyIGhhcyB3aXRoCiAgdGhlICdzdGF0aWMnIGtleXdvcmQgb24gYSBudW1iZXIgb2YgbGliY3VybCBmdW5jdGlvbnMuIEkgbWlnaHQgbmVlZCB0byBhZGQgYQogIHBhdGNoIHRoYXQgcmVkZWZpbmVzIHN0YXRpYyB3aGVuIGxpYmN1cmwgaXMgY29tcGlsZWQgd2l0aCB0aGF0IGNvbXBpbGVyLgogIEhvdyBkbyBJIGtub3cgd2hlbiBWQysrIGNvbXBpbGVzLCBhbnlvbmU/CgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwMSkKLSBjdXJsX2dldGluZm8oKSB3YXMgZXh0ZW5kZWQgd2l0aCB0d28gbmV3IG9wdGlvbnM6CiAgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgYW5kIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX1VQTE9BRC4gVGhleQogIHJldHVybiB0aGUgZnVsbCBhc3N1bWVkIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSB0cmFuc2ZlciBpbiB0aGUgZ2l2ZW4KICBkaXJlY3Rpb24uIFRoZSBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCB3aWxsIGJlIHRoZSBDb250ZW50LUxlbmd0aDoKICBzaXplIG9mIGEgSFRUUCBkb3dubG9hZC4gQWRkZWQgZGVzY3JpcHRpb25zIHRvIHRoZSBtYW4gcGFnZSBhcyB3ZWxsLiBUaGlzCiAgd2FzIGRvbmUgYWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBCb2IgU2NoYWRlci4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDAxKQotIEluZ28gUmFsZiBCbHVtIHByb3ZpZGVkIGFub3RoZXIgZml4IHRoYXQgbWFrZXMgY3VybCBidWlsZCB1bmRlciB0aGUgbW9yZQogIHJlY2VudCBjeWd3aW4gaW5zdGFsbGF0aW9ucy4gSXQgc2VlbXMgdGhleSd2ZSBjaGFuZ2VkIHRoZSBwcmVzZXQgZGVmaW5lcyB0bwogIG5vdCBpbmNsdWRlIFdJTjMyIGFueW1vcmUuCgpWZXJzaW9uIDcuNi4xLXByZTIKCkRhbmllbCAoMzEgSmFudWFyeSAyMDAxKQotIEN1cmxfcmVhZCgpIGFuZCBjdXJsX3JlYWQoKSBub3cgcmV0dXJuIGEgc3NpemVfdCBmb3IgdGhlIHNpemUsIGFzIGl0IGhhZCB0bwogIGJlIGFibGUgdG8gcmV0dXJuIC0xLiBUaGUgdGVsbmV0IHN1cHBvcnQgY3Jhc2hlZCBkdWUgdG8gdGhpcyBhbmQgdGhlcmUgd2FzIGEKICBwb3NzaWJpbGl0eSB0byB3ZWlyZCBiZWhhdmlvciBhbGwgb3Zlci4gTGludXMgTmllbHNlbiBGZWx0emluZyBoZWxwZWQgbWUKICBmaW5kIHRoaXMuCgotIEFkZGVkIGEgY29uZmlndXJlLmluIGNoZWNrIGZvciBhIHdvcmtpbmcgZ2V0YWRkcmluZm8oKSBpZiBJUHY2IGlzIHJlcXVlc3RlZC4KICBJIGFsc28gbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmZWF0dXJlIC0tZW5hYmxlLWRlYnVnIHdoaWNoIHNldHMgYSBjb3VwbGUKICBvZiBjb21waWxlciBvcHRpb25zIHdoZW4gdXNlZC4gSXQgYXNzdW1lcyBnY2MuCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwMSkKLSBJIGZpbmFsbHkgdG9vayBhIHN0YWIgYXQgdGhlIGxvbmctdGVybSBGSVhNRSBpdGVtIEkndmUgaGFkIG9uIG15c2VsZiwgYW5kCiAgbm93IGxpYmN1cmwgd2lsbCBwcm9wZXJseSB3b3JrIHdoZW4gZG9pbmcgYSBIVFRQIHJhbmdlLXJlcXVlc3QgdGhhdCBmb2xsb3dzCiAgYSBMb2NhdGlvbjouIFByZXZpb3VzbHkgdGhhdCB3b3VsZCBtYWtlIGxpYmN1cmwgZmFpbCBzYXlpbmcgdGhhdCB0aGUgc2VydmVyCiAgZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgcmFuZ2UgcmVxdWVzdHMuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwMSkKLSBJIGFkZGVkIGEgdGVzdCBjYXNlIGZvciB0aGUgSFRUUCBQVVQgcmVzdW1lIHRoaW5nICh0ZXN0IGNhc2UgMzMpLgoKVmVyc2lvbiA3LjYuMS1wcmUxCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwMSkKLSBZZXQgYW5vdGhlciBDb250ZW50LVJhbmdlIGNoYW5nZS4gT2sgbm93PyBCb2IgU2NoYWRlciBjaGVja3MgZnJvbSBoaXMgZW5kIAogIGFuZCBpdCB3b3JrcyBmb3IgaGltLgoKRGFuaWVsICgyNyBKYW51YXJ5IDIwMDEpCi0gU28gdGhlIEhUVFAgUFVUIHJlc3VtZSBmaXggd2Fzbid0IGdvb2QuIFRoZXJlIHNob3VsZCBhcHBlYXJhbnRseSBiZSBhCiAgQ29udGVudC1SYW5nZSBoZWFkZXIgd2hlbiByZXN1bWluZyBhIFBVVC4KCi0gSSBub3RpY2VkIEkgYnJva2UgdGhlIGRvd25sb2FkLWNoZWNrIHRoYXQgdmVyaWZpZXMgdGhhdCBhIHJlc3VtZWQgSFRUUAogIGRvd25sb2FkIGlzIGFjdHVhbGx5IHJlc3VtZWQuIEl0IGdvdCBicm9rZSBiZWNhdXNlIG15IG5ldyAnaHR0cHJlcScgZmllbGQKICBpbiB0aGUgbWFpbiBjdXJsIHN0cnVjdC4gSSBzaG91bGQgZ2V0IHNsYXBwZWQuIEkgYWRkZWQgYSB0ZXN0IGNhc2UgZm9yCiAgdGhpcyBub3csIHNvIEkgd29uJ3QgYmUgYWJsZSB0byBydWluIHRoaXMgYWdhaW4gd2l0aG91dCBub3RpY2luZy4KCi0gQWRkZWQgYSB0ZXN0IGNhc2UgZm9yIGNvbnRlbnQtbGVuZ3RoIHZlcmlmeWluZyB3aGVuIGRvd25sb2FkaW5nIEhUVFAuCgotIE1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIHRpdGxlIHNheSBpZiB0aGUgdHJhbnNmZXIgaXMgYmVpbmcgdHJhbnNmZXJlZC4gSXQKICBtYWtlcyB0aGUgb3V0cHV0IHNsaWdodGx5IGJldHRlciBmb3IgcmVzdW1lcy4KCi0gV2hlbiBkZWFsaW5nIHdpdGggTG9jYXRpb246IGFuZCBIVFRQIHJldHVybiBjb2RlcywgbGliY3VybCB3aWxsIG5vdCBhdHRlbXB0CiAgdG8gZm9sbG93IHRoZSBzcGlyaXQgb2YgUkZDMjYxNiBiZXR0ZXIuIEl0IG1lYW5zIHRoYXQgd2hlbiBQT1NUaW5nIHRvIGEKICBVUkwgdGhhdCBpcyBiZWluZyBmb2xsb3dpbmcgdG8gYSBzZWNvbmQgcGxhY2UsIHRoZSBzdGFuZGFyZCB3aWxsIGp1ZGdlIG9uCiAgd2hhdCB0byBkby4gQWxsIEhUVFAgY29kZXMgZXhjZXB0IDMwMyBhbmQgMzA1IHdpbGwgY2F1c2UgY3VybCB0byBtYWtlIGEKICBzZWNvbmQgUE9TVCBvcGVyYXRpb24uIDMwMyB3aWxsIG1ha2UgYSBHRVQgYW5kIDMwNSBpcyBub3QgeWV0IHN1cHBvcnRlZC4KCiAgSSBhbHNvIHdyb3RlIHR3byB0ZXN0IGNhc2VzIGZvciB0aGlzIFBPU1QvR0VUL0xvY2F0aW9uIHN0dWZmLgoKVmVyc2lvbiA3LjYKCkRhbmllbCAoMjYgSmFudWFyeSAyMDAxKQotIExvdHMgb2YgbWFpbHMgYmFjayBhbmQgZm9ydGggd2l0aCBCb2IgU2NoYWRlciBmaW5hbGx5IG1hZGUgbWUgYWRkIGEgc21hbGwKICBwaWVjZSBvZiBjb2RlIGluIHRoZSBIVFRQIGVuZ2luZSBzbyB0aGF0IEhUVFAgdXBsb2FkIHJlc3VtZSB3b3Jrcy4gWW91IGNhbgogIG5vdyBkbyBhbiBvcGVyYXRpb24gbGlrZSAnY3VybCAtVCBmaWxlIC1DIDxvZmZzZXQ+IDxVUkw+JyBhbmQgY3VybCB3aWxsIFBVVAogIHRoZSBlbmRpbmcgcGFydCBvZiB0aGUgZmlsZSBzdGFydGluZyBhdCBnaXZlbiBvZmZldCB0byB0aGUgc3BlY2lmaWVkIFVSTC4KClZlcnNpb24gNy42LXByZTQKCkRhbmllbCAoMjUgSmFudWFyeSAyMDAxKQotIEkgdG9vayBob2xkIG9mIFJpY2sgSm9uZXMnIHF1ZXN0aW9uIHdoeSB3ZSBkb24ndCB1c2UgcmVjdigpIGFuZCBzZW5kKCkgZm9yCiAgcmVhZGluZy93cml0aW5nIHRvIHRoZSBzb2NrZXRzIGFuZCBJJ3ZlIG5vdyBtb2RpZmllZCB0aGUgc3JlYWQoKSBhbmQKICBzd3JpdGUoKSBtYWNyb3MgdG8gdXNlIHRoZW0gaW5zdGVhZC4gSWYgbm90aGluZyBlbHNlLCB0aGV5IGNvdWxkIGJlIHRlc3RlZAogIGluIHRoZSBuZXh0IGJldGEtcm91bmQgY29taW5nIHJpZ2h0IHVwLgoKLSBKZWZmIE1vcnJvdyBmb3VuZCBhIHByb2JsZW0gd2l0aCBsaWJjdXJsJ3MgdXNhZ2Ugb2YgU1NMX3JlYWQoKSBhbmQgc3VwcGxpZWQKICBoaXMgcmVzZWFyY2ggcmVzdWx0cyBpbiBob3cgdG8gZml4IHRoaXMuIEl0IHR1cm5zIG91dCB3ZSBoYXZlIHRvIGludm9rZSB0aGUKICBmdW5jdGlvbiBzZXZlcmFsIHRpbWVzIGluIHNvbWUgY2FzZXMuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBTU0xfd3JpdGUoKS4KCiAgSSBtYWRlIHNvbWUgcmF0aGVyIGRyYXN0aWMgY2hhbmdlcyBhbGwgb3ZlciBsaWJjdXJsIHRvIG1ha2UgYWxsIHdyaXRlcyBhbmQKICByZWFkcyBnZXQgZG9uZSBvbiBvbmUgc2luZ2xlIHBsYWNlIHNvIHRoYXQgdGhpcyByZXBlYXRlZC1hdHRlbXB0cyB0aGluZwogIHdvdWxkIG9ubHkgaGF2ZSB0byBiZSBpbXBsZW1lbnRlZCBhdCBvbmUgcG9pbnQuCgotIFJpY2sgSm9uZXMgc3BvdHRlZCB0aGF0IHRoZSAndG90YWwgdGltZScgY291bnRlciByZWFsbHkgZGlkbid0IG1lYXN1cmUgdGhlCiAgdG90YWwgdGltZSB2ZXJ5IGFjY3VyYXRlIG9uIHN1YnNlY29uZCBsZXZlbHMuCgotIEpvaGFuIE5pbHNzb24gcG9pbnRlZCBvdXQgdGhlIG5lZWQgdG8gbW9yZSBjbGVhcmx5IHNwZWNpZnkgdGhhdCB0aGUgdGltZW91dAogIHZhbHVlIHlvdSBzZXQgZm9yIGEgZG93bmxvYWQgaXMgZm9yIHRoZSAqZW50aXJlKiBkb3dubG9hZC4gVGhlcmUncyBjdXJyZW50bHkKICBubyBvcHRpb24gYXZhaWxhYmxlIHRoYXQgc2V0cyBhIHRpbWVvdXQgZm9yIHRoZSBjb25uZWN0aW9uIHBoYXNlIG9ubHkuCgpEYW5pZWwgKDI0IEphbnVhcnkgMjAwMSkKLSBJbmdvIFJhbGYgQmx1bSBzdWJtaXR0ZWQgYSBzZXJpZXMgb2YgcGF0Y2hlcyByZXF1aXJlZCB0byBnZXQgY3VybCB0byBjb21waWxlCiAgcHJvcGVybHkgd2l0aCBjeWd3aW4uCgotIFJvYmVydCBXZWF2ZXIgcG9zdGVkIGEgZml4IGZvciB0aGUgd2luMzIgc2VjdGlvbiBvZiB0aGUgY3VybF9nZXRlbnYoKSBjb2RlCiAgdGhhdCBjb3JyZWN0ZWQgYSBwb3RlbnRpYWwgbWVtb3J5IGxlYWsuCgotIEFkZGVkIGNvbW1lbnRzIGluIGEgZmV3IGZpbGVzIGluIGEgc3VkZGVuIGF0dGVtcHQgdG8gbWFrZSB0aGUgc291cmNlcyBtb3JlCiAgZWFzeSB0byByZWFkIGFuZCB1bmRlcnN0YW5kIQoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDEpCi0gQWRkZWQgc2ltcGxlIElQdjYgZGV0ZWN0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBtYWRlIHRoZSB2ZXJzaW9uCiAgc3RyaW5nIGFkZCAnaXB2NicgdG8gdGhlIGVuYWJsZSBzZWN0aW9uIGluIHRoYXQgY2FzZS4gRU5BQkxFX0lQVjYgd2lsbCBiZQogIHNldCBpZiBjdXJsIGlzIGNvbXBpbGVkIHdpdGggSVB2NiBzdXBwb3J0IGVuYWJsZWQuCgotIEFkZGVkIGEgcGFyc2VyIGZvciBJUHY2LXN0eWxlIHNwZWNpZmllZCBJUC1hZGRyZXNzZXMgaW4gYSBVUkwuIFRodXMsIHdoZW4KICBJUHY2IGdldHMgZW5hYmxlZCBzb29uLCB3ZSBjYW4gdXNlIFVSTHMgbGlrZSAnWzA6OjFdOjgwJy4uLgoKLSBNYWRlIHRoZSBVUkwgZ2xvYmJpbmcgaW4gdGhlIGNsaWVudCBwb3NzaWJsZSB0byBmYWlsIHNpbGVudGx5IGlmIHRoZXJlJ3MgYW4KICBlcnJvciBpbiB0aGUgZ2xvYmJpbmcuIEl0IG1ha2VzIGl0IGFsbW9zdCBpbnR1aXRpdmUsIHNvIHdoZW4geW91IGRvbid0CiAgZm9sbG93IHRoZSBzeW50YXggcnVsZXMsIGdsb2JiaW5nIGlzIHNpbXBseSBzd2l0Y2hlZCBvZmYgYW5kIHRoZSByYXcgc3RyaW5nCiAgaXMgdXNlZCBpbnN0ZWFkLgoKICBJIHN0aWxsIHRoaW5rIHdlJ2xsIGdldCBwcm9ibGVtcyB3aXRoIElQdjYtc3R5bGUgSVAtYWRkcmVzc2VzIHdoZW4gd2UgKndhbnQqCiAgZ2xvYmJpbmcgb24gcGFydHMgb2YgdGhlIFVSTCBhcyB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSBVUkwgd2lsbCBmb3Igc3VyZQogIHNlcmlvdXNseSBjb25mdXNlIHRoZSBnbG9iYmVyLgoKRGFuaWVsICgyMiBKYW51YXJ5IDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgc3VwcGxpZWQgYSBwcm9ncmVzcyBtZXRlciBwYXRjaCB0aGF0IG1ha2VzIGl0IGxvb2sgYmV0dGVyIGV2ZW4KICBkdXJpbmcgc2xvdyBzdGFydHMuIFByZXZpb3VzbHkgaXQgbWFkZSBzb21lIHNpbGx5IGFzc3VtcHRpb25zLi4uCgotIEFkZGVkIHR3byBGVFAgdGVzdHMgZm9yIC1RIGFuZCAtUSAtIHN0dWZmIHNpbmNlIGl0IHdhcyBiZWluZyBkaXNjdXNzZWQgb24KICB0aGUgbWFpbGluZyBsaXN0LiBIYWQgdG8gY29ycmVjdCB0aGUgZnRwc2VydmVyLnBsIHRvbyBhcyBpdCBidWdnZWQgc2xpZ2h0bHkuCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMSkKLSBNYWRlIHRoZSBMb2NhdGlvbjogcGFyc2VycyBkZWFsIHdpdGggYW55LWxlbmd0aCBVUkxzLiBUaHVzIEkgcmVtb3ZlZCB0aGUgbGFzdAogIGNvZGUgdGhhdCByZXN0cmljdHMgdGhlIGxlbmd0aCBvZiBVUkxzIHRoYXQgY3VybCBzdXBwb3J0cy4KCi0gQWRkZWQgYSAtLWdsb2JvZmYgdGVzdCBjYXNlICgjMjgpIGFuZCBpdCBxdWlja2x5IGlkZW50aWZpZWQgYSBtZW1vcnkgcHJvYmxlbQogIGluIHNyYy9tYWluLmMgdGhhdCBJIHRvb2sgY2FyZSBvZi4KClZlcnNpb24gNy42LXByZTMKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAxKQotIE1hZGUgdGhlIHR3byBmb3JtZXIgZmlsZXMgbGliL2Rvd25sb2FkLmMgYW5kIGxpYi9oaWdobGV2ZWwuYyBiZWNvbWUgdGhlIG5ldwogIGxpYi90cmFuc2Zlci5jIHdoaWNoIG1ha2VzIG1vcmUgc2Vuc2UuIEkgYWxzbyBkaWQgdGhlIHJlbmFtZSBmcm9tIFRyYW5zZmVyKCkKICB0byBDdXJsX1RyYW5zZmVyKCkgaW4gdGhlIG90aGVyIHNvdXJjZSBmaWxlcyB0aGF0IHVzZSB0aGUgdHJhbnNmZXIgZnVuY3Rpb24KICBpbiB0aGUgc3Bpcml0IG9mIHVzaW5nIEN1cmxfIHByZWZpeCBmb3IgbGlicmFyeS1zY29wZWQgZ2xvYmFsIHN5bWJvbHMuCgpEYW5pZWwgKDExIEphbnVhcnkgMjAwMSkKLSBBZGRlZCAtZy8tLWdsb2JvZmYgdGhhdCBzd2l0Y2hlcyBPRkYgdGhlIFVSTCBnbG9iYmluZyBhbmQgdGh1cyBlbmFibGVzIHt9W10KICBsZXR0ZXJzIHRvIGJlIHBhcnQgb2YgdGhlIFVSTC4gRG8gbm90ZSB0aGF0IFJGQzIzOTYgc2VjdGlvbiAyLjQuMyBleHBsaWNpdGx5CiAgbWVudGlvbiB0aGVzZSBsZXR0ZXJzIHRvIGJlIGVzY2FwZWQuIFRoaXMgd2FzIHBvc3RlZCBhcyBhIGZlYXR1cmUgcmVxdWVzdCBieQogIEpvcmdlIEd1dGllcnJleiBhbmQgYXMgYSBidWcgYnkgVGVycnkuCgotIFNob3J0IG9wdGlvbnMgdG8gY3VybCB0aGF0IHJlcXVpcmVzIHBhcmFtZXRlcnMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgd2l0aG91dAogIGhhdmluZyB0aGUgb3B0aW9uIGFuZCBpdHMgcGFyYW1ldGVyIHNwYWNlIHNlcGFyYXRlZC4gLW9maWxlIHdvcmtzIGFzIGdvb2QgYXMKICAtbyBmaWxlLiAtbTIwIGlzIGVxdWFsIHRvIC1tIDIwLiBEbyBub3RlIHRoYXQgdGhpcyBnb2VzIGZvciBzaW5nbGUtbGV0dGVyCiAgb3B0aW9ucyBvbmx5LCB2ZXJib3NlIC0tbG9uZy1zdHlsZSBvcHRpb25zIHN0aWxsIG11c3QgYmUgc2VwYXJhdGVkIHdpdGgKICBzcGFjZSBmcm9tIHRoZWlyIHBhcmFtZXRlcnMuCgpEYW5pZWwgKDggSmFudWFyeSAyMDAxKQotIEZyYW5jaXMgRGFnZW5haXMgcmVwb3J0ZWQgdGhhdCB0aGUgU0NPIGNvbXBpbGVyIHN0aWxsIGZhaWxzIHdoZW4gY29tcGlsaW5nCiAgY3VybCBkdWUgdG8gdGhhdCBnZXRwYXNzX3IoKSBwcm90b3R5cGUuIEkndmUgbm93IHB1dCBpdCBhcm91bmQgI2lmbmRlZgogIEhBVkVfR0VUUEFTU19SIGluIGFuIGF0dGVtcHQgdG8gcGxlYXNlIHRoZSBTQ08gc3lzdGVtcy4KCi0gTWFkZSBzb21lIG1pbm9yIGNvcnJlY3Rpb25zIHRvIGdldCB0aGUgY2xpZW50IHRvIGNsZWFudXAgcHJvcGVybHkgYW5kIEkgbWFkZQogIHRoZSBzZXBhcmF0b3Igd29yayBhZ2FpbiB3aGVuIGdldHRpbmcgbXVsdGlwbGUgZ2xvYmJlZCBVUkxzIHRvIHN0ZG91dC4KCi0gV29ya2VkIHdpdGggTG9pYyBEYWNoYXJ5IHRvIGdldCB0aGUgbWFrZSBkaXN0IGFuZCBtYWtlIGRpc3RjaGVjayB3b3JrCiAgY29ycmVjdGx5LiBUaGUgJ21ha2V0Z3onIHNjcmlwdCBpcyBub3cgdXNpbmcgdGhlIGF1dG9tYWtlIGdlbmVyYXRlZCAnbWFrZQogIGRpc3QnIHdoZW4gY3JlYXRpbmcgcmVsZWFzZSBhcmNoaXZlcy4gTG9pYyBzdWNjZXNzZnVsbHkgbWFkZSAnbWFrZSBycG1zJwogIGF1dG9tYXRpY2FsbHkgYnVpbGQgUlBNcyEKCkxvaWMgRGFjaGFyeSAoNiBKYW51YXJ5IDIwMDEpCi0gQXV0b21hdGVkIGdlbmVyYXRpb24gb2YgcnBtIHBhY2thZ2VzLCBubyBuZWVkIHRvIGJlIHJvb3QuCgotIG1ha2UgZGlzdGNoZWNrIGdlbmVyYXRlcyBhIHByb3BlciBkaXN0cmlidXRpb24gKEVYVFJBX0RJU1QKICBpbiBhbGwgTWFrZWZpbGUuYW0gbW9kaWZpZWQgdG8gbWF0Y2ggRklMRVMpLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwMSkKLSBIdWdlIGNsaWVudC1zaWRlIGhhY2s6IG5vdyBtdWx0aXBsZSBVUkxzIGFyZSBzdXBwb3J0ZWQuIEFueSBudW1iZXIgb2YgVVJMcwogIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHRoZXknbGwgYWxsIGJlIGRvd25sb2FkZWQuIFRoZXJlCiAgbXVzdCBiZSBhIGNvcnJlc3BvbmRpbmcgLW8gb3IgLU8gZm9yIGVhY2ggVVJMIG9yIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0bwogIHN0ZG91dC4gVGhpcyBuZWVkcyBtb3JlIHRlc3RpbmcsIHRpbWUgdG8gcmVsZWFzZSBhIDcuNi1wcmUgcGFja2FnZS4KCi0gVGhlIGtyYjQgc3VwcG9ydCB3YXMgYnJva2VuIGluIHRoZSByZWxlYXNlLiBGaXhlZCBub3cuCgotIEh1Z2UgaW50ZXJuYWwgc3ltYm9sIHJlbmFtZSBvcGVyYXRpb24uIEFsbCBub24tc3RhdGljIGJ1dCBzdGlsbCBsaWItaW50ZXJuYWwKICBzeW1ib2xzIHNob3VsZCBub3cgYmUgcHJlZml4ZWQgd2l0aCAnQ3VybF8nIHRvIHByZXZlbnQgY29sbGlzaW9ucyB3aXRoIG90aGVyCiAgbGlicy4gQWxsIHB1YmxpYyBzeW1ib2xzIHNob3VsZCBiZSBwcmVmaXhlZCB3aXRoICdjdXJsXycgYW5kIHRoZSByZXN0IHNob3VsZAogIGJlIHN0YXRpYyBhbmQgdGh1cyBpbnZpc2libGUgdG8gdGhlIG91dHNpZGUgd29ybGQuIEkgdXBkYXRlZCB0aGUgSU5URVJOQUxTCiAgZG9jdW1lbnQgdG8gc2F5IHRoaXMgYXMgd2VsbC4KClZlcnNpb24gNy41LjIKCkRhbmllbCAoNCBKYW51YXJ5IDIwMDEpCi0gQXMgS2V2aW4gUCBSb3RoIHN1Z2dlc3RlZCwgSSd2ZSBhZGRlZCB0ZXh0IHRvIHRoZSBtYW4gcGFnZSBmb3IgZXZlcnkgY29tbWFuZAogIGxpbmUgb3B0aW9uIGFuZCB3aGF0IGhhcHBlbnMgd2hlbiB5b3Ugc3BlY2lmeSB0aGF0IG9wdGlvbiBtb3JlIHRoYW4KICBvbmNlLiBUaGF0IGhhc24ndCBiZWVuIGV4YWN0bHkgY3J5c3RhbCBjbGVhciBiZWZvcmUuCgotIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgcG9zc2libGUgdG8gcnVuIGZyb20gb3V0c2lkZSB0aGUgc291cmNlLXRyZWUuIEZvcgogIG9kZCByZWFzb25zIEkgY2FuJ3QgYnVpbGQgY3VybCBwcm9wZXJseSBvdXRzaWRlIHRob3VnaC4gSXQgaGFzIHRvIGRvIHdpdGgKICBjdXJsJ3MgZGVwZW5kZW5jaWVzIG9uIGxpYmN1cmwuLi4KCi0gQ3V0IG9mZiBhbGwgb2xkZXIgKGRhdGVkIDE5OTkgYW5kIGVhcmxpZXIpIENIQU5HRVMgZW50cmllcyBmcm9tIHRoaXMgZmlsZS4KICBUaGUgb2xkZXIgcGllY2UgaXMgbmFtZWQgQ0hBTkdFUy4wIGFuZCBpcyBhZGRlZCB0byB0aGUgQ1ZTIHJlcG9zaXRvcnkgaW4KICBjYXNlIGFueW9uZSB3b3VsZCBuZWVkIGl0LgoKLSBJIGFkZGVkIGFub3RoZXIgZmlsZSAnQ1ZTLUlORk8nIHRvIHRoZSBDVlMuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0CiAgZmlsZXMgaW4gdGhlIENWUyB0aGF0IGFyZW4ndCBpbmNsdWRlZCBpbiByZWxlYXNlIGFyY2hpdmVzIGFuZCBob3cgdG8gYnVpbGQKICBjdXJsIHdoZW4geW91IGdldCB0aGUgc291cmNlcyBvZmYgQ1ZTLgoKLSBVcGRhdGVkIENPTlRSSUJVVEUgYW5kIEZBUSBkdWUgdG8gdGhlIG5ldyBsaWNlbnNlLgoKRGFuaWVsICgzIEphbnVhcnkgMjAwMSkKLSBSZW5hbWVkIFJFQURNRS5saWJjdXJsIHRvIExJQkNVUkwKCi0gQ2hhbmdlZCBoZWFkZXJzIGluIGFsbCBzb3VyY2VzIGZpbGVzIHRvIHRoZSBuZXcgZHVhbCBsaWNlbnNlIGNvbmNlcHQgb2YKICBjdXJsOiB1c2UgdGhlIE1JVC9YIGRlcml2YXRlIGxpY2Vuc2UgKm9yKiBNUEwuIFRoZSBMRUdBTCBmaWxlIHdhcyB1cGRhdGVkCiAgYWNjb3JkaW5nbHkgYW5kIHRoZSBNUEwgMS4xIGFuZCBNSVQvWCBkZXJpdmF0ZSBsaWNlbnNlcyBhcmUgbm93IHBhcnQgb2YgdGhlCiAgcmVsZWFzZSBhcmNoaXZlLgo=