V2hhdCdzIE5ldyBpbiBQeXRob24gMi4zIGFscGhhIDE/ClhYWCBSZWxlYXNlIGRhdGU6IERELU1NTS0yMDAyIFhYWAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCgpDb3JlIGFuZCBidWlsdGlucwoKLSBGaWxlIG9iamVjdHMgYXJlIG5vdyB0aGVpciBvd24gaXRlcmF0b3JzLiAgRm9yIGEgZmlsZSBmLCBpdGVyKGYpIG5vdwogIHJldHVybnMgZiAodW5sZXNzIGYgaXMgY2xvc2VkKSwgYW5kIGYubmV4dCgpIGlzIHNpbWlsYXIgdG8KICBmLnJlYWRsaW5lKCkgd2hlbiBFT0YgaXMgbm90IHJlYWNoZWQ7IGhvd2V2ZXIsIGYubmV4dCgpIHVzZXMgYQogIHJlYWRhaGVhZCBidWZmZXIgdGhhdCBtZXNzZXMgdXAgdGhlIGZpbGUgcG9zaXRpb24sIHNvIG1peGluZwogIGYubmV4dCgpIGFuZCBmLnJlYWRsaW5lKCkgKG9yIG90aGVyIG1ldGhvZHMpIGRvZXNuJ3Qgd29yayByaWdodC4KICBDYWxsaW5nIGYuc2VlaygpIGRyb3BzIHRoZSByZWFkYWhlYWQgYnVmZmVyLCBidXQgb3RoZXIgb3BlcmF0aW9ucwogIGRvbid0LiAgSXQgc28gaGFwcGVucyB0aGF0IHRoaXMgZ2l2ZXMgYSBuaWNlIGFkZGl0aW9uYWwgc3BlZWQgYm9vc3QKICB0byAiZm9yIGxpbmUgaW4gZmlsZToiOyB0aGUgeHJlYWRsaW5lcyBtZXRob2QgYW5kIGNvcnJlc3BvbmRpbmcKICBtb2R1bGUgYXJlIG5vdyBvYnNvbGV0ZS4KCi0gRW5jb2RpbmcgZGVjbGFyYXRpb25zIChQRVAgMjYzLCBwaGFzZSAxKSBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuICBBCiAgY29tbWVudCBvZiB0aGUgZm9ybSAiIyAtKi0gY29kaW5nOiA8ZW5jb2RpbmduYW1lPiAtKi0iIGluIHRoZSBmaXJzdAogIG9yIHNlY29uZCBsaW5lIG9mIGEgUHl0aG9uIHNvdXJjZSBmaWxlIGluZGljYXRlcyB0aGUgZW5jb2RpbmcuCgotIGxpc3Quc29ydCgpIGhhcyBhIG5ldyBpbXBsZW1lbnRhdGlvbi4gIFdoaWxlIGNyb3NzLXBsYXRmb3JtIHJlc3VsdHMKICBtYXkgdmFyeSwgYW5kIGluIGRhdGEtZGVwZW5kZW50IHdheXMsIHRoaXMgaXMgbXVjaCBmYXN0ZXIgb24gbWFueQogIGtpbmRzIG9mIHBhcnRpYWxseSBvcmRlcmVkIGxpc3RzIHRoYW4gdGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uLAogIGFuZCByZXBvcnRlZCB0byBiZSBqdXN0IGFzIGZhc3Qgb24gcmFuZG9tbHkgb3JkZXJlZCBsaXN0cyBvbgogIHNldmVyYWwgbWFqb3IgcGxhdGZvcm1zLiAgVGhpcyBzb3J0IGlzIGFsc28gc3RhYmxlIChpZiBBPT1CIGFuZCBBCiAgcHJlY2VkZXMgQiBpbiB0aGUgbGlzdCBhdCB0aGUgc3RhcnQsIEEgcHJlY2VkZXMgQiBhZnRlciB0aGUgc29ydCB0b28pLAogIGFsdGhvdWdoIHRoZSBsYW5ndWFnZSBkZWZpbml0aW9uIGRvZXMgbm90IGd1YXJhbnRlZSBzdGFiaWxpdHkuICBBCiAgcG90ZW50aWFsIGRyYXdiYWNrIGlzIHRoYXQgbGlzdC5zb3J0KCkgbWF5IHJlcXVpcmUgdGVtcCBzcGFjZSBvZgogIGxlbihsaXN0KSoyIGJ5dGVzICgqNCBvbiBhIDY0LWJpdCBtYWNoaW5lKS4gIEl0J3MgdGhlcmVmb3JlIHBvc3NpYmxlCiAgZm9yIGxpc3Quc29ydCgpIHRvIHJhaXNlIE1lbW9yeUVycm9yIG5vdywgZXZlbiBpZiBhIGNvbXBhcmlzb24gZnVuY3Rpb24KICBkb2VzIG5vdC4gIFNlZSA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzU4NzA3Nj4gZm9yIGZ1bGwgZGV0YWlscy4KCi0gQWxsIHN0YW5kYXJkIGl0ZXJhdG9ycyBub3cgZW5zdXJlIHRoYXQsIG9uY2UgU3RvcEl0ZXJhdGlvbiBoYXMgYmVlbgogIHJhaXNlZCwgYWxsIGZ1dHVyZSBjYWxscyB0byBuZXh0KCkgb24gdGhlIHNhbWUgaXRlcmF0b3Igd2lsbCBhbHNvCiAgcmFpc2UgU3RvcEl0ZXJhdGlvbi4gIFRoZXJlIHVzZWQgdG8gYmUgdmFyaW91cyBjb3VudGVyZXhhbXBsZXMgdG8KICB0aGlzIGJlaGF2aW9yLCB3aGljaCBjb3VsZCBjYXVzZWQgY29uZnVzaW9uIG9yIHN1YnRsZSBwcm9ncmFtCiAgYnJlYWthZ2UsIHdpdGhvdXQgYW55IGJlbmVmaXRzLiAgKE5vdGUgdGhhdCB0aGlzIGlzIHN0aWxsIGFuCiAgaXRlcmF0b3IncyByZXNwb25zaWJpbGl0eTsgdGhlIGl0ZXJhdG9yIGZyYW1ld29yayBkb2VzIG5vdCBlbmZvcmNlCiAgdGhpcy4pCgotIEN0cmwrQyBoYW5kbGluZyBvbiBXaW5kb3dzIGhhcyBiZWVuIG1hZGUgbW9yZSBjb25zaXN0ZW50IHdpdGgKICBvdGhlciBwbGF0Zm9ybXMuICBLZXlib2FyZEludGVycnVwdCBjYW4gbm93IHJlbGlhYmx5IGJlIGNhdWdodCwKICBhbmQgQ3RybCtDIGF0IGFuIGludGVyYXRpdmUgcHJvbXB0IG5vIGxvbmdlciB0ZXJtaW5hdGVzIHRoZQogIHByb2Nlc3MgdW5kZXIgTlQvMmsvWFAgKGl0IG5ldmVyIGRpZCB1bmRlciBXaW45eCkuICBDdHJsK0Mgd2lsbAogIGludGVycnVwdCB0aW1lLnNsZWVwKCkgaW4gdGhlIG1haW4gdGhyZWFkLCBhbmQgYW55IGNoaWxkIHByb2Nlc3NlcwogIGNyZWF0ZWQgdmlhIHRoZSBwb3BlbiBmYW1pbHkgYXJlIGFsc28gaW50ZXJydXB0ZWQgKGFzIGdlbmVyYWxseQogIGhhcHBlbnMgb24gZm9yIExpbnV4L1VuaXgpLiBbU0YgYnVncyAyMzEyNzMsIDQzOTk5MiBhbmQgNTgxMjMyXQoKLSBTbGljZXMgYW5kIHJlcGV0aXRpb25zIG9mIGJ1ZmZlciBvYmplY3RzIG5vdyBjb25zaXN0ZW50bHkgcmV0dXJuCiAgYSBzdHJpbmcuICBGb3JtZXJseSwgc3RyaW5ncyB3b3VsZCBiZSByZXR1cm5lZCBtb3N0IG9mIHRoZSB0aW1lLAogIGJ1dCBhIGJ1ZmZlciBvYmplY3Qgd291bGQgYmUgcmV0dXJuZWQgd2hlbiB0aGUgcmVwZXRpdGlvbiBjb3VudAogIHdhcyBvbmUgb3Igd2hlbiB0aGUgc2xpY2UgcmFuZ2Ugd2FzIGFsbCBpbmNsdXNpdmUuCgotIFRoZSBfX3Nsb3RzX18gdmFyaWFibGUgY2FuIG5vdyBtZW50aW9uICJwcml2YXRlIiBuYW1lcywgYW5kIHRoZQogIHJpZ2h0IHRoaW5nIHdpbGwgaGFwcGVuIChlLmcuIF9fc2xvdHNfXyA9IFsiX19mb28iXSkuCgotIFVuaWNvZGUgb2JqZWN0cyBpbiBzeXMucGF0aCBhcmUgbm8gbG9uZ2VyIGlnbm9yZWQgYnV0IHRyZWF0ZWQKICBhcyBkaXJlY3RvcnkgbmFtZXMuCgotIFRoZSBidWlsdC1pbnMgc2xpY2UoKSBhbmQgYnVmZmVyKCkgYXJlIG5vdyBjYWxsYWJsZSB0eXBlcy4gIFRoZQogIHR5cGVzIGNsYXNzb2JqIChmb3JtZXJseSBjbGFzcyksIGNvZGUsIGZ1bmN0aW9uLCBpbnN0YW5jZSwgYW5kCiAgaW5zdGFuY2VtZXRob2QgKGZvcm1lcmx5IGluc3RhbmNlLW1ldGhvZCksIHdoaWNoIGhhdmUgbm8gYnVpbHQtaW4KICBuYW1lcyBidXQgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgdHlwZXMgbW9kdWxlLCBhcmUgbm93IGFsc28KICBjYWxsYWJsZS4gIFRoZSB0eXBlIGRpY3QtcHJveHkgaXMgcmVuYW1lZCB0byBkaWN0cHJveHkuCgotIEZpeGVkIHN0cmluZy5zdGFydHN3aXRoIGFuZCBzdHJpbmcuZW5kc3dpdGggYnVpbHRpbiBtZXRob2RzCiAgc28gdGhleSBhY2NlcHQgbmVnYXRpdmUgaW5kaWNlcy4gIFtTRiBidWcgNDkzOTUxXQoKLSBGaXhlZCBhIGJ1ZyB3aXRoIGEgY29udGludWUgaW5zaWRlIGEgdHJ5IGJsb2NrIGFuZCBhIHlpZWxkIGluIHRoZQogIGZpbmFsbHkgY2xhdXNlLiAgW1NGIGJ1ZyA1Njc1MzhdCgotIE1vc3QgYnVpbHRpbiBzZXF1ZW5jZXMgbm93IHN1cHBvcnQgImV4dGVuZGVkIHNsaWNlcyIsIGkuZS4gc2xpY2VzCiAgd2l0aCBhIHRoaXJkICJzdHJpZGUiIHBhcmFtZXRlci4gIEZvciBleGFtcGxlLCAiaGVsbG8gd29ybGQiWzo6LTFdCiAgZ2l2ZXMgImRscm93IG9sbGVoIi4KCi0gQ3ljbGVzIGdvaW5nIHRocm91Z2ggdGhlIF9fY2xhc3NfXyBsaW5rIG9mIGEgbmV3LXN0eWxlIGluc3RhbmNlIGFyZQogIG5vdyBkZXRlY3RlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCgotIENsYXNzZXMgdXNpbmcgX19zbG90c19fIGFyZSBub3cgcHJvcGVybHkgZ2FyYmFnZSBjb2xsZWN0ZWQuCiAgW1NGIGJ1ZyA1MTk2MjFdCgotIFRpZ2h0ZW5lZCB0aGUgX19zbG90c19fIHJ1bGVzOiBhIHNsb3QgbmFtZSBtdXN0IGJlIGEgdmFsaWQgUHl0aG9uCiAgaWRlbnRpZmllci4KCi0gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kdWxlIHR5cGUgbm93IHJlcXVpcmVzIGEgbmFtZSBhcmd1bWVudCBhbmQKICB0YWtlcyBhbiBvcHRpb25hbCBkb2NzdHJpbmcgYXJndW1lbnQuICBQcmV2aW91c2x5LCB0aGlzIGNvbnN0cnVjdG9yCiAgaWdub3JlZCBpdHMgYXJndW1lbnRzLiAgQXMgYSBjb25zZXF1ZW5jZSwgZGVyaXZpbmcgYSBjbGFzcyBmcm9tIGEKICBtb2R1bGUgKG5vdCBmcm9tIHRoZSBtb2R1bGUgdHlwZSkgaXMgbm93IGlsbGVnYWw7IHByZXZpb3VzbHkgdGhpcwogIGNyZWF0ZWQgYW4gdW5uYW1lZCBtb2R1bGUsIGp1c3QgbGlrZSBpbnZva2luZyB0aGUgbW9kdWxlIHR5cGUgZGlkLgogIFtTRiBidWcgNTYzMDYwXQoKLSBBIG5ldyB3YXJuaW5nIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgd2FzIGFkZGVkIHRvIHByb3ZpZGUKICBkaXJlY3Rpb24gb24gZmVhdHVyZXMgd2hpY2ggYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRlcHJlY2F0ZWQuCiAgVGhlIHdhcm5pbmcgd2lsbCBub3QgYmUgcHJpbnRlZCBieSBkZWZhdWx0LiAgVG8gc2VlIHRoZSBwZW5kaW5nCiAgZGVwcmVjYXRpb25zLCB1c2UgLVdhbHdheXM6OlBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmc6OgogIGFzIGEgY29tbWFuZCBsaW5lIG9wdGlvbiBvciB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygpIGluIGNvZGUuCgotIEEgbmV3IHR5cGUgb2JqZWN0LCAnYmFzZXN0cmluZycsIGlzIGFkZGVkLiAgVGhpcyBpcyBhIGNvbW1vbiBiYXNlIHR5cGUKICBmb3IgJ3N0cicgYW5kICd1bmljb2RlJywgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YKICB0eXBlcy5TdHJpbmdUeXBlcywgZS5nLiB0byB0ZXN0IHdoZXRoZXIgc29tZXRoaW5nIGlzICJhIHN0cmluZyI6CiAgaXNpbnN0YW5jZSh4LCBiYXNlc3RyaW5nKSBpcyBUcnVlIGZvciBVbmljb2RlIGFuZCA4LWJpdCBzdHJpbmdzLiAgVGhpcwogIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgYW5kIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuCgotIERlcHJlY2F0ZWQgZmVhdHVyZXMgb2YgeHJhbmdlIG9iamVjdHMgaGF2ZSBiZWVuIHJlbW92ZWQgYXMKICBwcm9taXNlZC4gIFRoZSBzdGFydCwgc3RvcCwgYW5kIHN0ZXAgYXR0cmlidXRlcyBhbmQgdGhlIHRvbGlzdCgpCiAgbWV0aG9kIG5vIGxvbmdlciBleGlzdC4gIHhyYW5nZSByZXBldGl0aW9uIGFuZCBzbGljaW5nIGhhdmUgYmVlbgogIHJlbW92ZWQuCgotIE5ldyBidWlsdGluIGZ1bmN0aW9uIGVudW1lcmF0ZSh4KSwgZnJvbSBQRVAgMjc5LiAgRXhhbXBsZToKICBlbnVtZXJhdGUoImFiYyIpIGlzIGFuIGl0ZXJhdG9yIHJldHVybmluZyAoMCwiYSIpLCAoMSwiYiIpLCAoMiwiYyIpLgogIFRoZSBhcmd1bWVudCBjYW4gYmUgYW4gYXJiaXRyYXJ5IGl0ZXJhYmxlIG9iamVjdC4KCi0gVGhlIGFzc2VydCBzdGF0ZW1lbnQgbm8gbG9uZ2VyIHRlc3RzIF9fZGVidWdfXyBhdCBydW50aW1lLiAgVGhpcyBtZWFucwogIHRoYXQgYXNzZXJ0IHN0YXRlbWVudHMgY2Fubm90IGJlIGRpc2FibGVkIGJ5IGFzc2lnbmluZyBhIGZhbHNlIHZhbHVlCiAgdG8gX19kZWJ1Z19fLgoKLSBBIG1ldGhvZCB6ZmlsbCgpIHdhcyBhZGRlZCB0byBzdHIgYW5kIHVuaWNvZGUsIHRoYXQgZmlsbHMgYSBudW1lcmljCiAgc3RyaW5nIHRvIHRoZSBsZWZ0IHdpdGggemVyb3MuICBGb3IgZXhhbXBsZSwKICAiKzEyMyIuemZpbGwoNikgLT4gIiswMDEyMyIuCgotIENvbXBsZXggbnVtYmVycyBzdXBwb3J0ZWQgZGl2bW9kKCkgYW5kIHRoZSAvLyBhbmQgJSBvcGVyYXRvcnMsIGJ1dAogIHRoZXNlIG1ha2Ugbm8gc2Vuc2UuICBTaW5jZSB0aGlzIHdhcyBkb2N1bWVudGVkLCB0aGV5J3JlIGJlaW5nCiAgZGVwcmVjYXRlZCBub3cuCgotIFN0cmluZyBhbmQgdW5pY29kZSBtZXRob2RzIGxzdHJpcCgpLCByc3RyaXAoKSBhbmQgc3RyaXAoKSBub3cgdGFrZQogIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgc3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXJzIHRvIHN0cmlwLiAgRm9yCiAgZXhhbXBsZSwgIkZvbyEhIT8hPyE/Ii5yc3RyaXAoIj8hIikgLT4gIkZvbyIuCgotIEFkZGVkIGEgbmV3IGRpY3QgbWV0aG9kIHBvcChrZXkpLiAgVGhpcyByZW1vdmVzIGFuZCByZXR1cm5zIHRoZQogIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8ga2V5LiAgW1NGIHBhdGNoICM1Mzk5NDldCgotIENoYW5nZWQgbmV3LXN0eWxlIGNsYXNzIGluc3RhbnRpYXRpb24gc28gdGhhdCB3aGVuIEMncyBfX25ld19fCiAgbWV0aG9kIHJldHVybnMgc29tZXRoaW5nIHRoYXQncyBub3QgYSBDIGluc3RhbmNlLCBpdHMgX19pbml0X18gaXMKICBub3QgY2FsbGVkLiAgW1NGIGJ1ZyAjNTM3NDUwXQoKLSBGaXhlZCBzdXBlcigpIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggY2xhc3MgbWV0aG9kcy4gIFtTRiBidWcgIzUzNTQ0NF0KCi0gQSBuZXcgYnVpbHQtaW4gdHlwZSwgYm9vbCwgaGFzIGJlZW4gYWRkZWQsIGFzIHdlbGwgYXMgYnVpbHQtaW4KICBuYW1lcyBmb3IgaXRzIHR3byB2YWx1ZXMsIFRydWUgYW5kIEZhbHNlLiAgQ29tcGFyaXNvbnMgYW5kIHN1bmRyeQogIG90aGVyIG9wZXJhdGlvbnMgdGhhdCByZXR1cm4gYSB0cnV0aCB2YWx1ZSBoYXZlIGJlZW4gY2hhbmdlZCB0bwogIHJldHVybiBhIGJvb2wgaW5zdGVhZC4gIFJlYWQgUEVQIDI4NSBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMKICBpcyBiYWNrd2FyZCBjb21wYXRpYmxlLgoKLSBGaXhlZCB0d28gYnVncyByZXBvcnRlZCBhcyBTRiAjNTM1OTA1OiB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsCiAgZGVhbGxvY2F0aW5nIGEgZGVlcGx5IG5lc3RlZCBzdHJ1Y3R1cmUgY291bGQgY2F1c2UgYSBzZWdmYXVsdCBpbiB0aGUKICBnYXJiYWdlIGNvbGxlY3RvciwgZHVlIHRvIGludGVyYWN0aW9uIHdpdGggdGhlICJ0cmFzaGNhbiIgY29kZTsKICBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgZnJhbWUgZHVyaW5nIGRlc3RydWN0aW9uIG9mIGEgbG9jYWwgdmFyaWFibGUKICBjb3VsZCBhY2Nlc3MgYSBwb2ludGVyIHRvIGZyZWVkIG1lbW9yeS4KCi0gVGhlIG9wdGlvbmFsIG9iamVjdCBhbGxvY2F0b3IgKCJweW1hbGxvYyIpIGhhcyBiZWVuIGVuYWJsZWQgYnkKICBkZWZhdWx0LiAgVGhlIHJlY29tbWVuZGVkIHByYWN0aWNlIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQKICBkZWFsbG9jYXRpb24gaGFzIGJlZW4gc3RyZWFtbGluZWQuICBBIGhlYWRlciBmaWxlIGlzIGluY2x1ZGVkLAogIE1pc2MvcHltZW1jb21wYXQuaCwgd2hpY2ggY2FuIGJlIGJ1bmRsZWQgd2l0aCAzcmQgcGFydHkgZXh0ZW5zaW9ucwogIGFuZCBsZXRzIHRoZW0gdXNlIHRoZSBzYW1lIEFQSSB3aXRoIFB5dGhvbiB2ZXJzaW9ucyBmcm9tIDEuNS4yCiAgb253YXJkcy4KCi0gSWYgeW91IHRyeSB0byBwaWNrbGUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBfX3Nsb3RzX18gYnV0CiAgZG9lc24ndCBkZWZpbmUgb3Igb3ZlcnJpZGUgX19nZXRzdGF0ZV9fLCBhIFR5cGVFcnJvciBpcyBub3cgcmFpc2VkLgogIFRoaXMgaXMgZG9uZSBieSBhZGRpbmcgYSBib3pvIF9fZ2V0c3RhdGVfXyB0byB0aGUgY2xhc3MgdGhhdCBhbHdheXMKICByYWlzZXMgVHlwZUVycm9yLiAgKEJlZm9yZSwgdGhpcyB3b3VsZCBhcHBlYXIgdG8gYmUgcGlja2xlZCwgYnV0IHRoZQogIHN0YXRlIG9mIHRoZSBzbG90cyB3b3VsZCBiZSBsb3N0LikKCi0gUHlFcnJfRGlzcGxheSB3aWxsIHByb3ZpZGUgZmlsZSBhbmQgbGluZSBpbmZvcm1hdGlvbiBmb3IgYWxsIGV4Y2VwdGlvbnMKICB0aGF0IGhhdmUgYW4gYXR0cmlidXRlIHByaW50X2ZpbGVfYW5kX2xpbmUsIG5vdCBqdXN0IFN5bnRheEVycm9ycy4KCi0gVGhlIFVURi04IGNvZGVjIHdpbGwgbm93IGVuY29kZSBhbmQgZGVjb2RlIFVuaWNvZGUgc3Vycm9nYXRlcwogIGNvcnJlY3RseSBhbmQgd2l0aG91dCByYWlzaW5nIGV4Y2VwdGlvbnMgZm9yIHVucGFpcmVkIG9uZXMuCgotIGZpbGUueHJlYWRsaW5lcygpIG5vdyByYWlzZXMgYSBWYWx1ZUVycm9yIGlmIHRoZSBmaWxlIGlzIGNsb3NlZDoKICBQcmV2aW91c2x5LCBhbiB4cmVhZGxpbmVzIG9iamVjdCB3YXMgcmV0dXJuZWQgd2hpY2ggd291bGQgcmFpc2UKICBhIFZhbHVlRXJyb3Igd2hlbiB0aGUgeHJlYWRsaW5lcy5uZXh0KCkgbWV0aG9kIHdhcyBjYWxsZWQuCgotIHN5cy5leGl0KCkgaW5hZHZlcnRlbnRseSBhbGxvd2VkIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQuCiAgQW4gZXhjZXB0aW9uIHdpbGwgbm93IGJlIHJhaXNlZCBpZiBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGlzIHVzZWQuCgpFeHRlbnNpb24gbW9kdWxlcwoKLSBUaGUgeHJlYWRsaW5lcyBtb2R1bGUgaXMgc2xhdGVkIGZvciBvYnNvbGVzY2VuY2UuCgotIFRoZSBzdHJwdGltZSBmdW5jdGlvbiBpbiB0aGUgdGltZSBtb2R1bGUgaXMgbm93IGFsd2F5cyBhdmFpbGFibGUgKGEKICBQeXRob24gaW1wbGVtZW50YXRpb24gaXMgdXNlZCB3aGVuIHRoZSBDIGxpYnJhcnkgZG9lc24ndCBkZWZpbmUgaXQpLgoKLSBUaGUgJ25ldycgbW9kdWxlIGlzIG5vIGxvbmdlciBhbiBleHRlbnNpb24sIGJ1dCBhIFB5dGhvbiBtb2R1bGUgdGhhdAogIG9ubHkgZXhpc3RzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEl0cyBjb250ZW50cyBhcmUgbm8gbG9uZ2VyCiAgZnVuY3Rpb25zIGJ1dCBjYWxsYWJsZSB0eXBlIG9iamVjdHMuCgotIFRoZSBic2RkYi4qb3BlbiBmdW5jdGlvbnMgY2FuIG5vdyB0YWtlICdOb25lJyBhcyBhIGZpbGVuYW1lLgogIFRoaXMgd2lsbCBjcmVhdGUgYSB0ZW1wb3JhcnkgaW4tbWVtb3J5IGJzZGRiIHRoYXQgd29uJ3QgYmUKICB3cml0dGVuIHRvIGRpc2suCgotIHBvc2l4LmxjaG93biwgcG9zaXgua2lsbHBnLCBwb3NpeC5ta25vZCwgYW5kIHBvc2l4LmdldHBnaWQgaGF2ZSBiZWVuCiAgYWRkZWQgd2hlcmUgYXZhaWxhYmxlLgoKLSBUaGUgbG9jYWxlIG1vZHVsZSBub3cgZXhwb3NlcyB0aGUgQyBsaWJyYXJ5J3MgZ2V0dGV4dCBpbnRlcmZhY2UuCgotIEEgc2VjdXJpdHkgaG9sZSAoImRvdWJsZSBmcmVlIikgd2FzIGZvdW5kIGluIHpsaWItMS4xLjMsIGEgcG9wdWxhcgogIHRoaXJkIHBhcnR5IGNvbXByZXNzaW9uIGxpYnJhcnkgdXNlZCBieSBzb21lIFB5dGhvbiBtb2R1bGVzLiAgVGhlCiAgaG9sZSB3YXMgcXVpY2tseSBwbHVnZ2VkIGluIHpsaWItMS4xLjQsIGFuZCB0aGUgV2luZG93cyBidWlsZCBvZgogIFB5dGhvbiBub3cgc2hpcHMgd2l0aCB6bGliLTEuMS40LgoKLSBwd2QsIGdycCwgYW5kIHJlc291cmNlIHJldHVybiBlbmhhbmNlZCB0dXBsZXMgbm93LCB3aXRoIHN5bWJvbGljCiAgZmllbGQgbmFtZXMuCgotIGFycmF5LmFycmF5IGlzIG5vdyBhIHR5cGUgb2JqZWN0LiBBIG5ldyBmb3JtYXQgY2hhcmFjdGVyCiAgJ3UnIGluZGljYXRlcyBQeV9VTklDT0RFIGFycmF5cy4gRm9yIHRob3NlLCAudG91bmljb2RlIGFuZAogIC5mcm9tdW5pY29kZSBtZXRob2RzIGFyZSBhdmFpbGFibGUuIEFycmF5cyBub3cgc3VwcG9ydCBfX2lhZGRfXwogIGFuZCBfX2ltdWxfXy4KCi0gZGwgbm93IGJ1aWxkcyBvbiBldmVyeSBzeXN0ZW0gdGhhdCBoYXMgZGxmY24uaC4gIEZhaWx1cmUgaW4gY2FzZQogIG9mIHNpemVvZihpbnQpIT1zaXplb2YobG9uZykhPXNpemVvZih2b2lkKikgaXMgZGVsYXllZCB1bnRpbCBkbC5vcGVuCiAgaXMgY2FsbGVkLgoKLSBzaWduYWwuc2lncGVuZGluZywgc2lnbmFsLnNpZ3Byb2NtYXNrIGFuZCBzaWduYWwuc2lnc3VzcGVuZCBoYXZlCiAgYmVlbiBhZGRlZCB3aGVyZSBhdmFpbGFibGUuCgpMaWJyYXJ5CgotIE5ldyAiYWxnb3JpdGhtcyIgbW9kdWxlOiBoZWFwcSwgaW1wbGVtZW50cyBhIGhlYXAgcXVldWUuICBUaGFua3MgdG8KICBLZXZpbiBPJ0Nvbm5vciBmb3IgdGhlIGNvZGUgYW5kIEZyYW7nb2lzIFBpbmFyZCBmb3IgYW4gZW50ZXJ0YWluaW5nCiAgd3JpdGUtdXAgZXhwbGFpbmluZyB0aGUgdGhlb3J5IGFuZCBwcmFjdGljYWwgdXNlcyBvZiBoZWFwcy4KCi0gTmV3IGVuY29kaW5nIGZvciB0aGUgUGFsbSBPUyBjaGFyYWN0ZXIgc2V0OiBwYWxtb3MuCgotIGJpbmFzY2lpLmNyYzMyKCkgYW5kIHRoZSB6aXBmaWxlIG1vZHVsZSBoYWQgcHJvYmxlbXMgb24gc29tZSA2NC1iaXQKICBwbGF0Zm9ybXMuICBUaGVzZSBoYXZlIGJlZW4gZml4ZWQuICBPbiBhIHBsYXRmb3JtIHdpdGggOC1ieXRlIEMgbG9uZ3MsCiAgY3JjMzIoKSBub3cgcmV0dXJucyBhIHNpZ25lZC1leHRlbmRlZCA0LWJ5dGUgcmVzdWx0LCBzbyB0aGF0IGl0cyB2YWx1ZQogIGFzIGEgUHl0aG9uIGludCBpcyBlcXVhbCB0byB0aGUgdmFsdWUgY29tcHV0ZWQgYSAzMi1iaXQgcGxhdGZvcm0uCgotIHhtbC5kb20ubWluaWRvbS50b3htbCBhbmQgdG9wcmV0dHl4bWwgbm93IHRha2UgYW4gb3B0aW9uYWwgZW5jb2RpbmcKICBhcmd1bWVudC4KCi0gU29tZSBmaXhlcyBpbiB0aGUgY29weSBtb2R1bGU6IHdoZW4gYW4gb2JqZWN0IGlzIGNvcGllZCB0aHJvdWdoIGl0cwogIF9fcmVkdWNlX18gbWV0aG9kLCB0aGVyZSB3YXMgbm8gY2hlY2sgZm9yIGEgX19zZXRzdGF0ZV9fIG1ldGhvZCBvbgogIHRoZSByZXN1bHQgW1NGIHBhdGNoIDU2NTA4NV07IGRlZXBjb3B5IHNob3VsZCB0cmVhdCBpbnN0YW5jZXMgb2YKICBjdXN0b20gbWV0YWNsYXNzZXMgdGhlIHNhbWUgd2F5IGl0IHRyZWF0cyBpbnN0YW5jZXMgb2YgdHlwZSAndHlwZScKICBbU0YgcGF0Y2ggNTYwNzk0XS4KCi0gU29ja2V0cyBub3cgc3VwcG9ydCB0aW1lb3V0IG1vZGUuICBBZnRlciBzLnNldHRpbWVvdXQoVCksIHdoZXJlIFQgaXMKICBhIGZsb2F0IGV4cHJlc3Npbmcgc2Vjb25kcywgc3Vic2VxdWVudCBvcGVyYXRpb25zIHJhaXNlIGFuIGV4Y2VwdGlvbgogIGlmIHRoZXkgY2Fubm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gVCBzZWNvbmRzLiAgVG8gZGlzYWJsZSB0aW1lb3V0CiAgbW9kZSwgdXNlIHMuc2V0dGltZW91dChOb25lKS4gIFRoZXJlJ3MgYWxzbyBhIG1vZHVsZSBmdW5jdGlvbiwKICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoVCksIHdoaWNoIHNldHMgdGhlIGRlZmF1bHQgZm9yIGFsbCBzb2NrZXRzCiAgY3JlYXRlZCBoZW5jZWZvcnRoLgoKLSBnZXRvcHQuZ251X2dldG9wdCB3YXMgYWRkZWQuICBUaGlzIHN1cHBvcnRzIEdOVS1zdHlsZSBvcHRpb24KICBwcm9jZXNzaW5nLCB3aGVyZSBvcHRpb25zIGNhbiBiZSBtaXhlZCB3aXRoIG5vbi1vcHRpb24gYXJndW1lbnRzLgoKLSBTdG9wIHVzaW5nIHN0cmluZ3MgZm9yIGV4Y2VwdGlvbnMuICBTdHJpbmcgb2JqZWN0cyB1c2VkIGZvcgogIGV4Y2VwdGlvbnMgYXJlIG5vdyBjbGFzc2VzIGRlcml2aW5nIGZyb20gRXhjZXB0aW9uLiAgVGhlIG9iamVjdHMKICBjaGFuZ2VkIHdlcmU6IFRraW50ZXIuVGNsRXJyb3IsIGJkYi5CZGJRdWl0LCBtYWNwYXRoLm5vcm1fZXJyb3IsCiAgdGFibmFubnkuTmFubnlOYWcsIGFuZCB4ZHJsaWIuRXJyb3IuCgotIENvbnN0YW50cyBCT01fVVRGOCwgQk9NX1VURjE2LCBCT01fVVRGMTZfTEUsIEJPTV9VVEYxNl9CRSwKICBCT01fVVRGMzIsIEJPTV9VVEYzMl9MRSBhbmQgQk9NX1VURjMyX0JFIHRoYXQgcmVwcmVzZW50IHRoZSBCeXRlCiAgT3JkZXIgTWFyayBpbiBVVEYtOCwgVVRGLTE2IGFuZCBVVEYtMzIgZW5jb2RpbmdzIGZvciBsaXR0bGUgYW5kCiAgYmlnIGVuZGlhbiBzeXN0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIGNvZGVjcyBtb2R1bGUuIFRoZSBvbGQgbmFtZXMKICBCT00zMl8qIGFuZCBCT002NF8qIHdlcmUgb2ZmIGJ5IGEgZmFjdG9yIG9mIDIuCgotIEFkZGVkIGNvbnZlcnNpb24gZnVuY3Rpb25zIG1hdGguZGVncmVlcygpIGFuZCBtYXRoLnJhZGlhbnMoKS4KCi0gZnRwbGliLnJldHJsaW5lcygpIG5vdyB0ZXN0cyBmb3IgY2FsbGJhY2sgaXMgTm9uZSByYXRoZXIgdGhhbiB0ZXN0aW5nCiAgZm9yIEZhbHNlLiAgV2FzIGNhdXNpbmcgYW4gZXJyb3Igd2hlbiBnaXZlbiBhIGNhbGxiYWNrIG9iamVjdCB3aGljaAogIHdhcyBjYWxsYWJsZSBidXQgYWxzbyByZXR1cm5lZCBsZW4oKSBhcyB6ZXJvLiAgVGhlIGNoYW5nZSBtYXkKICBjcmVhdGUgbmV3IGJyZWFrYWdlIGlmIHRoZSBjYWxsZXIgcmVsaWVkIG9uIHRoZSB1bmRvY3VtZW50ZWQgYmVoYXZpb3IKICBhbmQgY2FsbGVkIHdpdGggY2FsbGJhY2sgc2V0IHRvIFtdIG9yIHNvbWUgb3RoZXIgRmFsc2UgdmFsdWUgbm90CiAgaWRlbnRpY2FsIHRvIE5vbmUuCgotIHJhbmRvbS5nYXVzcygpIHVzZXMgYSBwaWVjZSBvZiBoaWRkZW4gc3RhdGUgdXNlZCBieSBub3RoaW5nIGVsc2UsCiAgYW5kIHRoZSAuc2VlZCgpIGFuZCAud2hzZWVkKCkgbWV0aG9kcyBmYWlsZWQgdG8gcmVzZXQgaXQuICBJbiBvdGhlcgogIHdvcmRzLCBzZXR0aW5nIHRoZSBzZWVkIGRpZG4ndCBjb21wbGV0ZWx5IGRldGVybWluZSB0aGUgc2VxdWVuY2Ugb2YKICByZXN1bHRzIHByb2R1Y2VkIGJ5IHJhbmRvbS5nYXVzcygpLiAgSXQgZG9lcyBub3cuICBQcm9ncmFtcyByZXBlYXRlZGx5CiAgbWl4aW5nIGNhbGxzIHRvIGEgc2VlZCBtZXRob2Qgd2l0aCBjYWxscyB0byBnYXVzcygpIG1heSBzZWUgZGlmZmVyZW50CiAgcmVzdWx0cyBub3cuCgotIFRoZSBwaWNrbGUuUGlja2xlciBjbGFzcyBncmV3IGEgY2xlYXJfbWVtbygpIG1ldGhvZCB0byBtaW1pYyB0aGF0CiAgcHJvdmlkZWQgYnkgY1BpY2tsZS5QaWNrbGVyLgoKLSBkaWZmbGliJ3MgU2VxdWVuY2VNYXRjaGVyIGNsYXNzIG5vdyBkb2VzIGEgZHluYW1pYyBhbmFseXNpcyBvZgogIHdoaWNoIGVsZW1lbnRzIGFyZSBzbyBmcmVxdWVudCBhcyB0byBjb25zdGl0dXRlIG5vaXNlLiAgRm9yCiAgY29tcGFyaW5nIGZpbGVzIGFzIHNlcXVlbmNlcyBvZiBsaW5lcywgdGhpcyBnZW5lcmFsbHkgd29ya3MgYmV0dGVyCiAgdGhhbiB0aGUgSVNfTElORV9KVU5LIGZ1bmN0aW9uLCBhbmQgZnVuY3Rpb24gbmRpZmYncyBsaW5lanVuawogIGFyZ3VtZW50IGRlZmF1bHRzIHRvIE5vbmUgbm93IGFzIGEgcmVzdWx0LiAgQSBoYXBweSBiZW5lZml0IGlzCiAgdGhhdCBTZXF1ZW5jZU1hdGNoZXIgbWF5IHJ1biBtdWNoIGZhc3RlciBub3cgd2hlbiBhcHBsaWVkCiAgdG8gbGFyZ2UgZmlsZXMgd2l0aCBtYW55IGR1cGxpY2F0ZSBsaW5lcyAoZm9yIGV4YW1wbGUsIEMgcHJvZ3JhbQogIHRleHQgd2l0aCBsb3RzIG9mIHJlcGVhdGVkICJ9IiBhbmQgInJldHVybiBOVUxMOyIgbGluZXMpLgoKLSBOZXcgVGV4dC5kdW1wKCkgbWV0aG9kIGluIFRraW50ZXIgbW9kdWxlLgoKLSBOZXcgZGlzdHV0aWxzIGNvbW1hbmRzIGZvciBidWlsZGluZyBwYWNrYWdlcnMgd2VyZSBhZGRlZCB0bwogIHN1cHBvcnQgcGtndG9vbCBvbiBTb2xhcmlzIGFuZCBzd2luc3RhbGwgb24gSFAtVVguCgotIGRpc3R1dGlscyBub3cgaGFzIGEgbmV3IGFic3RyYWN0IGJpbmFyeSBwYWNrYWdlciBiYXNlIGNsYXNzCiAgY29tbWFuZC9iZGlzdF9wYWNrYWdlciwgd2hpY2ggc2ltcGxpZmllcyB3cml0aW5nIHBhY2thZ2Vycy4KICBUaGlzIHdpbGwgaG9wZWZ1bGx5IHByb3ZpZGUgdGhlIG1pc3NpbmcgYml0cyB0byBlbmNvdXJhZ2UKICBwZW9wbGUgdG8gc3VibWl0IG1vcmUgcGFja2FnZXJzLCBlLmcuIGZvciBEZWJpYW4sIEZyZWVCU0QKICBhbmQgb3RoZXIgc3lzdGVtcy4KCi0gVGhlIFVURi0xNiwgLUxFIGFuZCAtQkUgc3RyZWFtIHJlYWRlcnMgbm93IHJhaXNlIGEKICBOb3RJbXBsZW1lbnRlZEVycm9yIGZvciBhbGwgY2FsbHMgdG8gLnJlYWRsaW5lKCkuIFByZXZpb3VzbHksIHRoZXkKICB1c2VkIHRvIGp1c3QgcHJvZHVjZSBnYXJiYWdlIG9yIGZhaWwgd2l0aCBhbiBlbmNvZGluZyBlcnJvciAtLQogIFVURi0xNiBpcyBhIDItYnl0ZSBlbmNvZGluZyBhbmQgdGhlIEMgbGliJ3MgbGluZSByZWFkaW5nIEFQSXMgZG9uJ3QKICB3b3JrIHdlbGwgd2l0aCB0aGVzZS4KCi0gY29tcGlsZWFsbCBub3cgc3VwcG9ydHMgcXVpZXQgb3BlcmF0aW9uLgoKLSBUaGUgQmFzZUhUVFBTZXJ2ZXIgbm93IGltcGxlbWVudHMgb3B0aW9uYWwgSFRUUC8xLjEgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zLgoKLSBzb2NrZXQgbW9kdWxlOiB0aGUgU1NMIHN1cHBvcnQgd2FzIGJyb2tlbiBvdXQgb2YgdGhlIG1haW4KICBfc29ja2V0IG1vZHVsZSBDIGhlbHBlciBhbmQgcGxhY2VkIGludG8gYSBuZXcgX3NzbCBoZWxwZXIKICB3aGljaCBub3cgZ2V0cyBpbXBvcnRlZCBieSBzb2NrZXQucHkgaWYgYXZhaWxhYmxlIGFuZCB3b3JraW5nLgoKLSBlbmNvZGluZ3MgcGFja2FnZTogYWRkZWQgYWxpYXNlcyBmb3IgYWxsIHN1cHBvcnRlZCBJQU5BIGNoYXJhY3RlcgogIHNldHMKCi0gZnRwbGliOiB0byBzYWZlZ3VhcmQgdGhlIHVzZXIncyBwcml2YWN5LCBhbm9ueW1vdXMgbG9naW4gd2lsbCB1c2UKICAiYW5vbnltb3VzQCIgYXMgZGVmYXVsdCBwYXNzd29yZCwgcmF0aGVyIHRoYW4gdGhlIHJlYWwgdXNlciBhbmQgaG9zdAogIG5hbWUuCgotIHdlYmJyb3dzZXI6IHRpZ2h0ZW5lZCB1cCB0aGUgY29tbWFuZCBwYXNzZWQgdG8gb3Muc3lzdGVtKCkgc28gdGhhdAogIGFyYml0cmFyeSBzaGVsbCBjb2RlIGNhbid0IGJlIGV4ZWN1dGVkIGJlY2F1c2UgYSBib2d1cyBVUkwgd2FzCiAgcGFzc2VkIGluLgoKLSBnZXR0ZXh0LnRyYW5zbGF0aW9uIGhhcyBhbiBvcHRpb25hbCBmYWxsYmFjayBhcmd1bWVudCwgYW5kCiAgZ2V0dGV4dC5maW5kIGFuIG9wdGlvbmFsIGFsbCBhcmd1bWVudC4gVHJhbnNsYXRpb25zIHdpbGwgbm93IGZhbGxiYWNrCiAgb24gYSBwZXItbWVzc2FnZSBiYXNpcy4KCi0gZGlzdHV0aWxzIGJkaXN0IGNvbW1hbmRzIG5vdyBvZmZlciBhIC0tc2tpcC1idWlsZCBvcHRpb24uCgotIHdhcm5pbmdzLndhcm4gbm93IGFjY2VwdHMgYSBXYXJuaW5nIGluc3RhbmNlIGFzIGZpcnN0IGFyZ3VtZW50LgoKLSBUaGUgeG1sLnNheC5leHBhdHJlYWRlci5FeHBhdFBhcnNlciBjbGFzcyB3aWxsIG5vIGxvbmdlciBjcmVhdGUKICBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IHVzaW5nIGl0c2VsZiBhcyB0aGUgbG9jYXRvciB0aGF0IGdldHMgcGFzc2VkCiAgdG8gdGhlIGNvbnRlbnQgaGFuZGxlciBpbXBsZW1lbnRhdGlvbi4gIFtTRiBidWcgIzUzNTQ3NF0KCi0gVGhlIGVtYWlsLlBhcnNlci5QYXJzZXIgY2xhc3Mgbm93IHByb3Blcmx5IHBhcnNlcyBzdHJpbmdzIHJlZ2FyZGxlc3MKICBvZiB0aGVpciBsaW5lIGVuZGluZ3MsIHdoaWNoIGNhbiBiZSBhbnkgb2YgXHIsIFxuLCBvciBcclxuIChDUiwgTEYsCiAgb3IgQ1JMRikuICBBbHNvLCB0aGUgSGVhZGVyIGNsYXNzJ3MgY29uc3RydWN0b3IgZGVmYXVsdCBhcmd1bWVudHMKICBoYXMgY2hhbmdlZCBzbGlnaHRseSBzbyB0aGF0IGFuIGV4cGxpY2l0IG1heGxpbmVsZW4gdmFsdWUgaXMgYWx3YXlzCiAgaG9ub3JlZC4KClRvb2xzL0RlbW9zCgotIElETEUgc3VwcG9ydHMgdGhlIG5ldyBlbmNvZGluZyBkZWNsYXJhdGlvbnMgKFBFUCAyNjMpOyBpdCBjYW4gYWxzbwogIGRlYWwgd2l0aCBsZWdhY3kgOC1iaXQgZmlsZXMgaWYgdGhleSB1c2UgdGhlIGxvY2FsZSdzIGVuY29kaW5nLiBJdAogIGFsbG93cyBub24tQVNDSUkgc3RyaW5ncyBpbiB0aGUgaW50ZXJhY3RpdmUgc2hlbGwgYW5kIGV4ZWN1dGVzIHRoZW0KICBpbiB0aGUgbG9jYWxlJ3MgZW5jb2RpbmcuCgotIGZyZWV6ZS5weSBub3cgcHJvZHVjZXMgYmluYXJpZXMgd2hpY2ggY2FuIGltcG9ydCBzaGFyZWQgbW9kdWxlcywKICB1bmxpa2UgYmVmb3JlIHdoZW4gdGhpcyBmYWlsZWQgZHVlIHRvIG1pc3Npbmcgc3ltYm9sIGV4cG9ydHMgaW4KICB0aGUgZ2VuZXJhdGVkIGJpbmFyeS4KCkJ1aWxkCgotIFRoZSBwdWJsaWMgUHl0aG9uIEMgQVBJIHdpbGwgZ2VuZXJhbGx5IGJlIGRlY2xhcmVkIHVzaW5nIFB5QVBJX0ZVTkMKICAgYW5kIFB5QVBJX0RBVEEgbWFjcm9zLCB3aGlsZSBQeXRob24gZXh0ZW5zaW9uIG1vZHVsZSBpbml0IGZ1bmN0aW9ucwogICB3aWxsIGJlIGRlY2xhcmVkIHdpdGggUHlNT0RJTklUX0ZVTkMuICBETF9FWFBPUlQvRExfSU1QT1JUIG1hY3JvcwogICBhcmUgZGVwcmVjYXRlZC4KCi0gQSBidWcgd2FzIGZpeGVkIHRoYXQgY291bGQgY2F1c2UgQ09VTlRfQUxMT0NTIGJ1aWxkcyB0byBzZWdmYXVsdCwgb3IKICBnZXQgaW50byBpbmZpbml0ZSBsb29wcywgd2hlbiBhIG5ldy1zdHlsZSBjbGFzcyBnb3QgZ2FyYmFnZS1jb2xsZWN0ZWQuCiAgVW5mb3J0dW5hdGVseSwgdG8gYXZvaWQgdGhpcywgdGhlIHdheSBDT1VOVF9BTExPQ1Mgd29ya3MgcmVxdWlyZXMKICB0aGF0IG5ldy1zdHlsZSBjbGFzc2VzIGJlIGltbW9ydGFsIGluIENPVU5UX0FMTE9DUyBidWlsZHMuICBOb3RlIHRoYXQKICBDT1VOVF9BTExPQ1MgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCwgaW4gZWl0aGVyIHJlbGVhc2Ugb3IgZGVidWcKICBidWlsZHMsIGFuZCB0aGF0IG5ldy1zdHlsZSBjbGFzc2VzIGFyZSBpbW1vcnRhbCBvbmx5IGluIENPVU5UX0FMTE9DUwogIGJ1aWxkcy4KCi0gQ29tcGlsaW5nIG91dCB0aGUgY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yIGlzIG5vIGxvbmdlciBhbiBvcHRpb24uCiAgVGhlIG9sZCBzeW1ib2wgV0lUSF9DWUNMRV9HQyBpcyBub3cgaWdub3JlZCwgYW5kIFB5dGhvbi5oIGFycmFuZ2VzCiAgdGhhdCBpdCdzIGFsd2F5cyBkZWZpbmVkIChmb3IgdGhlIGJlbmVmaXQgb2YgYW55IGV4dGVuc2lvbiBtb2R1bGVzCiAgdGhhdCBtYXkgYmUgY29uZGl0aW9uYWxpemluZyBvbiBpdCkuICBBIGJvbnVzIGlzIHRoYXQgYW55IGV4dGVuc2lvbgogIHR5cGUgcGFydGljaXBhdGluZyBpbiBjeWNsaWMgZ2MgY2FuIGNob29zZSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUKICBQeV9UUkFTSENBTiBtZWNoYW5pc20gbm93IHRvbzsgaW4gdGhlIGFic2VuY2Ugb2YgY3ljbGljIGdjLCB0aGlzIHVzZWQKICB0byByZXF1aXJlIGVkaXRpbmcgdGhlIGNvcmUgdG8gdGVhY2ggdGhlIHRyYXNoY2FuIG1lY2hhbmlzbSBhYm91dCB0aGUKICBuZXcgdHlwZS4KCi0gQWNjb3JkaW5nIHRvIEFubmV4IEYgb2YgdGhlIGN1cnJlbnQgQyBzdGFuZGFyZCwKCiAgICBUaGUgU3RhbmRhcmQgQyBtYWNybyBIVUdFX1ZBTCBhbmQgaXRzIGZsb2F0IGFuZCBsb25nIGRvdWJsZSBhbmFsb2dzLAogICAgSFVHRV9WQUxGIGFuZCBIVUdFX1ZBTEwsIGV4cGFuZCB0byBleHByZXNzaW9ucyB3aG9zZSB2YWx1ZXMgYXJlCiAgICBwb3NpdGl2ZSBpbmZpbml0aWVzLgoKICBQeXRob24gb25seSB1c2VzIHRoZSBkb3VibGUgSFVHRV9WQUwsIGFuZCBvbmx5IHRvICNkZWZpbmUgaXRzIG93biBzeW1ib2wKICBQeV9IVUdFX1ZBTC4gIFNvbWUgcGxhdGZvcm1zIGhhdmUgaW5jb3JyZWN0IGRlZmluaXRpb25zIGZvciBIVUdFX1ZBTC4KICBweXBvcnQuaCB1c2VkIHRvIHRyeSB0byB3b3JtIGFyb3VuZCB0aGF0LCBidXQgdGhlIHdvcmthcm91bmRzIHRyaWdnZXJlZAogIG90aGVyIGJ1Z3Mgb24gb3RoZXIgcGxhdGZvcm1zLCBzbyB3ZSBnYXZlIHVwLiAgSWYgeW91ciBwbGF0Zm9ybSBkZWZpbmVzCiAgSFVHRV9WQUwgaW5jb3JyZWN0bHksIHlvdSdsbCBuZWVkIHRvICNkZWZpbmUgUHlfSFVHRV9WQUwgdG8gc29tZXRoaW5nCiAgdGhhdCB3b3JrcyBvbiB5b3VyIHBsYXRmb3JtLiAgVGhlIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBJJ20gc3VyZSBhYm91dAogIGlzIG9uIGFuIHVua25vd24gc3Vic2V0IG9mIENyYXkgc3lzdGVtcywgZGVzY3JpYmVkIGhlcmU6CgogIGh0dHA6Ly93d3cuY3JheS5jb20vc3dwdWJzL21hbnVhbHMvU04tMjE5NF8yLjAvaHRtbC1TTi0yMTk0XzIuMC94MzEzOC5odG0KCiAgUHJlc3VtYWJseSAyLjNhMSBicmVha3Mgc3VjaCBzeXN0ZW1zLiAgSWYgYW55b25lIHVzZXMgc3VjaCBhIHN5c3RlbSwgaGVscCEKCi0gVGhlIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRob3V0LWRvYy1zdHJpbmdzIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUKICBkb2Mgc3RyaW5ncyBmcm9tIHRoZSBidWlsdGluIGZ1bmN0aW9ucyBhbmQgbW9kdWxlczsgdGhpcyByZWR1Y2VzIHRoZQogIHNpemUgb2YgdGhlIGV4ZWN1dGFibGUuCgotIFhYWCBXSVRIX1VOSVZFUlNBTF9ORVdMSU5FUyBTb21lYm9keSBmaWxsIHRoaXMgaW47IHRoZSBQRVAgZG9lc24ndAogIHNheSBob3cgb3Igd2hlbiB0byBjb25maWd1cmUgaXQsIG9yIGhvdyB0byB0dXJuIGl0IG9mZi4KCi0gT24gVW5peCwgYSBzaGFyZWQgbGlicHl0aG9uMi4zLnNvIGNhbiBiZSBjcmVhdGVkIHdpdGggLS1lbmFibGUtc2hhcmVkLgoKLSBBbGwgdXNlcyBvZiB0aGUgQ0FDSEVfSEFTSCwgSU5URVJOX1NUUklOR1MsIGFuZCBET05UX1NIQVJFX1NIT1JUX1NUUklOR1MKICBwcmVwcm9jZXNzb3Igc3ltYm9scyB3ZXJlIGVsaW1pbmF0ZWQuICBUaGUgaW50ZXJuYWwgZGVjaXNpb25zIHRoZXkKICBjb250cm9sbGVkIHN0b3BwZWQgYmVpbmcgZXhwZXJpbWVudGFsIGxvbmcgYWdvLgoKLSBUaGUgdG9vbHMgdXNlZCB0byBidWlsZCB0aGUgZG9jdW1lbnRhdGlvbiBub3cgd29yayB1bmRlciBDeWd3aW4gYXMKICB3ZWxsIGFzIFVuaXguCgotIFRoZSBic2RkYiBhbmQgZGJtIG1vZHVsZSBidWlsZHMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gdHJ5IGFuZCBhdm9pZCB2ZXJzaW9uCiAgc2tldyBwcm9ibGVtcyBhbmQgZGlzYWJsZSBsaW5rYWdlIHdpdGggQmVya2VsZXkgREIgMS44NSB1bmxlc3MgdGhlCiAgaW5zdGFsbGVyIGtub3dzIHdoYXQgcy9oZSdzIGRvaW5nLiAgU2VlIHRoZSBzZWN0aW9uIG9uIGJ1aWxkaW5nIHRoZXNlCiAgbW9kdWxlcyBpbiB0aGUgUkVBRE1FIGZpbGUgZm9yIGRldGFpbHMuCgpDIEFQSQoKLSBOZXcgZnVuY3Rpb25zIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKCkgYW5kCiAgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoKS4gU2ltaWxhciB0bwogIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKCkgYW5kCiAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoKSwgYnV0IHRoZXkgYWxsb3cgdG8gc3BlY2lmeQogIHRoZSBleGNlcHRpb24gdHlwZSB0byByYWlzZS4gQXZhaWxhYmxlIG9uIFdpbmRvd3MuCgotIFB5X0ZhdGFsRXJyb3IoKSBpcyBub3cgZGVjbGFyZWQgYXMgdGFraW5nIGEgY29uc3QgY2hhciogYXJndW1lbnQuICBJdAogIHdhcyBwcmV2aW91c2x5IGRlY2xhcmVkIHdpdGhvdXQgY29uc3QuICBUaGlzIHNob3VsZCBub3QgYWZmZWN0IHdvcmtpbmcKICBjb2RlLgoKLSBBZGRlZCBuZXcgbWFjcm8gUHlTZXF1ZW5jZV9JVEVNKG8sIGkpIHRoYXQgZGlyZWN0bHkgY2FsbHMKICBzcV9pdGVtIHdpdGhvdXQgcmVjaGVja2luZyB0aGF0IG8gaXMgYSBzZXF1ZW5jZSBhbmQgd2l0aG91dAogIGFkanVzdGluZyBmb3IgbmVnYXRpdmUgaW5kaWNlcy4KCi0gUHlSYW5nZV9OZXcoKSBub3cgcmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIGZvdXJ0aCBhcmd1bWVudCBpcyBub3QgMS4KICBUaGlzIGlzIHBhcnQgb2YgdGhlIHJlbW92YWwgb2YgZGVwcmVjYXRlZCBmZWF0dXJlcyBvZiB0aGUgeHJhbmdlCiAgb2JqZWN0LgoKLSBQeU51bWJlcl9Db2VyY2UoKSBhbmQgUHlOdW1iZXJfQ29lcmNlRXgoKSBub3cgYWxzbyBpbnZva2UgdGhlIHR5cGUncwogIGNvZXJjaW9uIGlmIGJvdGggYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgdHlwZSBidXQgdGhpcyB0eXBlIGhhcyB0aGUKICBDSEVDS1RZUEVTIGZsYWcgc2V0LiAgVGhpcyBpcyB0byBiZXR0ZXIgc3VwcG9ydCBwcm94aWVzLgoKLSBUaGUgdHlwZSBvZiB0cF9mcmVlIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSAidm9pZCAoKikoUHlPYmplY3QgKikiIHRvCiAgInZvaWQgKCopKHZvaWQgKikiLgoKLSBQeU9iamVjdF9EZWwsIFB5T2JqZWN0X0dDX0RlbCBhcmUgbm93IGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIG1hY3Jvcy4KCi0gQSB0eXBlIGNhbiBub3cgaW5oZXJpdCBpdHMgbWV0YXR5cGUgZnJvbSBpdHMgYmFzZSB0eXBlLiAgUHJldmlvdXNseSwKICB3aGVuIFB5VHlwZV9SZWFkeSgpIHdhcyBjYWxsZWQsIGlmIG9iX3R5cGUgd2FzIGZvdW5kIHRvIGJlIE5VTEwsIGl0CiAgd2FzIGFsd2F5cyBzZXQgdG8gJlB5VHlwZV9UeXBlOyBub3cgaXQgaXMgc2V0IHRvIGJhc2UtPm9iX3R5cGUsCiAgd2hlcmUgYmFzZSBpcyB0cF9iYXNlLCBkZWZhdWx0aW5nIHRvICZQeU9iamVjdF9UeXBlLgoKLSBQeVR5cGVfUmVhZHkoKSBhY2NpZGVudGFsbHkgZGlkIG5vdCBpbmhlcml0IHRwX2lzX2djOyBub3cgaXQgZG9lcy4KCi0gVGhlIFB5Q29yZV8qIGZhbWlseSBvZiBBUElzIGhhdmUgYmVlbiByZW1vdmVkLgoKLSBUaGUgInUjIiBwYXJzZXIgbWFya2VyIHdpbGwgbm93IHBhc3MgdGhyb3VnaCBVbmljb2RlIG9iamVjdHMgYXMtaXMKICB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIGJ1ZmZlciBBUEkuCgotIFRoZSBlbnVtZXJhdG9ycyBvZiBjbXBfb3AgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gdXNlIHRoZSBwcmVmaXggUHlDbXBfLgoKLSBBbiBvbGQgI2RlZmluZSBvZiBBTlkgYXMgdm9pZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gcHlwb3J0LmguICBUaGlzCiAgaGFzbid0IGJlZW4gdXNlZCBzaW5jZSBQeXRob24ncyBwcmUtQU5TSSBkYXlzLCBhbmQgdGhlICNkZWZpbmUgaGFzCiAgYmVlbiBtYXJrZWQgYXMgb2Jzb2xldGUgc2luY2UgdGhlbi4gIFNGIGJ1ZyA0OTU1NDggc2F5cyBpdCBjcmVhdGVkCiAgY29uZmxpY3RzIHdpdGggb3RoZXIgcGFja2FnZXMsIHNvIGtlZXBpbmcgaXQgYXJvdW5kIHdhc24ndCBoYXJtbGVzcy4KCi0gQmVjYXVzZSBQeXRob24ncyBtYWdpYyBudW1iZXIgc2NoZW1lIGJyb2tlIG9uIEphbnVhcnkgMXN0LCB3ZSBkZWNpZGVkCiAgdG8gc3RvcCBQeXRob24gZGV2ZWxvcG1lbnQuICBUaGFua3MgZm9yIGFsbCB0aGUgZmlzaCEKCi0gU29tZSBvZiB1cyBkb24ndCBsaWtlIGZpc2gsIHNvIHdlIGNoYW5nZWQgUHl0aG9uJ3MgbWFnaWMgbnVtYmVyCiAgc2NoZW1lIHRvIGEgbmV3IG9uZS4gU2VlIFB5dGhvbi9pbXBvcnQuYyBmb3IgZGV0YWlscy4KCk5ldyBwbGF0Zm9ybXMKCi0gQXRoZU9TIGlzIG5vdyBzdXBwb3J0ZWQuCgotIHRoZSBFTVggcnVudGltZSBlbnZpcm9ubWVudCBvbiBPUy8yIGlzIG5vdyBzdXBwb3J0ZWQuCgotIEdOVS9IdXJkIGlzIG5vdyBzdXBwb3J0ZWQuCgpUZXN0cwoKV2luZG93cwoKLSBTb21ldGltZXMgdGhlIHVuaW5zdGFsbCBleGVjdXRhYmxlIChVTldJU0UuRVhFKSB2YW5pc2hlcy4gIE9uZSBjYXVzZQogIG9mIHRoYXQgaGFzIGJlZW4gZml4ZWQgaW4gdGhlIGluc3RhbGxlciAoZGlzYWJsZWQgV2lzZSdzICJkZWxldGUgaW4tCiAgdXNlIGZpbGVzIiB1bmluc3RhbGwgb3B0aW9uKS4KCi0gRml4ZWQgYSBidWcgaW4gdXJsbGliJ3MgcHJveHkgaGFuZGxpbmcgaW4gV2luZG93cy4gIFtTRiBidWcgIzUwMzAzMV0KCi0gVGhlIGluc3RhbGxlciBub3cgaW5zdGFsbHMgU3RhcnQgbWVudSBzaG9ydGN1dHMgdW5kZXIgKHRoZSBsb2NhbAogIGVxdWl2YWxlbnQgb2YpICJBbGwgVXNlcnMiIHdoZW4gZG9pbmcgYW4gQWRtaW4gaW5zdGFsbC4KCi0gZmlsZS50cnVuY2F0ZShbbmV3c2l6ZV0pIG5vdyB3b3JrcyBvbiBXaW5kb3dzIGZvciBhbGwgbmV3c2l6ZSB2YWx1ZXMuCiAgSXQgdXNlZCB0byBmYWlsIGlmIG5ld3NpemUgZGlkbid0IGZpdCBpbiAzMiBiaXRzLCByZWZsZWN0aW5nIGEKICBsaW1pdGF0aW9uIG9mIE1TIF9jaHNpemUgKHdoaWNoIGlzIG5vIGxvbmdlciB1c2VkKS4KCi0gb3Mud2FpdHBpZCgpIGlzIG5vdyBpbXBsZW1lbnRlZCBmb3IgV2luZG93cywgYW5kIGNhbiBiZSB1c2VkIHRvIGJsb2NrCiAgdW50aWwgYSBzcGVjaWZpZWQgcHJvY2VzcyBleGl0cy4gIFRoaXMgaXMgc2ltaWxhciB0bywgYnV0IG5vdCBleGFjdGx5CiAgdGhlIHNhbWUgYXMsIG9zLndhaXRwaWQoKSBvbiBQT1NJWCBzeXN0ZW1zLiAgSWYgeW91J3JlIHdhaXRpbmcgZm9yCiAgYSBzcGVjaWZpYyBwcm9jZXNzIHdob3NlIHBpZCB3YXMgb2J0YWluZWQgZnJvbSBvbmUgb2YgdGhlIHNwYXduKCkKICBmdW5jdGlvbnMsIHRoZSBzYW1lIFB5dGhvbiBvcy53YWl0cGlkKCkgY29kZSB3b3JrcyBhY3Jvc3MgcGxhdGZvcm1zLgogIFNlZSB0aGUgZG9jcyBmb3IgZGV0YWlscy4gIFRoZSBkb2NzIHdlcmUgY2hhbmdlZCB0byBjbGFyaWZ5IHRoYXQKICBzcGF3biBmdW5jdGlvbnMgcmV0dXJuLCBhbmQgd2FpdHBpZCByZXF1aXJlcywgYSBwcm9jZXNzIGhhbmRsZSBvbgogIFdpbmRvd3MgKG5vdCB0aGUgc2FtZSB0aGluZyBhcyBhIFdpbmRvd3MgcHJvY2VzcyBpZCkuCgotIE5ldyB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlIGltcGxlbWVudGF0aW9uIGZvciBXaW5kb3dzOiAgdGhpcyBkb2Vzbid0CiAgbmVlZCBhIFRlbXBvcmFyeUZpbGVXcmFwcGVyIHdyYXBwZXIgYW55bW9yZSwgYW5kIHNob3VsZCBiZSBpbW11bmUKICB0byBhIG5hc3R5IHByb2JsZW06ICBiZWZvcmUgMi4zLCBpZiB5b3UgZ290IGEgdGVtcCBmaWxlIG9uIFdpbmRvd3MsIGl0CiAgZ290IHdyYXBwZWQgaW4gYW4gb2JqZWN0IHdob3NlIGNsb3NlKCkgbWV0aG9kIGZpcnN0IGNsb3NlZCB0aGUKICB1bmRlcmx5aW5nIGZpbGUsIHRoZW4gZGVsZXRlZCB0aGUgZmlsZS4gIFRoaXMgdXN1YWxseSB3b3JrZWQgZmluZS4KICBIb3dldmVyLCB0aGUgc3Bhd24gZmFtaWx5IG9mIGZ1bmN0aW9ucyBvbiBXaW5kb3dzIGNyZWF0ZSAoYXQgYSBsb3cgQwogIGxldmVsKSB0aGUgc2FtZSBzZXQgb2Ygb3BlbiBmaWxlcyBpbiB0aGUgc3Bhd25lZCBwcm9jZXNzIFEgYXMgd2VyZQogIG9wZW4gaW4gdGhlIHNwYXduaW5nIHByb2Nlc3MgUC4gIElmIGEgdGVtcCBmaWxlIGYgd2FzIGFtb25nIHRoZW0sIHRoZW4KICBkb2luZyBmLmNsb3NlKCkgaW4gUCBmaXJzdCBjbG9zZWQgUCdzIEMtbGV2ZWwgZmlsZSBoYW5kbGUgb24gZiwgYnV0IFEncwogIEMtbGV2ZWwgZmlsZSBoYW5kbGUgb24gZiByZW1haW5lZCBvcGVuLCBzbyB0aGUgYXR0ZW1wdCBpbiBQIHRvIGRlbGV0ZSBmCiAgYmxldyB1cCB3aXRoIGEgIlBlcm1pc3Npb24gZGVuaWVkIiBlcnJvciAoV2luZG93cyBkb2Vzbid0IGFsbG93CiAgZGVsZXRpbmcgb3BlbiBmaWxlcykuICBUaGlzIHdhcyBzdXJwcmlzaW5nLCBzdWJ0bGUsIGFuZCBkaWZmaWN1bHQgdG8KICB3b3JrIGFyb3VuZC4KCi0gVGhlIG9zIG1vZHVsZSBub3cgZXhwb3J0cyBhbGwgdGhlIHN5bWJvbGljIGNvbnN0YW50cyB1c2FibGUgd2l0aCB0aGUKICBsb3ctbGV2ZWwgb3Mub3BlbigpIG9uIFdpbmRvd3M6ICB0aGUgbmV3IGNvbnN0YW50cyBpbiAyLjMgYXJlCiAgT19OT0lOSEVSSVQsIE9fU0hPUlRfTElWRUQsIE9fVEVNUE9SQVJZLCBPX1JBTkRPTSBhbmQgT19TRVFVRU5USUFMLgogIFRoZSBvdGhlcnMgd2VyZSBhbHNvIGF2YWlsYWJsZSBpbiAyLjI6ICBPX0FQUEVORCwgT19CSU5BUlksIE9fQ1JFQVQsCiAgT19FWENMLCBPX1JET05MWSwgT19SRFdSLCBPX1RFWFQsIE9fVFJVTkMgYW5kIE9fV1JPTkxZLiAgQ29udHJhcnkKICB0byBNaWNyb3NvZnQgZG9jcywgT19TSE9SVF9MSVZFRCBkb2VzIG5vdCBzZWVtIHRvIGltcGx5IE9fVEVNUE9SQVJZCiAgKHNvIHNwZWNpZnkgYm90aCBpZiB5b3Ugd2FudCBib3RoOyBub3RlIHRoYXQgbmVpdGhlciBpcyB1c2VmdWwgdW5sZXNzCiAgc3BlY2lmaWVkIHdpdGggT19DUkVBVCB0b28pLgoKTWFjCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yIGZpbmFsPwpSZWxlYXNlIGRhdGU6IDIxLURlYy0yMDAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCgotIHBpY2tsZS5weSwgY1BpY2tsZTogYWxsb3cgcGlja2xpbmcgaW5zdGFuY2VzIG9mIG5ldy1zdHlsZSBjbGFzc2VzCiAgd2l0aCBhIGN1c3RvbSBtZXRhY2xhc3MuCgpDb3JlIGFuZCBidWlsdGlucwoKLSB3ZWFrcmVmIHByb3h5IG9iamVjdDogd2hlbiBjb21wYXJpbmcsIHVud3JhcCBib3RoIGFyZ3VtZW50cyBpZiBib3RoCiAgYXJlIHByb3hpZXMuCgpFeHRlbnNpb24gbW9kdWxlcwoKLSBiaW5hc2NpaS5iMmFfYmFzZTY0KCk6IGZpeCBhIHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1biB3aGVuIGVuY29kaW5nCiAgdmVyeSBzaG9ydCBzdHJpbmdzLgoKLSBjUGlja2xlOiB0aGUgb2JzY3VyZSAiZmFzdCIgbW9kZSB3YXMgc3VzcGVjdGVkIG9mIGNhdXNpbmcgc3RhY2sKICBvdmVyZmxvd3Mgb24gdGhlIE1hYy4gIEhvcGVmdWxseSBmaXhlZCB0aGlzIGJ5IHNldHRpbmcgdGhlIHJlY3Vyc2lvbgogIGxpbWl0IG11Y2ggc21hbGxlci4gIElmIHRoZSBsaW1pdCBpcyB0b28gbG93IChpdCBvbmx5IGFmZmVjdHMKICBwZXJmb3JtYW5jZSksIHlvdSBjYW4gY2hhbmdlIGl0IGJ5IGRlZmluaW5nIFBZX0NQSUNLTEVfRkFTVF9MSU1JVAogIHdoZW4gY29tcGlsaW5nIGNQaWNrbGUuYyAob3IgaW4gcHljb25maWcuaCkuCgpMaWJyYXJ5CgotIGR1bWJkYm0ucHk6IGZpeGVkIGEgZHVtYiBvbGQgYnVnICh0aGUgZmlsZSBkaWRuJ3QgZ2V0IHN5bmNoZWQgYXQKICBjbG9zZSBvciBkZWxldGUgdGltZSkuCgotIHJmYzgyMi5weTogZml4ZWQgYSBidWcgd2hlcmUgdGhlIGFkZHJlc3MgJzw+JyB3YXMgY29udmVydGVkIHRvIE5vbmUKICBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZyAoYWxzbyBmaXhlcyB0aGUgZW1haWwuVXRpbHMgbW9kdWxlKS4KCi0geG1scnBjbGliLnB5OiB2ZXJzaW9uIDEuMC4wOyB1c2VzIHByZWNpc2lvbiBmb3IgZG91Ymxlcy4KCi0gdGVzdCBzdWl0ZTogdGhlIHBpY2tsZSBhbmQgY1BpY2tsZSB0ZXN0cyB3ZXJlIG5vdCBleGVjdXRpbmcgYW55IGNvZGUKICB3aGVuIHJ1biBmcm9tIHRoZSBzdGFuZGFyZCByZWdyZXNzaW9uIHRlc3QuCgpUb29scy9EZW1vcwoKQnVpbGQKCkMgQVBJCgpOZXcgcGxhdGZvcm1zCgpUZXN0cwoKV2luZG93cwoKLSBkaXN0dXRpbHMgcGFja2FnZTogZml4ZWQgYnJva2VuIFdpbmRvd3MgaW5zdGFsbGVycyAoYmRpc3Rfd2luaW5zdCkuCgotIHRlbXBmaWxlLnB5OiBwcmV2ZW50IG15c3RlcmlvdXMgd2FybmluZ3Mgd2hlbiBUZW1wb3JhcnlGaWxlV3JhcHBlcgogIGluc3RhbmNlcyBhcmUgZGVsZXRlZCBhdCBwcm9jZXNzIGV4aXQgdGltZS4KCi0gc29ja2V0LnB5OiBwcmV2ZW50IG15c3RlcmlvdXMgd2FybmluZ3Mgd2hlbiBzb2NrZXQgaW5zdGFuY2VzIGFyZQogIGRlbGV0ZWQgYXQgcHJvY2VzcyBleGl0IHRpbWUuCgotIHBvc2l4bW9kdWxlLmM6IGZpeCBhIFdpbmRvd3MgY3Jhc2ggd2l0aCBzdGF0KCkgb2YgYSBmaWxlbmFtZSBlbmRpbmcKICBpbiBiYWNrc2xhc2guCgpNYWMKCi0gVGhlIENhcmJvbiB0b29sYm94IG1vZHVsZXMgaGF2ZSBiZWVuIHVwZ3JhZGVkIHRvIFVuaXZlcnNhbCBIZWFkZXJzCiAgMy40LCBhbmQgZXhwZXJpbWVudGFsIENvcmVHcmFwaGljcyBhbmQgQ2FyYm9uRXZlbnRzIG1vZHVsZXMgaGF2ZQogIGJlZW4gYWRkZWQuICBBbGwgb25seSBmb3IgZnJhbWV3b3JrLWVuYWJsZWQgTWFjT1NYLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmMxPwpSZWxlYXNlIGRhdGU6IDE0LURlYy0yMDAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVHlwZS9jbGFzcyB1bmlmaWNhdGlvbiBhbmQgbmV3LXN0eWxlIGNsYXNzZXMKCi0gR3VpZG8ncyB0dXRvcmlhbCBpbnRyb2R1Y3Rpb24gdG8gdGhlIG5ldyB0eXBlL2NsYXNzIGZlYXR1cmVzIGhhcwogIGJlZW4gZXh0ZW5zaXZlbHkgdXBkYXRlZC4gIFNlZQoKICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnLzIuMi9kZXNjcmludHJvLmh0bWwKCiAgVGhhdCByZW1haW5zIHRoZSBwcmltYXJ5IGRvY3VtZW50YXRpb24gaW4gdGhpcyBhcmVhLgoKLSBGaXhlZCBhIGxlYWs6IGluc3RhbmNlIHZhcmlhYmxlcyBkZWNsYXJlZCB3aXRoIF9fc2xvdHNfXyB3ZXJlIG5ldmVyCiAgZGVsZXRlZCEKCi0gVGhlICJkZWxldGUgYXR0cmlidXRlIiBtZXRob2Qgb2YgZGVzY3JpcHRvciBvYmplY3RzIGlzIGNhbGxlZAogIF9fZGVsZXRlX18sIG5vdCBfX2RlbF9fLiAgSW4gcHJldmlvdXMgcmVsZWFzZXMsIGl0IHdhcyBtaXN0YWtlbmx5CiAgY2FsbGVkIF9fZGVsX18sIHdoaWNoIGNyZWF0ZWQgYW4gdW5mb3J0dW5hdGUgb3ZlcmxvYWRpbmcgY29uZGl0aW9uCiAgd2l0aCBmaW5hbGl6ZXJzLiAgKFRoZSAiZ2V0IGF0dHJpYnV0ZSIgYW5kICJzZXQgYXR0cmlidXRlIiBtZXRob2RzCiAgYXJlIHN0aWxsIGNhbGxlZCBfX2dldF9fIGFuZCBfX3NldF9fLCByZXNwZWN0aXZlbHkuKQoKLSBTb21lIHN1YnRsZSBpc3N1ZXMgd2l0aCB0aGUgc3VwZXIgYnVpbHQtaW4gd2VyZSBmaXhlZDoKCiAgKGEpIFdoZW4gc3VwZXIgaXRzZWxmIGlzIHN1YmNsYXNzZWQsIGl0cyBfX2dldF9fIG1ldGhvZCB3b3VsZCBzdGlsbAogICAgICByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGJhc2UgY2xhc3MgKGkuZS4sIG9mIHN1cGVyKS4KCiAgKGIpIHN1cGVyKEMsIEMoKSkuX19jbGFzc19fIHdvdWxkIHJldHVybiBDIHJhdGhlciB0aGFuIHN1cGVyLiAgVGhpcwogICAgICBpcyBjb25mdXNpbmcuICBUbyBmaXggdGhpcywgSSBkZWNpZGVkIHRvIGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mCiAgICAgIHN1cGVyIHNvIHRoYXQgaXQgb25seSBhcHBsaWVzIHRvIGNvZGUgYXR0cmlidXRlcywgbm90IHRvIGRhdGEKICAgICAgYXR0cmlidXRlcy4gIEFmdGVyIGFsbCwgb3ZlcnJpZGluZyBkYXRhIGF0dHJpYnV0ZXMgaXMgbm90CiAgICAgIHN1cHBvcnRlZCBhbnl3YXkuCgogIChjKSBUaGUgX19nZXRfXyBtZXRob2QgZGlkbid0IGNoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IHdhcyBhbgogICAgICBpbnN0YW5jZSBvZiB0aGUgdHlwZSB1c2VkIGluIGNyZWF0aW9uIG9mIHRoZSBzdXBlciBpbnN0YW5jZS4KCi0gUHJldmlvdXNseSwgaGFzaCgpIG9mIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgYSBtdXRhYmxlIHR5cGUKICAobGlzdCBvciBkaWN0aW9uYXJ5KSB3b3VsZCByZXR1cm4gc29tZSB2YWx1ZSwgcmF0aGVyIHRoYW4gcmFpc2luZwogIFR5cGVFcnJvci4gIFRoaXMgaGFzIGJlZW4gZml4ZWQuICBBbHNvLCBkaXJlY3RseSBjYWxsaW5nCiAgZGljdC5fX2hhc2hfXyBhbmQgbGlzdC5fX2hhc2hfXyBub3cgcmFpc2VzIHRoZSBzYW1lIFR5cGVFcnJvcgogIChwcmV2aW91c2x5LCB0aGVzZSB3ZXJlIHRoZSBzYW1lIGFzIG9iamVjdC5fX2hhc2hfXykuCgotIE5ldy1zdHlsZSBvYmplY3RzIG5vdyBzdXBwb3J0IGRlbGV0aW5nIHRoZWlyIF9fZGljdF9fLiAgVGhpcyBpcyBmb3IKICBhbGwgaW50ZW50cyBhbmQgcHVycG9zZXMgZXF1aXZhbGVudCB0byBhc3NpZ25pbmcgYSBicmFuZCBuZXcgZW1wdHkKICBkaWN0aW9uYXJ5LCBidXQgc2F2ZXMgc3BhY2UgaWYgdGhlIG9iamVjdCBpcyBub3QgdXNlZCBmdXJ0aGVyLgoKQ29yZSBhbmQgYnVpbHRpbnMKCi0gLVFuZXcgbm93IHdvcmtzIGFzIGRvY3VtZW50ZWQgaW4gUEVQIDIzODogIHdoZW4gLVFuZXcgaXMgcGFzc2VkIG9uCiAgdGhlIGNvbW1hbmQgbGluZSwgYWxsIG9jY3VycmVuY2VzIG9mICIvIiB1c2UgdHJ1ZSBkaXZpc2lvbiBpbnN0ZWFkCiAgb2YgY2xhc3NpYyBkaXZpc2lvbi4gIFNlZSB0aGUgUEVQIGZvciBkZXRhaWxzLiAgTm90ZSB0aGF0ICJhbGwiCiAgbWVhbnMgYWxsIGluc3RhbmNlcyBpbiBsaWJyYXJ5IGFuZCAzcmQtcGFydHkgbW9kdWxlcywgYXMgd2VsbCBhcyBpbgogIHlvdXIgb3duIGNvZGUuICBBcyB0aGUgUEVQIHNheXMsIC1RbmV3IGlzIGludGVuZGVkIGZvciB1c2Ugb25seSBpbgogIGVkdWNhdGlvbmFsIGVudmlyb25tZW50cyB3aXRoIGNvbnRyb2wgb3ZlciB0aGUgbGlicmFyaWVzIGluIHVzZS4KICBOb3RlIHRoYXQgdGVzdF9jb2VyY2lvbi5weSBpbiB0aGUgc3RhbmRhcmQgUHl0aG9uIHRlc3Qgc3VpdGUgZmFpbHMKICB1bmRlciAtUW5ldzsgdGhpcyBpcyBleHBlY3RlZCwgYW5kIHdvbid0IGJlIHJlcGFpcmVkIHVudGlsIHRydWUKICBkaXZpc2lvbiBiZWNvbWVzIHRoZSBkZWZhdWx0IChpbiB0aGUgbWVhbnRpbWUsIHRlc3RfY29lcmNpb24gaXMKICB0ZXN0aW5nIHRoZSBjdXJyZW50IHJ1bGVzKS4KCi0gY29tcGxleCgpIG5vdyBvbmx5IGFsbG93cyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYmUgYSBzdHJpbmcKICBhcmd1bWVudCwgYW5kIHJhaXNlcyBUeXBlRXJyb3IgaWYgZWl0aGVyIHRoZSBzZWNvbmQgYXJnIGlzIGEgc3RyaW5nCiAgb3IgaWYgdGhlIHNlY29uZCBhcmcgaXMgc3BlY2lmaWVkIHdoZW4gdGhlIGZpcnN0IGlzIGEgc3RyaW5nLgoKRXh0ZW5zaW9uIG1vZHVsZXMKCi0gZ2MuZ2V0X3JlZmVyZW50cyB3YXMgcmVuYW1lZCB0byBnYy5nZXRfcmVmZXJyZXJzLgoKTGlicmFyeQoKLSBGdW5jdGlvbnMgaW4gdGhlIG9zLnNwYXduKCkgZmFtaWx5IG5vdyByZWxlYXNlIHRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIKICBsb2NrIGFyb3VuZCBjYWxsaW5nIHRoZSBwbGF0Zm9ybSBzcGF3bi4gIFRoZXkgc2hvdWxkIGFsd2F5cyBoYXZlIGRvbmUKICB0aGlzLCBidXQgZGlkIG5vdCBiZWZvcmUgMi4yYzEuICBNdWx0aXRocmVhZGVkIHByb2dyYW1zIGNhbGxpbmcKICBhbiBvcy5zcGF3biBmdW5jdGlvbiB3aXRoIFBfV0FJVCB3aWxsIG5vIGxvbmdlciBibG9jayBhbGwgUHl0aG9uIHRocmVhZHMKICB1bnRpbCB0aGUgc3Bhd25lZCBwcm9ncmFtIGNvbXBsZXRlcy4gIEl0J3MgcG9zc2libGUgdGhhdCBzb21lIHByb2dyYW1zCiAgcmVsaWVzIG9uIGJsb2NraW5nLCBhbHRob3VnaCBtb3JlIGxpa2VseSBieSBhY2NpZGVudCB0aGFuIGJ5IGRlc2lnbi4KCi0gd2ViYnJvd3NlciBkZWZhdWx0cyB0byBuZXRzY2FwZS5leGUgb24gT1MvMiBub3cuCgotIFRpeC5SZXNpemVIYW5kbGUgZXhwb3NlcyBkZXRhY2hfd2lkZ2V0LCBoaWRlLCBhbmQgc2hvdy4KCi0gVGhlIGNoYXJzZXQgYWxpYXMgd2luZG93c18xMjUyIGhhcyBiZWVuIGFkZGVkLgoKLSB0eXBlcy5TdHJpbmdUeXBlcyBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGRlZmluZWQgc3RyaW5nIHR5cGVzOwogIHVzdWFsbHkgdGhpcyB3aWxsIGJlIChzdHIsIHVuaWNvZGUpLCBidXQgaWYgUHl0aG9uIHdhcyBjb21waWxlZAogIHdpdGhvdXQgVW5pY29kZSBzdXBwb3J0IGl0IHdpbGwgYmUganVzdCAoc3RyLCkuCgotIFRoZSBwdWxsZG9tIGFuZCBtaW5pZG9tIG1vZHVsZXMgd2VyZSBzeW5jaHJvbml6ZWQgdG8gUHlYTUwuCgpUb29scy9EZW1vcwoKLSBBIG5ldyBzY3JpcHQgY2FsbGVkIFRvb2xzL3NjcmlwdHMvZ29vZ2xlLnB5IHdhcyBhZGRlZCwgd2hpY2ggZmlyZXMKICBvZmYgYSBzZWFyY2ggb24gR29vZ2xlLgoKQnVpbGQKCi0gTm90ZSB0aGF0IHJlbGVhc2UgYnVpbGRzIG9mIFB5dGhvbiBzaG91bGQgYXJyYW5nZSB0byBkZWZpbmUgdGhlCiAgcHJlcHJvY2Vzc29yIHN5bWJvbCBOREVCVUcgb24gdGhlIGNvbW1hbmQgbGluZSAob3IgZXF1aXZhbGVudCkuCiAgSW4gdGhlIDIuMiBwcmUtcmVsZWFzZSBzZXJpZXMgd2UgdHJpZWQgdG8gZGVmaW5lIHRoaXMgYnkgbWFnaWMgaW4KICBQeXRob24uaCBpbnN0ZWFkLCBidXQgaXQgcHJvdmVkIHRvIGNhdXNlIHByb2JsZW1zIGZvciBleHRlbnNpb24KICBhdXRob3JzLiAgVGhlIFVuaXgsIFdpbmRvd3MgYW5kIE1hYyBidWlsZHMgbm93IGFsbCBkZWZpbmUgTkRFQlVHIGluCiAgcmVsZWFzZSBidWlsZHMgdmlhIGNtZGxpbmUgKG9yIGVxdWl2YWxlbnQpIGluc3RlYWQuICBQb3J0cyB0bwogIG90aGVyIHBsYXRmb3JtcyBzaG91bGQgZG8gbGlrZXdpc2UuCgotIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gdXNlIC0td2l0aC1zdWZmaXggd2hlbiBidWlsZGluZyBvbiBhCiAgY2FzZS1pbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbSAoc3VjaCBhcyBNYWMgT1MgWCBIRlMrKS4gSW4gdGhlIGJ1aWxkCiAgZGlyZWN0b3J5IGFuIGV4dGVuc2lvbiBpcyB1c2VkLCBidXQgbm90IGluIHRoZSBpbnN0YWxsZWQgcHl0aG9uLgoKQyBBUEkKCi0gTmV3IGZ1bmN0aW9uIFB5RGljdF9NZXJnZUZyb21TZXEyKCkgZXhwb3NlcyB0aGUgYnVpbHRpbiBkaWN0CiAgY29uc3RydWN0b3IncyBsb2dpYyBmb3IgdXBkYXRpbmcgYSBkaWN0aW9uYXJ5IGZyb20gYW4gaXRlcmFibGUgb2JqZWN0CiAgcHJvZHVjaW5nIGtleS12YWx1ZSBwYWlycy4KCi0gUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKCkgcmVxdWlyZXMgdGhhdCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KICB0aGUga2V5d29yZCBsaXN0IGVxdWFsIHRoZSBudW1iZXIgb2YgYXJndW1lbnQgc3BlY2lmaWVycy4gIFRoaXMKICB3YXNuJ3QgY2hlY2tlZCBjb3JyZWN0bHksIGFuZCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMgY291bGQgZXZlbgogIGR1bXAgY29yZSBpbiBzb21lIGJhZCBjYXNlcy4gIFRoaXMgaGFzIGJlZW4gcmVwYWlyZWQuICBBcyBhIHJlc3VsdCwKICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMgbWF5IHJhaXNlIFJ1bnRpbWVFcnJvciBpbiBiYWQgY2FzZXMgdGhhdAogIHByZXZpb3VzbHkgd2VudCB1bmNoYWxsZW5nZWQuCgpOZXcgcGxhdGZvcm1zCgpUZXN0cwoKV2luZG93cwoKTWFjCgotIEluIHVuaXgtUHl0aG9uIG9uIE1hYyBPUyBYIChhbmQgZGFyd2luKSBzeXMucGxhdGZvcm0gaXMgbm93ICJkYXJ3aW4iLAogIHdpdGhvdXQgYW55IHRyYWlsaW5nIGRpZ2l0cy4KCi0gQ2hhbmdlZCBsb2dpYyBmb3IgZmluZGluZyBweXRob24gaG9tZSBpbiBNYWMgT1MgWCBmcmFtZXdvcmsgUHl0aG9ucy4KICBOb3cgc3lzLmV4ZWN1dGFibGUgcG9pbnRzIHRvIHRoZSBleGVjdXRhYmxlIGFnYWluLCBpbiBzdGVhZCBvZiB0bwogIHRoZSBzaGFyZWQgbGlicmFyeS4gVGhlIGxhdHRlciBpcyB1c2VkIG9ubHkgZm9yIGxvY2F0aW5nIHRoZSBweXRob24KICBob21lLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmIyPwpSZWxlYXNlIGRhdGU6IDE2LU5vdi0yMDAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVHlwZS9jbGFzcyB1bmlmaWNhdGlvbiBhbmQgbmV3LXN0eWxlIGNsYXNzZXMKCi0gTXVsdGlwbGUgaW5oZXJpdGFuY2UgbWl4aW5nIG5ldy1zdHlsZSBhbmQgY2xhc3NpYyBjbGFzc2VzIGluIHRoZQogIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIGlzIG5vdyBhbGxvd2VkLCBzbyB0aGlzIHdvcmtzIG5vdzoKCiAgICAgIGNsYXNzIENsYXNzaWM6IHBhc3MKICAgICAgY2xhc3MgTWl4ZWQoQ2xhc3NpYywgb2JqZWN0KTogcGFzcwoKICBUaGUgTVJPIChtZXRob2QgcmVzb2x1dGlvbiBvcmRlcikgZm9yIGVhY2ggYmFzZSBjbGFzcyBpcyByZXNwZWN0ZWQKICBhY2NvcmRpbmcgdG8gaXRzIGtpbmQsIGJ1dCB0aGUgTVJPIGZvciB0aGUgZGVyaXZlZCBjbGFzcyBpcyBjb21wdXRlZAogIHVzaW5nIG5ldy1zdHlsZSBNUk8gcnVsZXMgaWYgYW55IGJhc2UgY2xhc3MgaXMgYSBuZXctc3R5bGUgY2xhc3MuCiAgVGhpcyBuZWVkcyB0byBiZSBkb2N1bWVudGVkLgoKLSBUaGUgbmV3IGJ1aWx0aW4gZGljdGlvbmFyeSgpIGNvbnN0cnVjdG9yLCBhbmQgZGljdGlvbmFyeSB0eXBlLCBoYXZlCiAgYmVlbiByZW5hbWVkIHRvIGRpY3QuICBUaGlzIHJlZmxlY3RzIGEgZGVjYWRlIG9mIGNvbW1vbiB1c2FnZS4KCi0gZGljdCgpIG5vdyBhY2NlcHRzIGFuIGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgMi1zZXF1ZW5jZXMuICBGb3IKICBleGFtcGxlLCBkaWN0KGQuaXRlbXMoKSkgPT0gZCBmb3IgYW55IGRpY3Rpb25hcnkgZC4gIFRoZSBhcmd1bWVudCwKICBhbmQgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcmd1bWVudCwgY2FuIGJlIGFueSBpdGVyYWJsZSBvYmplY3RzLgoKLSBOZXctc3R5bGUgY2xhc3NlcyBjYW4gbm93IGhhdmUgYSBfX2RlbF9fIG1ldGhvZCwgd2hpY2ggaXMgY2FsbGVkCiAgd2hlbiB0aGUgaW5zdGFuY2UgaXMgZGVsZXRlZCAoanVzdCBsaWtlIGZvciBjbGFzc2ljIGNsYXNzZXMpLgoKLSBBc3NpZ25tZW50IHRvIG9iamVjdC5fX2RpY3RfXyBpcyBub3cgcG9zc2libGUsIGZvciBvYmplY3RzIHRoYXQgYXJlCiAgaW5zdGFuY2VzIG9mIG5ldy1zdHlsZSBjbGFzc2VzIHRoYXQgaGF2ZSBhIF9fZGljdF9fICh1bmxlc3MgdGhlIGJhc2UKICBjbGFzcyBmb3JiaWRzIGl0KS4KCi0gTWV0aG9kcyBvZiBidWlsdC1pbiB0eXBlcyBub3cgcHJvcGVybHkgY2hlY2sgZm9yIGtleXdvcmQgYXJndW1lbnRzCiAgKGZvcm1lcmx5IHRoZXNlIHdlcmUgc2lsZW50bHkgaWdub3JlZCkuICBUaGUgb25seSBidWlsdC1pbiBtZXRob2RzCiAgdGhhdCB0YWtlIGtleXdvcmQgYXJndW1lbnRzIGFyZSBfX2NhbGxfXywgX19pbml0X18gYW5kIF9fbmV3X18uCgotIFRoZSBzb2NrZXQgZnVuY3Rpb24gaGFzIGJlZW4gY29udmVydGVkIHRvIGEgdHlwZTsgc2VlIGJlbG93LgoKQ29yZSBhbmQgYnVpbHRpbnMKCi0gQXNzaWdubWVudCB0byBfX2RlYnVnX18gcmFpc2VzIFN5bnRheEVycm9yIGF0IGNvbXBpbGUtdGltZS4gIFRoaXMKICB3YXMgcHJvbWlzZWQgd2hlbiAyLjFjMSB3YXMgcmVsZWFzZWQgYXMgIldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMWMxIgogIChzZWUgYmVsb3cpIHNheXMuCgotIENsYXJpZmllZCB0aGUgZXJyb3IgbWVzc2FnZXMgZm9yIHVuc3VwcG9ydGVkIG9wZXJhbmRzIHRvIGFuIG9wZXJhdG9yCiAgKGxpa2UgMSArICcnKS4KCkV4dGVuc2lvbiBtb2R1bGVzCgotIG1tYXAgaGFzIGEgbmV3IGtleXdvcmQgYXJndW1lbnQsICJhY2Nlc3MiLCBhbGxvd2luZyBhIHVuaWZvcm0gd2F5IGZvcgogIGJvdGggV2luZG93cyBhbmQgVW5peCB1c2VycyB0byBjcmVhdGUgcmVhZC1vbmx5LCB3cml0ZS10aHJvdWdoIGFuZAogIGNvcHktb24td3JpdGUgbWVtb3J5IG1hcHBpbmdzLiAgVGhpcyB3YXMgcHJldmlvdXNseSBwb3NzaWJsZSBvbmx5IG9uCiAgVW5peC4gIEEgbmV3IGtleXdvcmQgYXJndW1lbnQgd2FzIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhpcyBpbiBhCiAgdW5pZm9ybSB3YXkgYmVjYXVzZSB0aGUgbW1hcCgpIHNpZ25hdHVyZXMgaGFkIGRpdmVyZ2VkIGFjcm9zcwogIHBsYXRmb3Jtcy4gIFRoYW5rcyB0byBKYXkgVCBNaWxsZXIgZm9yIHJlcGFpcmluZyB0aGlzIQoKLSBCeSBkZWZhdWx0LCB0aGUgZ2MuZ2FyYmFnZSBsaXN0IG5vdyBjb250YWlucyBvbmx5IHRob3NlIGluc3RhbmNlcyBpbgogIHVucmVhY2hhYmxlIGN5Y2xlcyB0aGF0IGhhdmUgX19kZWxfXyBtZXRob2RzOyBpbiAyLjEgaXQgY29udGFpbmVkIGFsbAogIGluc3RhbmNlcyBpbiB1bnJlYWNoYWJsZSBjeWNsZXMuICAiSW5zdGFuY2VzIiBoZXJlIGhhcyBiZWVuIGdlbmVyYWxpemVkCiAgdG8gaW5jbHVkZSBpbnN0YW5jZXMgb2YgYm90aCBuZXctc3R5bGUgYW5kIG9sZC1zdHlsZSBjbGFzc2VzLgoKLSBUaGUgc29ja2V0IG1vZHVsZSBkZWZpbmVzIGEgbmV3IG1ldGhvZCBmb3Igc29ja2V0IG9iamVjdHMsCiAgc2VuZGFsbCgpLiAgVGhpcyBpcyBsaWtlIHNlbmQoKSBidXQgbWF5IG1ha2UgbXVsdGlwbGUgY2FsbHMgdG8KICBzZW5kKCkgdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gc2VudC4gIEFsc28sIHRoZSBzb2NrZXQgZnVuY3Rpb24gaGFzCiAgYmVlbiBjb252ZXJ0ZWQgdG8gYSBzdWJjbGFzc2FibGUgdHlwZSwgbGlrZSBsaXN0IGFuZCB0dXBsZSAoZXRjLikKICBiZWZvcmUgaXQ7IHNvY2tldCBhbmQgU29ja2V0VHlwZSBhcmUgbm93IHRoZSBzYW1lIHRoaW5nLgoKLSBWYXJpb3VzIGJ1Z2ZpeGVzIHRvIHRoZSBjdXJzZXMgbW9kdWxlLiAgVGhlcmUgaXMgbm93IGEgdGVzdCBzdWl0ZQogIGZvciB0aGUgY3Vyc2VzIG1vZHVsZSAoeW91IGhhdmUgdG8gcnVuIGl0IG1hbnVhbGx5KS4KCi0gYmluYXNjaWkuYjJhX2Jhc2U2NCBubyBsb25nZXIgcGxhY2VzIGFuIGFyYml0cmFyeSByZXN0cmljdGlvbiBvZiA1NwogIGJ5dGVzIG9uIGl0cyBpbnB1dC4KCkxpYnJhcnkKCi0gdGtGaWxlRGlhbG9nIGV4cG9zZXMgYSBEaXJlY3RvcnkgY2xhc3MgYW5kIGFza2RpcmVjdG9yeQogIGNvbnZlbmllbmNlIGZ1bmN0aW9uLgoKLSBTeW1ib2xpYyBncm91cCBuYW1lcyBpbiByZWd1bGFyIGV4cHJlc3Npb25zIG11c3QgYmUgdW5pcXVlLiAgRm9yCiAgZXhhbXBsZSwgdGhlIHJlZ2V4cCByJyg/UDxhYmM+KSg/UDxhYmM+KScgaXMgbm90IGFsbG93ZWQsIGJlY2F1c2UgYQogIHNpbmdsZSBuYW1lIGNhbid0IG1lYW4gYm90aCAiZ3JvdXAgMSIgYW5kICJncm91cCAyIiBzaW11bHRhbmVvdXNseS4KICBQeXRob24gMi4yIGRldGVjdHMgdGhpcyBlcnJvciBhdCByZWdleHAgY29tcGlsYXRpb24gdGltZTsKICBwcmV2aW91c2x5LCB0aGUgZXJyb3Igd2VudCB1bmRldGVjdGVkLCBhbmQgcmVzdWx0cyB3ZXJlCiAgdW5wcmVkaWN0YWJsZS4gIEFsc28gaW4gc3JlLCB0aGUgcGF0dGVybi5zcGxpdCgpLCBwYXR0ZXJuLnN1YigpLCBhbmQKICBwYXR0ZXJuLnN1Ym4oKSBtZXRob2RzIGhhdmUgYmVlbiByZXdyaXR0ZW4gaW4gQy4gIEFsc28sIGFuCiAgZXhwZXJpbWVudGFsIGZ1bmN0aW9uL21ldGhvZCBmaW5kaXRlcigpIGhhcyBiZWVuIGFkZGVkLCB3aGljaCB3b3JrcwogIGxpa2UgZmluZGFsbCgpIGJ1dCByZXR1cm5zIGFuIGl0ZXJhdG9yLgoKLSBUaXggZXhwb3NlcyBtb3JlIGNvbW1hbmRzIHRocm91Z2ggdGhlIGNsYXNzZXMgRGlyU2VsZWN0Qm94LAogIERpclNlbGVjdERpYWxvZywgTGlzdE5vdGVCb29rLCBNZXRlciwgQ2hlY2tMaXN0LCBhbmQgdGhlCiAgbWV0aG9kcyB0aXhfYWRkYml0bWFwZGlyLCB0aXhfY2dldCwgdGl4X2NvbmZpZ3VyZSwgdGl4X2ZpbGVkaWFsb2csCiAgdGl4X2dldGJpdG1hcCwgdGl4X2dldGltYWdlLCB0aXhfb3B0aW9uX2dldCwgYW5kIHRpeF9yZXNldG9wdGlvbnMuCgotIFRyYWNlYmFjayBvYmplY3RzIGFyZSBub3cgc2Nhbm5lZCBieSBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0aW9uLCBzbwogIGN5Y2xlcyBjcmVhdGVkIGJ5IGNhc3VhbCB1c2Ugb2Ygc3lzLmV4Y19pbmZvKCkgbm8gbG9uZ2VyIGNhdXNlCiAgcGVybWFuZW50IG1lbW9yeSBsZWFrcyAocHJvdmlkZWQgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIGVuYWJsZWQpLgoKLSBvcy5leHRzZXAgLS0gYSBuZXcgdmFyaWFibGUgbmVlZGVkIGJ5IHRoZSBSSVNDT1Mgc3VwcG9ydC4gIEl0IGlzIHRoZQogIHNlcGFyYXRvciB1c2VkIGJ5IGV4dGVuc2lvbnMsIGFuZCBpcyAnLicgb24gYWxsIHBsYXRmb3JtcyBleGNlcHQKICBSSVNDT1MsIHdoZXJlIGl0IGlzICcvJy4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoaXMgdmFyaWFibGUKICB1bmxlc3MgeW91IGhhdmUgYSBtYXNvY2hpc3RpYyBkZXNpcmUgdG8gcG9ydCB5b3VyIGNvZGUgdG8gUklTQ09TLgoKLSBtaW1ldHlwZXMucHkgaGFzIG9wdGlvbmFsIHN1cHBvcnQgZm9yIG5vbi1zdGFuZGFyZCwgYnV0IGNvbW1vbmx5CiAgZm91bmQgdHlwZXMuICBndWVzc190eXBlKCkgYW5kIGd1ZXNzX2V4dGVuc2lvbigpIG5vdyBhY2NlcHQgYW4KICBvcHRpb25hbCBgc3RyaWN0JyBmbGFnLCBkZWZhdWx0aW5nIHRvIHRydWUsIHdoaWNoIGNvbnRyb2xzIHdoZXRoZXIKICByZWNvZ25pemUgbm9uLXN0YW5kYXJkIHR5cGVzIG9yIG5vdC4gIEEgZmV3IG5vbi1zdGFuZGFyZCB0eXBlcyB3ZQogIGtub3cgYWJvdXQgaGF2ZSBiZWVuIGFkZGVkLiAgQWxzbywgd2hlbiBydW4gYXMgYSBzY3JpcHQsIHRoZXJlIGFyZQogIG5ldyAtbCBhbmQgLWUgb3B0aW9ucy4KCi0gc3RhdGNhY2hlIGlzIG5vdyBkZXByZWNhdGVkLgoKLSBlbWFpbC5VdGlscy5mb3JtYXRkYXRlKCkgbm93IHByb2R1Y2VzIHRoZSBwcmVmZXJyZWQgUkZDIDI4MjIgc3R5bGUKICBkYXRlcyB3aXRoIG51bWVyaWMgdGltZXpvbmVzIChpdCB1c2VkIHRvIHByb2R1Y2Ugb2Jzb2xldGUgZGF0ZXMKICBoYXJkIGNvZGVkIHRvICJHTVQiIHRpbWV6b25lKS4gIEFuIG9wdGlvbmFsIGBsb2NhbHRpbWUnIGZsYWcgaXMKICBhZGRlZCB0byBwcm9kdWNlIGRhdGVzIGluIHRoZSBsb2NhbCB0aW1lem9uZSwgd2l0aCBkYXlsaWdodCBzYXZpbmdzCiAgdGltZSBwcm9wZXJseSB0YWtlbiBpbnRvIGFjY291bnQuCgotIEluIHBpY2tsZSBhbmQgY1BpY2tsZSwgaW5zdGVhZCBvZiBtYXNraW5nIGVycm9ycyBpbiBsb2FkKCkgYnkKICB0cmFuc2Zvcm1pbmcgdGhlbSBpbnRvIFN5c3RlbUVycm9yLCB3ZSBsZXQgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbgogIHByb3BhZ2F0ZSBvdXQuICBBbHNvLCBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgX19zYWZlX2Zvcl91bnBpY2tsaW5nX18KICBpbiBwaWNrbGUsIGFzIGl0IGFscmVhZHkgd2FzIHN1cHBvcnRlZCBpbiBjUGlja2xlLgoKVG9vbHMvRGVtb3MKCkJ1aWxkCgotIFRoZSBkYm0gbW9kdWxlIGlzIGJ1aWx0IHVzaW5nIGxpYmRiMSBpZiBhdmFpbGFibGUuICBUaGUgYnNkZGIgbW9kdWxlCiAgaXMgYnVpbHQgd2l0aCBsaWJkYjMgaWYgYXZhaWxhYmxlLgoKLSBNaXNjL01ha2VmaWxlLnByZS5pbiBoYXMgYmVlbiByZW1vdmVkIGJ5IEJERkwgcHJvbm91bmNlbWVudC4KCkMgQVBJCgotIE5ldyBmdW5jdGlvbiBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoKSByZXR1cm5zIHRoZSBzaXplIG9mIGEgbm9uLQogIE5VTEwgcmVzdWx0IGZyb20gUHlTZXF1ZW5jZV9GYXN0KCksIG1vcmUgcXVpY2tseSB0aGFuIGNhbGxpbmcKICBQeVNlcXVlbmNlX1NpemUoKS4KCi0gTmV3IGFyZ3VtZW50IHVucGFja2luZyBmdW5jdGlvbiBQeUFyZ19VbnBhY2tUdXBsZSgpIGFkZGVkLgoKLSBOZXcgZnVuY3Rpb25zIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKSBhbmQKICBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncygpIGhhdmUgYmVlbiBhZGRlZCB0byBtYWtlIGl0IG1vcmUKICBjb252ZW5pZW50IGFuZCBlZmZpY2llbnQgdG8gY2FsbCBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgZnJvbSBDLgoKLSBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKSBubyBsb25nZXIgbWFza3MgZXJyb3JzLCBzbyBpdCdzCiAgcG9zc2libGUgdGhhdCB0aGlzIHdpbGwgcHJvcGFnYXRlIGVycm9ycyBpdCBkaWRuJ3QgYmVmb3JlLgoKLSBOZXcgZnVuY3Rpb24gUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyKCksIHdoaWNoIHJldHVybnMgdHJ1ZSBpZiBpdHMKICBhcmd1bWVudCBzdXBwb3J0cyB0aGUgc2luZ2xlLXNlZ21lbnQgcmVhZGFibGUgYnVmZmVyIGludGVyZmFjZS4KCk5ldyBwbGF0Zm9ybXMKCi0gV2UndmUgZmluYWxseSBjb25maXJtZWQgdGhhdCB0aGlzIHJlbGVhc2UgYnVpbGRzIG9uIEhQLVVYIDExLjAwLAogICp3aXRoKiB0aHJlYWRzLCBhbmQgcGFzc2VzIHRoZSB0ZXN0IHN1aXRlLgoKLSBUaGFua3MgdG8gYSBzZXJpZXMgb2YgcGF0Y2hlcyBmcm9tIE1pY2hhZWwgTXVsbGVyLCBQeXRob24gbWF5IGJ1aWxkCiAgYWdhaW4gdW5kZXIgT1MvMiBWaXN1YWwgQWdlIEMrKy4KCi0gVXBkYXRlZCBSSVNDT1MgcG9ydCBieSBEaWV0bWFyIFNjaHdlcnRiZXJnZXIuCgpUZXN0cwoKLSBBZGRlZCBhIHRlc3Qgc2NyaXB0IGZvciB0aGUgY3Vyc2VzIG1vZHVsZS4gIEl0IGlzbid0IHJ1biBhdXRvbWF0aWNhbGx5OwogIHJlZ3J0ZXN0LnB5IG11c3QgYmUgcnVuIHdpdGggJy11IGN1cnNlcycgdG8gZW5hYmxlIGl0LgoKV2luZG93cwoKTWFjCgotIFB5dGhvblNjcmlwdCBoYXMgYmVlbiBtb3ZlZCB0byB1bnN1cHBvcnRlZCBhbmQgaXMgc2xhdGVkIHRvIGJlCiAgcmVtb3ZlZCBjb21wbGV0ZWx5IGluIHRoZSBuZXh0IHJlbGVhc2UuCgotIEl0IHNob3VsZCBub3cgYmUgcG9zc2libGUgdG8gYnVpbGQgYXBwbGV0cyB0aGF0IHdvcmsgb24gYm90aCBPUzkgYW5kCiAgT1NYLgoKLSBUaGUgY29yZSBpcyBub3cgbGlua2VkIHdpdGggQ29yZVNlcnZpY2VzIG5vdCBDYXJib247IGFzIGEgc2lkZQogIHJlc3VsdCwgZGVmYXVsdCA4Yml0IGVuY29kaW5nIG9uIE9TWCBpcyBub3cgQVNDSUkuCgotIFB5dGhvbiBzaG91bGQgbm93IGJ1aWxkIG9uIE9TWCAxMC4xLjEKCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJiMT8KUmVsZWFzZSBkYXRlOiAxOS1PY3QtMjAwMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KClR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCgotIE5ldy1zdHlsZSBjbGFzc2VzIGFyZSBub3cgYWx3YXlzIGR5bmFtaWMgKGV4Y2VwdCBmb3IgYnVpbHQtaW4gYW5kCiAgZXh0ZW5zaW9uIHR5cGVzKS4gIFRoZXJlIGlzIG5vIGxvbmdlciBhIHBlcmZvcm1hbmNlIHBlbmFsdHksIGFuZCBJCiAgbm8gbG9uZ2VyIHNlZSBhbm90aGVyIHJlYXNvbiB0byBrZWVwIHRoaXMgYmFnZ2FnZSBhcm91bmQuICBPbmUgcmVsaWMKICByZW1haW5zOiB0aGUgX19kaWN0X18gb2YgYSBuZXctc3R5bGUgY2xhc3MgaXMgYSByZWFkLW9ubHkgcHJveHk7IHlvdQogIG11c3Qgc2V0IHRoZSBjbGFzcydzIGF0dHJpYnV0ZSB0byBtb2RpZnkgaXQuICBBcyBhIGNvbnNlcXVlbmNlLCB0aGUKICBfX2RlZmluZWRfXyBhdHRyaWJ1dGUgb2YgbmV3LXN0eWxlIHR5cGVzIG5vIGxvbmdlciBleGlzdHMsIGZvciBsYWNrCiAgb2YgbmVlZDogdGhlcmUgaXMgb25jZSBhZ2FpbiBvbmx5IG9uZSBfX2RpY3RfXyAoYWx0aG91Z2ggaW4gdGhlCiAgZnV0dXJlIGEgX19jYWNoZV9fIG1heSBiZSByZXN1cnJlY3RlZCB3aXRoIGEgc2ltaWxhciBmdW5jdGlvbiwgaWYgSQogIGNhbiBwcm92ZSB0aGF0IGl0IGFjdHVhbGx5IHNwZWVkcyB0aGluZ3MgdXApLgoKLSBDLl9fZG9jX18gbm93IHdvcmtzIGFzIGV4cGVjdGVkIGZvciBuZXctc3R5bGUgY2xhc3NlcyAoaW4gMi4yYTQgaXQKICBhbHdheXMgcmV0dXJuZWQgTm9uZSwgZXZlbiB3aGVuIHRoZXJlIHdhcyBhIGNsYXNzIGRvY3N0cmluZykuCgotIGRvY3Rlc3Qgbm93IGZpbmRzIGFuZCBydW5zIGRvY3N0cmluZ3MgYXR0YWNoZWQgdG8gbmV3LXN0eWxlIGNsYXNzZXMsCiAgY2xhc3MgbWV0aG9kcywgc3RhdGljIG1ldGhvZHMsIGFuZCBwcm9wZXJ0aWVzLgoKQ29yZSBhbmQgYnVpbHRpbnMKCi0gQSB2ZXJ5IHN1YnRsZSBzeW50YWN0aWNhbCBwaXRmYWxsIGluIGxpc3QgY29tcHJlaGVuc2lvbnMgd2FzIGZpeGVkLgogIEZvciBleGFtcGxlOiBbYStiIGZvciBhIGluICdhYmMnLCBmb3IgYiBpbiAnZGVmJ10uICBUaGUgY29tbWEgaW4KICB0aGlzIGV4YW1wbGUgaXMgYSBtaXN0YWtlLiAgUHJldmlvdXNseSwgdGhpcyB3b3VsZCBzaWxlbnRseSBsZXQgJ2EnCiAgaXRlcmF0ZSBvdmVyIHRoZSBzaW5nbGV0b24gdHVwbGUgKCdhYmMnLCksIHlpZWxkaW5nIFsnYWJjZCcsICdhYmNlJywKICAnYWJjZiddIHJhdGhlciB0aGFuIHRoZSBpbnRlbmRlZCBbJ2FkJywgJ2FlJywgJ2FmJywgJ2JkJywgJ2JlJywKICAnYmYnLCAnY2QnLCAnY2UnLCAnY2YnXS4gIE5vdywgdGhpcyBpcyBmbGFnZ2VkIGFzIGEgc3ludGF4IGVycm9yLgogIE5vdGUgdGhhdCBbYSBmb3IgYSBpbiA8c2luZ2xldG9uPl0gaXMgYSBjb252b2x1dGVkIHdheSB0byBzYXkKICBbPHNpbmdsZXRvbj5dIGFueXdheSwgc28gaXQncyBub3QgbGlrZSBhbnkgZXhwcmVzc2l2ZW5lc3MgaXMgbG9zdC4KCi0gZ2V0YXR0cihvYmosIG5hbWUsIGRlZmF1bHQpIG5vdyBvbmx5IGNhdGNoZXMgQXR0cmlidXRlRXJyb3IsIGFzCiAgZG9jdW1lbnRlZCwgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhbGwKICBleGNlcHRpb25zICh3aGljaCBjb3VsZCBtYXNrIGJ1Z3MgaW4gYSBfX2dldGF0dHJfXyBob29rLCBmb3IKICBleGFtcGxlKS4KCi0gV2VhayByZWZlcmVuY2Ugb2JqZWN0cyBhcmUgbm93IHBhcnQgb2YgdGhlIGNvcmUgYW5kIG9mZmVyIGEgQyBBUEkuCiAgQSBidWcgd2hpY2ggY291bGQgYWxsb3cgYSBjb3JlIGR1bXAgd2hlbiBiaW5hcnkgb3BlcmF0aW9ucyBpbnZvbHZlZAogIHByb3h5IHJlZmVyZW5jZSBoYXMgYmVlbiBmaXhlZC4gIHdlYWtyZWYuUmVmZXJlbmNlRXJyb3IgaXMgbm93IGEKICBidWlsdC1pbiBleGNlcHRpb24uCgotIHVuaWNvZGUob2JqKSBub3cgYmVoYXZlcyBtb3JlIGxpa2Ugc3RyKG9iaiksIGFjY2VwdGluZyBhcmJpdHJhcnkKICBvYmplY3RzLCBhbmQgY2FsbGluZyBhIF9fdW5pY29kZV9fIG1ldGhvZCBpZiBpdCBleGlzdHMuCiAgdW5pY29kZShvYmosIGVuY29kaW5nKSBhbmQgdW5pY29kZShvYmosIGVuY29kaW5nLCBlcnJvcnMpIHN0aWxsCiAgcmVxdWlyZSBhbiA4LWJpdCBzdHJpbmcgb3IgY2hhcmFjdGVyIGJ1ZmZlciBhcmd1bWVudC4KCi0gaXNpbnN0YW5jZSgpIG5vdyBhbGxvd3MgYW55IG9iamVjdCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgYW5kIGEKICBjbGFzcywgYSB0eXBlIG9yIHNvbWV0aGluZyB3aXRoIGEgX19iYXNlc19fIHR1cGxlIGF0dHJpYnV0ZSBmb3IgdGhlCiAgc2Vjb25kIGFyZ3VtZW50LiAgVGhlIHNlY29uZCBhcmd1bWVudCBtYXkgYWxzbyBiZSBhIHR1cGxlIG9mIGEKICBjbGFzcywgdHlwZSwgb3Igc29tZXRoaW5nIHdpdGggX19iYXNlc19fLCBpbiB3aGljaCBjYXNlIGlzaW5zdGFuY2UoKQogIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGFueSBvZiB0aGUKICB0aGluZ3MgY29udGFpbmVkIGluIHRoZSBzZWNvbmQgYXJndW1lbnQgdHVwbGUuICBFLmcuCgogIGlzaW5zdGFuY2UoeCwgKEEsIEIpKQoKICByZXR1cm5zIHRydWUgaWYgeCBpcyBhbiBpbnN0YW5jZSBvZiBBIG9yIEIuCgpFeHRlbnNpb24gbW9kdWxlcwoKLSB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCgpIG5vdyByZXR1cm5zIHRoZSB0aHJlYWQgSUQgKHByZXZpb3VzbHkgTm9uZSkuCgotIGJpbmFzY2lpIGhhcyBub3cgdHdvIHF1b3ByaSBzdXBwb3J0IGZ1bmN0aW9ucywgYTJiX3FwIGFuZCBiMmFfcXAuCgotIHJlYWRsaW5lIG5vdyBzdXBwb3J0cyBzZXR0aW5nIHRoZSBzdGFydHVwX2hvb2sgYW5kIHRoZQogIHByZV9ldmVudF9ob29rLCBhbmQgYWRkcyB0aGUgYWRkX2hpc3RvcnkoKSBmdW5jdGlvbi4KCi0gb3MgYW5kIHBvc2l4IHN1cHBvcnRzIGNocm9vdCgpLCBzZXRncm91cHMoKSBhbmQgdW5zZXRlbnYoKSB3aGVyZQogIGF2YWlsYWJsZS4gIFRoZSBzdGF0KCksIGZzdGF0KCksIHN0YXR2ZnMoKSBhbmQgZnN0YXR2ZnMoKSBmdW5jdGlvbnMKICBub3cgcmV0dXJuICJwc2V1ZG8tc2VxdWVuY2VzIiAtLSB0aGUgdmFyaW91cyBmaWVsZHMgY2FuIG5vdyBiZQogIGFjY2Vzc2VkIGFzIGF0dHJpYnV0ZXMgKGUuZy4gb3Muc3RhdCgiLyIpLnN0X210aW1lKSBidXQgZm9yCiAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdGhleSBhbHNvIGJlaGF2ZSBhcyBhIGZpeGVkLWxlbmd0aCBzZXF1ZW5jZS4KICBTb21lIHBsYXRmb3JtLXNwZWNpZmljIGZpZWxkcyAoZS5nLiBzdF9yZGV2KSBhcmUgb25seSBhY2Nlc3NpYmxlIGFzCiAgYXR0cmlidXRlcy4KCi0gdGltZTogbG9jYWx0aW1lKCksIGdtdGltZSgpIGFuZCBzdHJwdGltZSgpIG5vdyByZXR1cm4gYQogIHBzZXVkby1zZXF1ZW5jZSBzaW1pbGFyIHRvIHRoZSBvcy5zdGF0KCkgcmV0dXJuIHZhbHVlLCB3aXRoCiAgYXR0cmlidXRlcyBsaWtlIHRtX3llYXIgZXRjLgoKLSBEZWNvbXByZXNzaW9uIG9iamVjdHMgaW4gdGhlIHpsaWIgbW9kdWxlIG5vdyBhY2NlcHQgYW4gb3B0aW9uYWwKICBzZWNvbmQgcGFyYW1ldGVyIHRvIGRlY29tcHJlc3MoKSB0aGF0IHNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQKICBvZiBtZW1vcnkgdG8gdXNlIGZvciB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCgotIG9wdGlvbmFsIFNTTCBzdXBwb3J0IGluIHRoZSBzb2NrZXQgbW9kdWxlIG5vdyBleHBvcnRzIE9wZW5TU0wKICBmdW5jdGlvbnMgUkFORF9hZGQoKSwgUkFORF9lZ2QoKSwgYW5kIFJBTkRfc3RhdHVzKCkuICBUaGVzZSBjYWxscwogIGFyZSB1c2VmdWwgb24gcGxhdGZvcm1zIGxpa2UgU29sYXJpcyB3aGVyZSBPcGVuU1NMIGRvZXMgbm90CiAgYXV0b21hdGljYWxseSBzZWVkIGl0cyBQUk5HLiAgQWxzbywgdGhlIGtleWZpbGUgYW5kIGNlcnRmaWxlCiAgYXJndW1lbnRzIHRvIHNvY2tldC5zc2woKSBhcmUgbm93IG9wdGlvbmFsLgoKLSBwb3NpeG1vZHVsZSAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlIG9zIG1vZHVsZSBvbiBQT1NJWCBwbGF0Zm9ybXMpIG5vdwogIGV4cG9ydHMgT19MQVJHRUZJTEUsIE9fRElSRUNULCBPX0RJUkVDVE9SWSwgYW5kIE9fTk9GT0xMT1cuCgpMaWJyYXJ5CgotIGRvY3Rlc3Qgbm93IGV4Y2x1ZGVzIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBub3QgZGVmaW5lZCBieSB0aGUgbW9kdWxlCiAgYmVpbmcgdGVzdGVkLCB0aGFua3MgdG8gVGltIEhvY2hiZXJnLgoKLSBIb3RTaG90LCBhIG5ldyBwcm9maWxlciBpbXBsZW1lbnRlZCB1c2luZyBhIEMtYmFzZWQgY2FsbGJhY2ssIGhhcwogIGJlZW4gYWRkZWQuICBUaGlzIHN1YnN0YW50aWFsbHkgcmVkdWNlcyB0aGUgb3ZlcmhlYWQgb2YgcHJvZmlsaW5nLAogIGJ1dCBpdCBpcyBzdGlsbCBxdWl0ZSBwcmVsaW1pbmFyeS4gIFN1cHBvcnQgbW9kdWxlcyBhbmQKICBkb2N1bWVudGF0aW9uIHdpbGwgYmUgYWRkZWQgaW4gdXBjb21pbmcgcmVsZWFzZXMgKGJlZm9yZSAyLjIgZmluYWwpLgoKLSBwcm9maWxlIG5vdyBwcm9kdWNlcyBjb3JyZWN0IG91dHB1dCBpbiBzaXR1YXRpb25zIHdoZXJlIGFuIGV4Y2VwdGlvbgogIHJhaXNlZCBpbiBQeXRob24gaXMgY2xlYXJlZCBieSBDIGNvZGUgKGUuZy4gaGFzYXR0cigpKS4gIFRoaXMgdXNlZAogIHRvIGNhdXNlIHdyb25nIG91dHB1dCwgaW5jbHVkaW5nIHNwdXJpb3VzIGNsYWltcyBvZiByZWN1cnNpdmUKICBmdW5jdGlvbnMgYW5kIGF0dHJpYnV0aW9uIG9mIHRpbWUgc3BlbnQgdG8gdGhlIHdyb25nIGZ1bmN0aW9uLgoKICBUaGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRlcml2ZWQgT2xkUHJvZmlsZSBhbmQgSG90UHJvZmlsZQogIHByb2ZpbGluZyBjbGFzc2VzIHdhcyByZW1vdmVkLiAgVGhlIGNvZGUgaGFzbid0IHdvcmtlZCBmb3IgeWVhcnMgKGlmCiAgeW91IHRyaWVkIHRvIHVzZSB0aGVtLCB0aGV5IHJhaXNlZCBleGNlcHRpb25zKS4gIE9sZFByb2ZpbGUKICBpbnRlbmRlZCB0byByZXByb2R1Y2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9maWxlciBQeXRob24gdXNlZCBtb3JlCiAgdGhhbiA3IHllYXJzIGFnbywgYW5kIGlzbid0IGludGVyZXN0aW5nIGFueW1vcmUuICBIb3RQcm9maWxlIGludGVuZGVkCiAgdG8gcHJvdmlkZSBhIGZhc3RlciBwcm9maWxlciAoYnV0IHByb2R1Y2luZyBsZXNzIGluZm9ybWF0aW9uKSwgYW5kCiAgdGhhdCdzIGEgd29ydGh5IGdvYWwgd2UgaW50ZW5kIHRvIG1lZXQgdmlhIGEgZGlmZmVyZW50IGFwcHJvYWNoIChidXQKICB3aXRob3V0IGxvc2luZyBpbmZvcm1hdGlvbikuCgotIFByb2ZpbGUuY2FsaWJyYXRlKCkgaGFzIGEgbmV3IGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkIGRlbGl2ZXIKICBhIG11Y2ggYmV0dGVyIHN5c3RlbS1zcGVjaWZpYyBjYWxpYnJhdGlvbiBjb25zdGFudC4gIFRoZSBjb25zdGFudCBjYW4KICBub3cgYmUgc3BlY2lmaWVkIGluIGFuIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBvciBhcyBhIFByb2ZpbGUgY2xhc3Mgb3IKICBpbnN0YW5jZSB2YXJpYWJsZSwgaW5zdGVhZCBvZiBieSBlZGl0aW5nIHByb2ZpbGUucHkncyBzb3VyY2UgY29kZS4KICBDYWxpYnJhdGlvbiBtdXN0IHN0aWxsIGJlIGRvbmUgbWFudWFsbHkgKHNlZSB0aGUgZG9jcyBmb3IgdGhlIHByb2ZpbGUKICBtb2R1bGUpLgoKICBOb3RlIHRoYXQgUHJvZmlsZS5jYWxpYnJhdGUoKSBtdXN0IGJlIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzLgogIEltcHJvdmluZyB0aGUgYWNjdXJhY3kgcmVxdWlyZWQgZXhwbG9pdGluZyBkZXRhaWxlZCBrbm93bGVkZ2Ugb2YKICBwcm9maWxlciBpbnRlcm5hbHM7IHRoZSBlYXJsaWVyIG1ldGhvZCBhYnN0cmFjdGVkIGF3YXkgdGhlIGRldGFpbHMKICBhbmQgbWVhc3VyZWQgYSBzaW1wbGlmaWVkIG1vZGVsIGluc3RlYWQsIGJ1dCBjb25zZXF1ZW50bHkgY29tcHV0ZWQKICBhIGNvbnN0YW50IHRvbyBzbWFsbCBieSBhIGZhY3RvciBvZiAyIG9uIHNvbWUgbW9kZXJuIG1hY2hpbmVzLgoKLSBxdW9wcmkncyBlbmNvZGUgYW5kIGRlY29kZSBtZXRob2RzIHRha2UgYW4gb3B0aW9uYWwgaGVhZGVyIHBhcmFtZXRlciwKICB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBvdXRwdXQgaXMgaW50ZW5kZWQgZm9yIHRoZSBoZWFkZXIgJ1EnCiAgZW5jb2RpbmcuCgotIFRoZSBTb2NrZXRTZXJ2ZXIuVGhyZWFkaW5nTWl4SW4gY2xhc3Mgbm93IGNsb3NlcyB0aGUgcmVxdWVzdCBhZnRlcgogIGZpbmlzaF9yZXF1ZXN0KCkgcmV0dXJucy4gIChOb3Qgd2hlbiBpdCBlcnJvcnMgb3V0IHRob3VnaC4pCgotIFRoZSBubnRwbGliIG1vZHVsZSdzIE5OVFAuYm9keSgpIG1ldGhvZCBoYXMgZ3Jvd24gYSBgZmlsZScgYXJndW1lbnQKICB0byBhbGxvdyBzYXZpbmcgdGhlIG1lc3NhZ2UgYm9keSB0byBhIGZpbGUuCgotIFRoZSBlbWFpbCBwYWNrYWdlIGhhcyBhZGRlZCBhIGNsYXNzIGVtYWlsLlBhcnNlci5IZWFkZXJQYXJzZXIgd2hpY2gKICBvbmx5IHBhcnNlcyBoZWFkZXJzIGFuZCBkb2VzIG5vdCByZWN1cnNlIGludG8gdGhlIG1lc3NhZ2UncyBib2R5LgogIEFsc28sIHRoZSBtb2R1bGUvY2xhc3MgTUlNRUF1ZGlvIGhhcyBiZWVuIGFkZGVkIGZvciByZXByZXNlbnRpbmcKICBhdWRpbyBkYXRhIChjb250cmlidXRlZCBieSBBbnRob255IEJheHRlcikuCgotIGZ0cGxpYiBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgZmlsZXMgPiAyR0IuCgotIENvbmZpZ1BhcnNlci5nZXRib29sZWFuKCkgbm93IGFsc28gaW50ZXJwcmV0cyBUUlVFLCBGQUxTRSwgWUVTLCBOTywKICBPTiwgYW5kIE9GRi4KCi0geG1sLmRvbS5taW5pZG9tIE5vZGVMaXN0IG9iamVjdHMgbm93IHN1cHBvcnQgdGhlIGxlbmd0aCBhdHRyaWJ1dGUKICBhbmQgaXRlbSgpIG1ldGhvZCBhcyByZXF1aXJlZCBieSB0aGUgRE9NIHNwZWNpZmljYXRpb25zLgoKVG9vbHMvRGVtb3MKCi0gRGVtby9kbnMgd2FzIHJlbW92ZWQuICBJdCBubyBsb25nZXIgc2VydmVzIGFueSBwdXJwb3NlOyBhIHBhY2thZ2UKICBkZXJpdmVkIGZyb20gaXQgaXMgbm93IG1haW50YWluZWQgYnkgQW50aG9ueSBCYXh0ZXIsIHNlZQogIGh0dHA6Ly9QeUROUy5Tb3VyY2VGb3JnZS5uZXQuCgotIFRoZSBmcmVlemUgdG9vbCBoYXMgYmVlbiBtYWRlIG1vcmUgcm9idXN0LCBhbmQgdHdvIG5ldyBvcHRpb25zIGhhdmUKICBiZWVuIGFkZGVkOiAtWCBhbmQgLUUuCgpCdWlsZAoKLSBjb25maWd1cmUgd2lsbCB1c2UgQ1hYIGluIExJTktDQyBpZiBDWFggaXMgdXNlZCB0byBidWlsZCBtYWluKCkgYW5kCiAgdGhlIHN5c3RlbSByZXF1aXJlcyB0byBsaW5rIGEgQysrIG1haW4gdXNpbmcgdGhlIEMrKyBjb21waWxlci4KCkMgQVBJCgotIFRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgdHBfY29tcGFyZSBzbG90IGlzIHVwZGF0ZWQgdG8gcmVxdWlyZSB0aGF0CiAgdGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIC0xLCAwLCAxOyBhbiBhcmJpdHJhcnkgbnVtYmVyIDwwIG9yID4wIGlzCiAgbm90IGNvcnJlY3QuICBUaGlzIGlzIG5vdCB5ZXQgZW5mb3JjZWQgYnV0IHdpbGwgYmUgZW5mb3JjZWQgaW4KICBQeXRob24gMi4zOyBldmVuIGxhdGVyLCB3ZSBtYXkgdXNlIC0yIHRvIGluZGljYXRlIGVycm9ycyBhbmQgKzIgZm9yCiAgIk5vdEltcGxlbWVudGVkIi4gIFJpZ2h0IG5vdywgLTEgc2hvdWxkIGJlIHVzZWQgZm9yIGFuIGVycm9yIHJldHVybi4KCi0gUHlMb25nX0FzTG9uZ0xvbmcoKSBub3cgYWNjZXB0cyBpbnQgKGFzIHdlbGwgYXMgbG9uZykgYXJndW1lbnRzLgogIENvbnNlcXVlbnRseSwgUHlBcmdfUGFyc2VUdXBsZSdzICdMJyBjb2RlIGFsc28gYWNjZXB0cyBpbnQgKGFzIHdlbGwKICBhcyBsb25nKSBhcmd1bWVudHMuCgotIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoKSBub3cgcmV0dXJucyBhIGxvbmcgaW50IGdpdmluZyB0aGUgdGhyZWFkCiAgSUQsIGlmIG9uZSBjYW4gYmUgY2FsY3VsYXRlZDsgaXQgcmV0dXJucyAtMSBmb3IgZXJyb3IsIDAgaWYgbm8KICB0aHJlYWQgSUQgaXMgY2FsY3VsYXRlZCAodGhpcyBpcyBhbiBpbmNvbXBhdGlibGUgY2hhbmdlLCBidXQgb25seQogIHRoZSB0aHJlYWQgbW9kdWxlIHVzZWQgdGhpcyBBUEkpLiAgVGhpcyBjb2RlIGhhcyBvbmx5IHJlYWxseSBiZWVuCiAgdGVzdGVkIG9uIExpbnV4IGFuZCBXaW5kb3dzOyBvdGhlciBwbGF0Zm9ybXMgcGxlYXNlIGJld2FyZSAoYW5kCiAgcmVwb3J0IGFueSBidWdzIG9yIHN0cmFuZ2UgYmVoYXZpb3IpLgoKLSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoKSBubyBsb25nZXIgYWNjZXB0cyBVbmljb2RlIG9iamVjdHMgYXMKICBpbnB1dC4KCk5ldyBwbGF0Zm9ybXMKClRlc3RzCgpXaW5kb3dzCgotIEluc3RhbGxlcjogIElmIHlvdSBpbnN0YWxsIElETEUsIGFuZCBkb24ndCBkaXNhYmxlIGZpbGUtZXh0ZW5zaW9uCiAgcmVnaXN0cmF0aW9uLCBhIG5ldyAiRWRpdCB3aXRoIElETEUiIGNvbnRleHQgKHJpZ2h0LWNsaWNrKSBtZW51IGVudHJ5CiAgaXMgY3JlYXRlZCBmb3IgLnB5IGFuZCAucHl3IGZpbGVzLgoKLSBUaGUgc2lnbmFsIG1vZHVsZSBub3cgc3VwcG9ydHMgU0lHQlJFQUsgb24gV2luZG93cywgdGhhbmtzIHRvIFN0ZXZlbgogIFNjb3R0LiAgTm90ZSB0aGF0IFNJR0JSRUFLIGlzIHVuaXF1ZSB0byBXaW5kb3dzLiAgVGhlIGRlZmF1bHQgU0lHQlJFQUsKICBhY3Rpb24gcmVtYWlucyB0byBjYWxsIFdpbjMyIEV4aXRQcm9jZXNzKCkuICBUaGlzIGNhbiBiZSBjaGFuZ2VkIHZpYQogIHNpZ25hbC5zaWduYWwoKS4gIEZvciBleGFtcGxlOgoKICAjIE1ha2UgQ3RybCtCcmVhayByYWlzZSBLZXlib2FyZEludGVycnVwdCwgbGlrZSBQeXRob24ncyBkZWZhdWx0IEN0cmwrQwogICMgKFNJR0lOVCkgYmVoYXZpb3IuCiAgaW1wb3J0IHNpZ25hbAogIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0JSRUFLLAogICAgICAgICAgICAgICAgc2lnbmFsLmRlZmF1bHRfaW50X2hhbmRsZXIpCgogIHRyeToKICAgICAgd2hpbGUgMToKICAgICAgICAgIHBhc3MKICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICMgV2UgZ2V0IGhlcmUgb24gQ3RybCtDIG9yIEN0cmwrQnJlYWsgbm93OyBpZiB3ZSBoYWQgbm90IGNoYW5nZWQKICAgICAgIyBTSUdCUkVBSywgb25seSBvbiBDdHJsK0MgKGFuZCBDdHJsK0JyZWFrIHdvdWxkIHRlcm1pbmF0ZSB0aGUKICAgICAgIyBwcm9ncmFtIHdpdGhvdXQgdGhlIHBvc3NpYmlsaXR5IGZvciBhbnkgUHl0aG9uLWxldmVsIGNsZWFudXApLgogICAgICBwcmludCAiQ2xlYW4gZXhpdCIKCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJhND8KUmVsZWFzZSBkYXRlOiAyOC1TZXAtMjAwMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KClR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCgotIHB5ZG9jIGFuZCBpbnNwZWN0IGFyZSBub3cgYXdhcmUgb2YgbmV3LXN0eWxlIGNsYXNzZXM7CiAgZS5nLiBoZWxwKGxpc3QpIGF0IHRoZSBpbnRlcmFjdGl2ZSBwcm9tcHQgbm93IHNob3dzIHByb3BlcgogIGRvY3VtZW50YXRpb24gZm9yIGFsbCBvcGVyYXRpb25zIG9uIGxpc3Qgb2JqZWN0cy4KCi0gQXBwbGljYXRpb25zIHVzaW5nIEppbSBGdWx0b24ncyBFeHRlbnNpb25DbGFzcyBtb2R1bGUgY2FuIG5vdyBzYWZlbHkKICBiZSB1c2VkIHdpdGggUHl0aG9uIDIuMi4gIEluIHBhcnRpY3VsYXIsIFpvcGUgMi40LjEgbm93IHdvcmtzIHdpdGgKICBQeXRob24gMi4yIChhcyB3ZWxsIGFzIHdpdGggUHl0aG9uIDIuMS4xKS4gIFRoZSBEZW1vL21ldGFjbGFzcwogIGV4YW1wbGVzIGFsc28gd29yayBhZ2Fpbi4gIEl0IGlzIGhvcGVkIHRoYXQgR3RrIGFuZCBCb29zdCBhbHNvIHdvcmsKICB3aXRoIDIuMmE0IGFuZCBiZXlvbmQuICAoSWYgeW91IGNhbiBjb25maXJtIHRoaXMsIHBsZWFzZSB3cml0ZQogIHdlYm1hc3RlckBweXRob24ub3JnOyBpZiB0aGVyZSBhcmUgc3RpbGwgcHJvYmxlbXMsIHBsZWFzZSBvcGVuIGEgYnVnCiAgcmVwb3J0IG9uIFNvdXJjZUZvcmdlLikKCi0gcHJvcGVydHkoKSBub3cgdGFrZXMgNCBrZXl3b3JkIGFyZ3VtZW50czogIGZnZXQsIGZzZXQsIGZkZWwgYW5kIGRvYy4KICBUaGVzZSBtYXAgdG8gcmVhZC1vbmx5IGF0dHJpYnV0ZXMgJ2ZnZXQnLCAnZnNldCcsICdmZGVsJywgYW5kICdfX2RvY19fJwogIGluIHRoZSBjb25zdHJ1Y3RlZCBwcm9wZXJ0eSBvYmplY3QuICBmZ2V0LCBmc2V0IGFuZCBmZGVsIHdlcmVuJ3QKICBkaXNjb3ZlcmFibGUgZnJvbSBQeXRob24gaW4gMi4yYTMuICBfX2RvY19fIGlzIG5ldywgYW5kIGFsbG93cyB0bwogIGFzc29jaWF0ZSBhIGRvY3N0cmluZyB3aXRoIGEgcHJvcGVydHkuCgotIENvbXBhcmlzb24gb3ZlcmxvYWRpbmcgaXMgbm93IG1vcmUgY29tcGxldGVseSBpbXBsZW1lbnRlZC4gIEZvcgogIGV4YW1wbGUsIGEgc3RyIHN1YmNsYXNzIGluc3RhbmNlIGNhbiBwcm9wZXJseSBiZSBjb21wYXJlZCB0byBhIHN0cgogIGluc3RhbmNlLCBhbmQgaXQgY2FuIHByb3Blcmx5IG92ZXJsb2FkIGNvbXBhcmlzb24uICBEaXR0byBmb3IgbW9zdAogIG90aGVyIGJ1aWx0LWluIG9iamVjdCB0eXBlcy4KCi0gVGhlIHJlcHIoKSBvZiBuZXctc3R5bGUgY2xhc3NlcyBoYXMgY2hhbmdlZDsgaW5zdGVhZCBvZiA8dHlwZQogICdNLkZvbyc+IGEgbmV3LXN0eWxlIGNsYXNzIGlzIG5vdyByZW5kZXJlZCBhcyA8Y2xhc3MgJ00uRm9vJz4sCiAgKmV4Y2VwdCogZm9yIGJ1aWx0LWluIHR5cGVzLCB3aGljaCBhcmUgc3RpbGwgcmVuZGVyZWQgYXMgPHR5cGUKICAnRm9vJz4gKHRvIGF2b2lkIHVwc2V0dGluZyBleGlzdGluZyBjb2RlIHRoYXQgbWlnaHQgcGFyc2Ugb3IKICBvdGhlcndpc2UgcmVseSBvbiByZXByKCkgb2YgY2VydGFpbiB0eXBlIG9iamVjdHMpLgoKLSBUaGUgcmVwcigpIG9mIG5ldy1zdHlsZSBvYmplY3RzIGlzIG5vdyBhbHdheXMgPEZvbyBvYmplY3QgYXQgWFhYPjsKICBwcmV2aW91c2x5LCBpdCB3YXMgc29tZXRpbWVzIDxGb28gaW5zdGFuY2UgYXQgWFhYPi4KCi0gRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCB3aGF0IHdhcyBwcmV2aW91c2x5IGNhbGxlZCBfX2dldGF0dHJfXyBpcyBub3cKICBjYWxsZWQgX19nZXRhdHRyaWJ1dGVfXy4gIFRoaXMgbWV0aG9kLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgZm9yCiAgKmV2ZXJ5KiBhdHRyaWJ1dGUgYWNjZXNzLiAgQSBuZXcgX19nZXRhdHRyX18gaG9vayBtb3JlIHNpbWlsYXIgdG8gdGhlCiAgb25lIGluIGNsYXNzaWMgY2xhc3NlcyBpcyBkZWZpbmVkIHdoaWNoIGlzIGNhbGxlZCBvbmx5IGlmIHJlZ3VsYXIKICBhdHRyaWJ1dGUgYWNjZXNzIHJhaXNlcyBBdHRyaWJ1dGVFcnJvcjsgdG8gY2F0Y2ggKmFsbCogYXR0cmlidXRlCiAgYWNjZXNzLCB5b3UgY2FuIHVzZSBfX2dldGF0dHJpYnV0ZV9fIChmb3IgbmV3LXN0eWxlIGNsYXNzZXMpLiAgSWYKICBib3RoIGFyZSBkZWZpbmVkLCBfX2dldGF0dHJpYnV0ZV9fIGlzIGNhbGxlZCBmaXJzdCwgYW5kIGlmIGl0IHJhaXNlcwogIEF0dHJpYnV0ZUVycm9yLCBfX2dldGF0dHJfXyBpcyBjYWxsZWQuCgotIFRoZSBfX2NsYXNzX18gYXR0cmlidXRlIG9mIG5ldy1zdHlsZSBvYmplY3RzIGNhbiBiZSBhc3NpZ25lZCB0by4KICBUaGUgbmV3IGNsYXNzIG11c3QgaGF2ZSB0aGUgc2FtZSBDLWxldmVsIG9iamVjdCBsYXlvdXQgYXMgdGhlIG9sZAogIGNsYXNzLgoKLSBUaGUgYnVpbHRpbiBmaWxlIHR5cGUgY2FuIGJlIHN1YmNsYXNzZWQgbm93LiAgSW4gdGhlIHVzdWFsIHBhdHRlcm4sCiAgImZpbGUiIGlzIHRoZSBuYW1lIG9mIHRoZSBidWlsdGluIHR5cGUsIGFuZCBmaWxlKCkgaXMgYSBuZXcgYnVpbHRpbgogIGNvbnN0cnVjdG9yLCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGUgYnVpbHRpbiBvcGVuKCkgZnVuY3Rpb24uCiAgZmlsZSgpIGlzIG5vdyB0aGUgcHJlZmVycmVkIHdheSB0byBvcGVuIGEgZmlsZS4KCi0gUHJldmlvdXNseSwgX19uZXdfXyB3b3VsZCBvbmx5IHNlZSBzZXF1ZW50aWFsIGFyZ3VtZW50cyBwYXNzZWQgdG8KICB0aGUgdHlwZSBpbiBhIGNvbnN0cnVjdG9yIGNhbGw7IF9faW5pdF9fIHdvdWxkIHNlZSBib3RoIHNlcXVlbnRpYWwKICBhbmQga2V5d29yZCBhcmd1bWVudHMuICBUaGlzIG1hZGUgbm8gc2Vuc2Ugd2hhdHNvZXZlciBhbnkgbW9yZSwgc28KICBub3cgYm90aCBfX25ld19fIGFuZCBfX2luaXRfXyBzZWUgYWxsIGFyZ3VtZW50cy4KCi0gUHJldmlvdXNseSwgaGFzaCgpIGFwcGxpZWQgdG8gYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBzdHIgb3IKICB1bmljb2RlIGFsd2F5cyByZXR1cm5lZCAwLiAgVGhpcyBoYXMgYmVlbiByZXBhaXJlZC4KCi0gUHJldmlvdXNseSwgYW4gb3BlcmF0aW9uIG9uIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgYW4KICBpbW11dGFibGUgdHlwZSAoaW50LCBsb25nLCBmbG9hdCwgY29tcGxleCwgdHVwbGUsIHN0ciwgdW5pY29kZSksCiAgd2hlcmUgdGhlIHN1YnR5cGUgZGlkbid0IG92ZXJyaWRlIHRoZSBvcGVyYXRpb24gKGFuZCBzbyB0aGUKICBvcGVyYXRpb24gd2FzIGhhbmRsZWQgYnkgdGhlIGJ1aWx0aW4gdHlwZSksIGNvdWxkIHJldHVybiB0aGF0CiAgaW5zdGFuY2UgaW5zdGVhZCBhIHZhbHVlIG9mIHRoZSBiYXNlIHR5cGUuICBGb3IgZXhhbXBsZSwgaWYgcyB3YXMgb2YKICBhIHN0ciBzdWJjbGFzcyB0eXBlLCBzWzpdIHJldHVybmVkIHMgYXMtaXMuICBOb3cgaXQgcmV0dXJucyBhIHN0cgogIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgcy4KCi0gUHJvdmlzaW9uYWwgc3VwcG9ydCBmb3IgcGlja2xpbmcgbmV3LXN0eWxlIG9iamVjdHMgaGFzIGJlZW4gYWRkZWQuCgpDb3JlCgotIGZpbGUud3JpdGVsaW5lcygpIG5vdyBhY2NlcHRzIGFueSBpdGVyYWJsZSBvYmplY3QgcHJvZHVjaW5nIHN0cmluZ3MuCgotIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCgpIG5vdyB3b3JrcyB2ZXJ5IG11Y2ggbGlrZQogIFB5T2JqZWN0X1N0cihvYmopIGluIHRoYXQgaXQgdHJpZXMgdG8gdXNlIF9fc3RyX18vdHBfc3RyCiAgb24gdGhlIG9iamVjdCBpZiB0aGUgb2JqZWN0IGlzIG5vdCBhIHN0cmluZyBvciBidWZmZXIuIFRoaXMKICBtYWtlcyB1bmljb2RlKCkgYmVoYXZlIGxpa2Ugc3RyKCkgd2hlbiBhcHBsaWVkIHRvIG5vbi1zdHJpbmcvYnVmZmVyCiAgb2JqZWN0cy4KCi0gUHlGaWxlX1dyaXRlT2JqZWN0IG5vdyBwYXNzZXMgVW5pY29kZSBvYmplY3RzIHRvIHRoZSBmaWxlJ3Mgd3JpdGUKICBtZXRob2QuIEFzIGEgcmVzdWx0LCBhbGwgZmlsZS1saWtlIG9iamVjdHMgd2hpY2ggbWF5IGJlIHRoZSB0YXJnZXQKICBvZiBhIHByaW50IHN0YXRlbWVudCBtdXN0IHN1cHBvcnQgVW5pY29kZSBvYmplY3RzLCBpLmUuIHRoZXkgbXVzdAogIGF0IGxlYXN0IGNvbnZlcnQgdGhlbSBpbnRvIEFTQ0lJIHN0cmluZ3MuCgotIFRocmVhZCBzY2hlZHVsaW5nIG9uIFNvbGFyaXMgc2hvdWxkIGJlIGltcHJvdmVkOyBpdCBpcyBubyBsb25nZXIKICBuZWNlc3NhcnkgdG8gaW5zZXJ0IGEgc21hbGwgc2xlZXAgYXQgdGhlIHN0YXJ0IG9mIGEgdGhyZWFkIGluIG9yZGVyCiAgdG8gbGV0IG90aGVyIHJ1bm5hYmxlIHRocmVhZHMgYmUgc2NoZWR1bGVkLgoKTGlicmFyeQoKLSBTdHJpbmdJTy5TdHJpbmdJTyBpbnN0YW5jZXMgYW5kIGNTdHJpbmdJTy5TdHJpbmdJTyBpbnN0YW5jZXMgc3VwcG9ydAogIHJlYWQgY2hhcmFjdGVyIGJ1ZmZlciBjb21wYXRpYmxlIG9iamVjdHMgZm9yIHRoZWlyIC53cml0ZSgpIG1ldGhvZHMuCiAgVGhlc2Ugb2JqZWN0cyBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MgYW5kIHRoZW4gaGFuZGxlZCBhcyBzdWNoCiAgYnkgdGhlIGluc3RhbmNlcy4KCi0gVGhlICJlbWFpbCIgcGFja2FnZSBoYXMgYmVlbiBhZGRlZC4gIFRoaXMgaXMgYmFzaWNhbGx5IGEgcG9ydCBvZiB0aGUKICBtaW1lbGliIHBhY2thZ2UgPGh0dHA6Ly9zZi5uZXQvcHJvamVjdHMvbWltZWxpYj4gd2l0aCBBUEkgY2hhbmdlcwogIGFuZCBzb21lIGltcGxlbWVudGF0aW9ucyB1cGRhdGVkIHRvIHVzZSBpdGVyYXRvcnMgYW5kIGdlbmVyYXRvcnMuCgotIGRpZmZsaWIubmRpZmYoKSBhbmQgZGlmZmxpYi5EaWZmZXIuY29tcGFyZSgpIGFyZSBnZW5lcmF0b3JzIG5vdy4gIFRoaXMKICByZXN0b3JlcyB0aGUgYWJpbGl0eSBvZiBUb29scy9zY3JpcHRzL25kaWZmLnB5IHRvIHN0YXJ0IHByb2R1Y2luZyBvdXRwdXQKICBiZWZvcmUgdGhlIGVudGlyZSBjb21wYXJpc29uIGlzIGNvbXBsZXRlLgoKLSBTdHJpbmdJTy5TdHJpbmdJTyBpbnN0YW5jZXMgYW5kIGNTdHJpbmdJTy5TdHJpbmdJTyBpbnN0YW5jZXMgc3VwcG9ydAogIGl0ZXJhdGlvbiBqdXN0IGxpa2UgZmlsZSBvYmplY3RzIChpLmUuIHRoZWlyIC5yZWFkbGluZSgpIG1ldGhvZCBpcwogIGNhbGxlZCBmb3IgZWFjaCBpdGVyYXRpb24gdW50aWwgaXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcpLgoKLSBUaGUgY29kZWNzIG1vZHVsZSBoYXMgZ3Jvd24gZm91ciBuZXcgaGVscGVyIEFQSXMgdG8gYWNjZXNzCiAgYnVpbHRpbiBjb2RlY3M6IGdldGVuY29kZXIoKSwgZ2V0ZGVjb2RlcigpLCBnZXRyZWFkZXIoKSwKICBnZXR3cml0ZXIoKS4KCi0gU2ltcGxlWE1MUlBDU2VydmVyOiBhIG5ldyBtb2R1bGUgKGJhc2VkIHVwb24gU2ltcGxlSFRNTFNlcnZlcikKICBzaW1wbGlmaWVzIHdyaXRpbmcgWE1MIFJQQyBzZXJ2ZXJzLgoKLSBvcy5wYXRoLnJlYWxwYXRoKCk6IGEgbmV3IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aG5hbWUKICBhZnRlciBpbnRlcnByZXRhdGlvbiBvZiBzeW1ib2xpYyBsaW5rcy4gIE9uIG5vbi1Vbml4IHN5c3RlbXMsIHRoaXMKICBpcyBhbiBhbGlhcyBmb3Igb3MucGF0aC5hYnNwYXRoKCkuCgotIG9wZXJhdG9yLmluZGV4T2YoKSAoUHlTZXF1ZW5jZV9JbmRleCgpIGluIHRoZSBDIEFQSSkgbm93IHdvcmtzIHdpdGggYW55CiAgaXRlcmFibGUgb2JqZWN0LgoKLSBzbXRwbGliIG5vdyBzdXBwb3J0cyB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uIGFuZCBzZWN1cml0eSBmZWF0dXJlcyBvZgogIHRoZSBTTVRQIHByb3RvY29sIHRocm91Z2ggdGhlIG5ldyBsb2dpbigpIGFuZCBzdGFydHRscygpIG1ldGhvZHMuCgotIGhtYWM6IGEgbmV3IG1vZHVsZSBpbXBsZW1lbnRpbmcga2V5ZWQgaGFzaGluZyBmb3IgbWVzc2FnZQogIGF1dGhlbnRpY2F0aW9uLgoKLSBtaW1ldHlwZXMgbm93IHJlY29nbml6ZXMgbW9yZSBleHRlbnNpb25zIGFuZCBmaWxlIHR5cGVzLiAgQXQgdGhlCiAgc2FtZSB0aW1lLCBzb21lIG1hcHBpbmdzIG5vdCBzYW5jdGlvbmVkIGJ5IElBTkEgd2VyZSByZW1vdmVkLgoKLSBUaGUgImNvbXBpbGVyIiBwYWNrYWdlIGhhcyBiZWVuIGJyb3VnaHQgdXAgdG8gZGF0ZSB0byB0aGUgc3RhdGUgb2YKICBQeXRob24gMi4yIGJ5dGVjb2RlIGdlbmVyYXRpb24uICBJdCBoYXMgYWxzbyBiZWVuIHByb21vdGVkIGZyb20gYQogIFRvb2wgdG8gYSBzdGFuZGFyZCBsaWJyYXJ5IHBhY2thZ2UuICAoVG9vbHMvY29tcGlsZXIgc3RpbGwgZXhpc3RzIGFzCiAgYSBzYW1wbGUgZHJpdmVyLikKClRvb2xzCgpCdWlsZAoKLSBMYXJnZSBmaWxlIHN1cHBvcnQgKExGUykgaXMgbm93IGF1dG9tYXRpYyB3aGVuIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cwogIGl0OyBubyBtb3JlIG1hbnVhbCBjb25maWd1cmF0aW9uIHR3ZWFrcyBhcmUgbmVlZGVkLiAgT24gTGludXgsIGF0CiAgbGVhc3QsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBhIHN5c3RlbSB3aG9zZSBDIGxpYnJhcnkgc3VwcG9ydHMgbGFyZ2UKICBmaWxlcyBidXQgd2hvc2Uga2VybmVsIGRvZXNuJ3Q7IGluIHRoaXMgY2FzZSwgbGFyZ2UgZmlsZSBzdXBwb3J0IGlzCiAgc3RpbGwgZW5hYmxlZCBidXQgZG9lc24ndCBkbyB5b3UgYW55IGdvb2QgdW5sZXNzIHlvdSB1cGdyYWRlIHlvdXIKICBrZXJuZWwgb3Igc2hhcmUgeW91ciBQeXRob24gZXhlY3V0YWJsZSB3aXRoIGFub3RoZXIgc3lzdGVtIHdob3NlCiAga2VybmVsIGhhcyBsYXJnZSBmaWxlIHN1cHBvcnQuCgotIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBzdXBwbGllcyBwbGF1c2libGUgZGVmYXVsdHMgaW4gYQogIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50LiAgVGhpcyBkb2Vzbid0IG1lYW4gdGhhdCB0aGUgc3VwcGxpZWQKICB2YWx1ZXMgYXJlIGFsd2F5cyBjb3JyZWN0LCBvciB0aGF0IGNyb3NzLWNvbXBpbGF0aW9uIG5vdyB3b3JrcwogIGZsYXdsZXNzbHkgLS0gYnV0IGl0J3MgYSBmaXJzdCBzdGVwIChhbmQgaXQgc2h1dHMgdXAgbW9zdCBvZgogIGF1dG9jb25mJ3Mgd2FybmluZ3MgYWJvdXQgQUNfVFJZX1JVTikuCgotIFRoZSBVbml4IGJ1aWxkIGlzIG5vdyBhIGJpdCBsZXNzIGNoYXR0eSwgY291cnRlc3kgb2YgdGhlIHBhcnNlcgogIGdlbmVyYXRvci4gIFRoZSBidWlsZCBpcyBjb21wbGV0ZWx5IHNpbGVudCAoZXhjZXB0IGZvciBlcnJvcnMpIHdoZW4KICB1c2luZyAibWFrZSAtcyIsIHRoYW5rcyB0byBhIC1xIG9wdGlvbiB0byBzZXR1cC5weS4KCkMgQVBJCgotIFRoZSAic3RydWN0bWVtYmVyIiBBUEkgbm93IHN1cHBvcnRzIHNvbWUgbmV3IGZsYWcgYml0cyB0byBkZW55IHJlYWQKICBhbmQvb3Igd3JpdGUgYWNjZXNzIHRvIGF0dHJpYnV0ZXMgaW4gcmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZS4KCk5ldyBwbGF0Zm9ybXMKCi0gQ29tcGFxJ3MgaVBBUSBoYW5kaGVsZCwgcnVubmluZyB0aGUgImZhbWlsaWFyIiBMaW51eCBkaXN0cmlidXRpb24KICAoaHR0cDovL2ZhbWlsaWFyLmhhbmRoZWxkcy5vcmcpLgoKVGVzdHMKCi0gVGhlICJjbGFzc2ljIiBzdGFuZGFyZCB0ZXN0cywgd2hpY2ggd29yayBieSBjb21wYXJpbmcgc3Rkb3V0IHRvCiAgYW4gZXhwZWN0ZWQtb3V0cHV0IGZpbGUgdW5kZXIgTGliL3Rlc3Qvb3V0cHV0Lywgbm8gbG9uZ2VyIHN0b3AgYXQKICB0aGUgZmlyc3QgbWlzbWF0Y2guICBJbnN0ZWFkIHRoZSB0ZXN0IGlzIHJ1biB0byBjb21wbGV0aW9uLCBhbmQgYQogIHZhcmlhbnQgb2YgbmRpZmYtc3R5bGUgY29tcGFyaXNvbiBpcyB1c2VkIHRvIHJlcG9ydCBhbGwgZGlmZmVyZW5jZXMuCiAgVGhpcyBpcyBtdWNoIGVhc2llciB0byB1bmRlcnN0YW5kIHRoYW4gdGhlIHByZXZpb3VzIHN0eWxlIG9mIHJlcG9ydGluZy4KCi0gVGhlIHVuaXR0ZXN0LWJhc2VkIHN0YW5kYXJkIHRlc3RzIG5vdyB1c2UgcmVncnRlc3QncyB0ZXN0X21haW4oKQogIGNvbnZlbnRpb24sIGluc3RlYWQgb2YgcnVubmluZyBhcyBhIHNpZGUtZWZmZWN0IG9mIG1lcmVseSBiZWluZwogIGltcG9ydGVkLiAgVGhpcyBhbGxvd3MgdGhlc2UgdGVzdHMgdG8gYmUgcnVuIGluIG1vcmUgbmF0dXJhbCBhbmQKICBmbGV4aWJsZSB3YXlzIGFzIHVuaXR0ZXN0cywgb3V0c2lkZSB0aGUgcmVncnRlc3QgZnJhbWV3b3JrLgoKLSByZWdydGVzdC5weSBpcyBtdWNoIGJldHRlciBpbnRlZ3JhdGVkIHdpdGggdW5pdHRlc3QgYW5kIGRvY3Rlc3Qgbm93LAogIGVzcGVjaWFsbHkgaW4gcmVnYXJkIHRvIHJlcG9ydGluZyBlcnJvcnMuCgpXaW5kb3dzCgotIExhcmdlIGZpbGUgc3VwcG9ydCBub3cgYWxzbyB3b3JrcyBmb3IgZmlsZXMgPiA0R0IsIG9uIGZpbGVzeXN0ZW1zCiAgdGhhdCBzdXBwb3J0IGl0IChOVEZTIHVuZGVyIFdpbmRvd3MgMjAwMCkuICBTZWUgIldoYXQncyBOZXcgaW4KICBQeXRob24gMi4yYTMiIGZvciBtb3JlIGRldGFpbC4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJhMz8KUmVsZWFzZSBEYXRlOiAwNy1TZXAtMjAwMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUKCi0gQ29udmVyc2lvbiBvZiBsb25nIHRvIGZsb2F0IG5vdyByYWlzZXMgT3ZlcmZsb3dFcnJvciBpZiB0aGUgbG9uZyBpcyB0b28KICBiaWcgdG8gcmVwcmVzZW50IGFzIGEgQyBkb3VibGUuCgotIFRoZSAzLWFyZ3VtZW50IGJ1aWx0aW4gcG93KCkgbm8gbG9uZ2VyIGFsbG93cyBhIHRoaXJkIG5vbi1Ob25lIGFyZ3VtZW50CiAgaWYgZWl0aGVyIG9mIHRoZSBmaXJzdCB0d28gYXJndW1lbnRzIGlzIGEgZmxvYXQsIG9yIGlmIGJvdGggYXJlIG9mCiAgaW50ZWdlciB0eXBlcyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBuZWdhdGl2ZSAoaW4gd2hpY2ggbGF0dGVyIGNhc2UKICB0aGUgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gZmxvYXQsIHNvIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lCiAgcmVzdHJpY3Rpb24pLgoKLSBUaGUgYnVpbHRpbiBkaXIoKSBub3cgcmV0dXJucyBtb3JlIGluZm9ybWF0aW9uLCBhbmQgc29tZXRpbWVzIG11Y2gKICBtb3JlLCBnZW5lcmFsbHkgbmFtaW5nIGFsbCBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCwgYW5kIGFsbCBhdHRyaWJ1dGVzCiAgcmVhY2hhYmxlIGZyb20gdGhlIG9iamVjdCB2aWEgaXRzIGNsYXNzLCBhbmQgZnJvbSBpdHMgY2xhc3MncyBiYXNlCiAgY2xhc3NlcywgYW5kIHNvIG9uIGZyb20gdGhlbSB0b28uICBFeGFtcGxlOiAgaW4gMi4yYTIsIGRpcihbXSkgcmV0dXJuZWQKICBhbiBlbXB0eSBsaXN0LiAgSW4gMi4yYTMsCgogID4+PiBkaXIoW10pCiAgWydfX2FkZF9fJywgJ19fY2xhc3NfXycsICdfX2NvbnRhaW5zX18nLCAnX19kZWxhdHRyX18nLCAnX19kZWxpdGVtX18nLAogICAnX19lcV9fJywgJ19fZ2VfXycsICdfX2dldGF0dHJfXycsICdfX2dldGl0ZW1fXycsICdfX2dldHNsaWNlX18nLAogICAnX19ndF9fJywgJ19faGFzaF9fJywgJ19faWFkZF9fJywgJ19faW11bF9fJywgJ19faW5pdF9fJywgJ19fbGVfXycsCiAgICdfX2xlbl9fJywgJ19fbHRfXycsICdfX211bF9fJywgJ19fbmVfXycsICdfX25ld19fJywgJ19fcmVwcl9fJywKICAgJ19fcm11bF9fJywgJ19fc2V0YXR0cl9fJywgJ19fc2V0aXRlbV9fJywgJ19fc2V0c2xpY2VfXycsICdfX3N0cl9fJywKICAgJ2FwcGVuZCcsICdjb3VudCcsICdleHRlbmQnLCAnaW5kZXgnLCAnaW5zZXJ0JywgJ3BvcCcsICdyZW1vdmUnLAogICAncmV2ZXJzZScsICdzb3J0J10KCiAgZGlyKG1vZHVsZSkgY29udGludWVzIHRvIHJldHVybiBvbmx5IHRoZSBtb2R1bGUncyBhdHRyaWJ1dGVzLCB0aG91Z2guCgotIE92ZXJmbG93aW5nIG9wZXJhdGlvbnMgb24gcGxhaW4gaW50cyBub3cgcmV0dXJuIGEgbG9uZyBpbnQgcmF0aGVyCiAgdGhhbiByYWlzaW5nIE92ZXJmbG93RXJyb3IuICBUaGlzIGlzIGEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBQRVAKICAyMzcuICBZb3UgY2FuIHVzZSAtV2RlZmF1bHQ6Ok92ZXJmbG93V2FybmluZyB0byBlbmFibGUgYSB3YXJuaW5nIGZvcgogIHRoaXMgc2l0dWF0aW9uLCBhbmQgLVdlcnJvcjo6T3ZlcmZsb3dXYXJuaW5nIHRvIHJldmVydCB0byB0aGUgb2xkCiAgT3ZlcmZsb3dFcnJvciBleGNlcHRpb24uCgotIEEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24sIC1RPGFyZz4sIGlzIGFkZGVkIHRvIGNvbnRyb2wgcnVuLXRpbWUKICB3YXJuaW5ncyBmb3IgdGhlIHVzZSBvZiBjbGFzc2ljIGRpdmlzaW9uLiAgKFNlZSBQRVAgMjM4LikgIFBvc3NpYmxlCiAgdmFsdWVzIGFyZSAtUW9sZCwgLVF3YXJuLCAtUXdhcm5hbGwsIGFuZCAtUW5ldy4gIFRoZSBkZWZhdWx0IGlzCiAgLVFvbGQsIG1lYW5pbmcgdGhlIC8gb3BlcmF0b3IgaGFzIGl0cyBjbGFzc2ljIG1lYW5pbmcgYW5kIG5vCiAgd2FybmluZ3MgYXJlIGlzc3VlZC4gIFVzaW5nIC1Rd2FybiBpc3N1ZXMgYSBydW4tdGltZSB3YXJuaW5nIGFib3V0CiAgYWxsIHVzZXMgb2YgY2xhc3NpYyBkaXZpc2lvbiBmb3IgaW50IGFuZCBsb25nIGFyZ3VtZW50czsgLVF3YXJuYWxsCiAgYWxzbyB3YXJucyBhYm91dCBjbGFzc2ljIGRpdmlzaW9uIGZvciBmbG9hdCBhbmQgY29tcGxleCBhcmd1bWVudHMKICAoZm9yIHVzZSB3aXRoIGZpeGRpdi5weSkuCiAgW05vdGU6ICB0aGUgcmVtYWluZGVyIG9mIHRoaXMgcGFyYWdyYXBoIChwcmVzZXJ2ZWQgYmVsb3cpIGJlY2FtZQogICBvYnNvbGV0ZSBpbiAyLjJjMSAtLSAtUW5ldyBoYXMgZ2xvYmFsIGVmZmVjdCBpbiAyLjJdCiAgPG9ic29sZXRlPgogIFVzaW5nIC1RbmV3IGlzIHF1ZXN0aW9uYWJsZTsgaXQgdHVybnMgb24gbmV3IGRpdmlzaW9uIGJ5IGRlZmF1bHQsIGJ1dAogIG9ubHkgaW4gdGhlIF9fbWFpbl9fIG1vZHVsZS4gIFlvdSBjYW4gdXNlZnVsbHkgY29tYmluZSAtUXdhcm4gb3IKICAtUXdhcm5hbGwgYW5kIC1RbmV3OiB0aGlzIGdpdmVzIHRoZSBfX21haW5fXyBtb2R1bGUgbmV3IGRpdmlzaW9uLCBhbmQKICB3YXJucyBhYm91dCBjbGFzc2ljIGRpdmlzaW9uIGV2ZXJ5d2hlcmUgZWxzZS4KICA8L29ic29sZXRlPgoKLSBNYW55IGJ1aWx0LWluIHR5cGVzIGNhbiBub3cgYmUgc3ViY2xhc3NlZC4gIFRoaXMgYXBwbGllcyB0byBpbnQsCiAgbG9uZywgZmxvYXQsIHN0ciwgdW5pY29kZSwgYW5kIHR1cGxlLiAgKFRoZSB0eXBlcyBjb21wbGV4LCBsaXN0IGFuZAogIGRpY3Rpb25hcnkgY2FuIGFsc28gYmUgc3ViY2xhc3NlZDsgdGhpcyB3YXMgaW50cm9kdWNlZCBlYXJsaWVyLikKICBOb3RlIHRoYXQgcmVzdHJpY3Rpb25zIGFwcGx5IHdoZW4gc3ViY2xhc3NpbmcgaW1tdXRhYmxlIGJ1aWx0LWluCiAgdHlwZXM6IHlvdSBjYW4gb25seSBhZmZlY3QgdGhlIHZhbHVlIG9mIHRoZSBpbnN0YW5jZSBieSBvdmVybG9hZGluZwogIF9fbmV3X18uICBZb3UgY2FuIGFkZCBtdXRhYmxlIGF0dHJpYnV0ZXMsIGFuZCB0aGUgc3ViY2xhc3MgaW5zdGFuY2VzCiAgd2lsbCBoYXZlIGEgX19kaWN0X18gYXR0cmlidXRlLCBidXQgeW91IGNhbm5vdCBjaGFuZ2UgdGhlICJ2YWx1ZSIKICAoYXMgaW1wbGVtZW50ZWQgYnkgdGhlIGJhc2UgY2xhc3MpIG9mIGFuIGltbXV0YWJsZSBzdWJjbGFzcyBpbnN0YW5jZQogIG9uY2UgaXQgaXMgY3JlYXRlZC4KCi0gVGhlIGRpY3Rpb25hcnkgY29uc3RydWN0b3Igbm93IHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LCBhCiAgbWFwcGluZy1saWtlIG9iamVjdCwgYW5kIGluaXRpYWxpemVzIHRoZSBkaWN0aW9uYXJ5IGZyb20gaXRzCiAgKGtleSwgdmFsdWUpIHBhaXJzLgoKLSBBIG5ldyBidWlsdC1pbiB0eXBlLCBzdXBlciwgaGFzIGJlZW4gYWRkZWQuICBUaGlzIGZhY2lsaXRhdGVzIG1ha2luZwogICJjb29wZXJhdGl2ZSBzdXBlciBjYWxscyIgaW4gYSBtdWx0aXBsZSBpbmhlcml0YW5jZSBzZXR0aW5nLiAgRm9yIGFuCiAgZXhwbGFuYXRpb24sIHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yL2Rlc2NyaW50cm8uaHRtbCNjb29wZXJhdGlvbgoKLSBBIG5ldyBidWlsdC1pbiB0eXBlLCBwcm9wZXJ0eSwgaGFzIGJlZW4gYWRkZWQuICBUaGlzIGVuYWJsZXMgdGhlCiAgY3JlYXRpb24gb2YgInByb3BlcnRpZXMiLiAgVGhlc2UgYXJlIGF0dHJpYnV0ZXMgaW1wbGVtZW50ZWQgYnkKICBnZXR0ZXIgYW5kIHNldHRlciBmdW5jdGlvbnMgKG9yIG9ubHkgb25lIG9mIHRoZXNlIGZvciByZWFkLW9ubHkgb3IKICB3cml0ZS1vbmx5IGF0dHJpYnV0ZXMpLCB3aXRob3V0IHRoZSBuZWVkIHRvIG92ZXJyaWRlIF9fZ2V0YXR0cl9fLgogIFNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yL2Rlc2NyaW50cm8uaHRtbCNwcm9wZXJ0eQoKLSBUaGUgc3ludGF4IG9mIGZsb2F0aW5nLXBvaW50IGFuZCBpbWFnaW5hcnkgbGl0ZXJhbHMgaGFzIGJlZW4KICBsaWJlcmFsaXplZCwgdG8gYWxsb3cgbGVhZGluZyB6ZXJvZXMuICBFeGFtcGxlcyBvZiBsaXRlcmFscyBub3cKICBsZWdhbCB0aGF0IHdlcmUgU3ludGF4RXJyb3JzIGJlZm9yZToKCiAgICAgIDAwLjAgICAgMGUzICAgMDEwMGogICAwNy41ICAgMDAwMDAwMDAwMDAwMDAwMDAwMDguCgotIEFuIG9sZCB0b2tlbml6ZXIgYnVnIGFsbG93ZWQgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgd2l0aCBhbiBpbmNvbXBsZXRlCiAgZXhwb25lbnQsIHN1Y2ggYXMgMWUgYW5kIDMuMWUtLiAgU3VjaCBsaXRlcmFscyBub3cgcmFpc2UgU3ludGF4RXJyb3IuCgpMaWJyYXJ5CgotIHRlbG5ldGxpYiBpbmNsdWRlcyBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIG9wdGlvbnMsIGFuZCBzdXBwb3J0IGZvcgogIHNldHRpbmcgYW4gb3B0aW9uIG5lZ290aWF0aW9uIGNhbGxiYWNrLgoKLSBUaGUgbmV3IEMgc3RhbmRhcmQgbm8gbG9uZ2VyIHJlcXVpcmVzIHRoYXQgbWF0aCBsaWJyYXJpZXMgc2V0IGVycm5vIHRvCiAgRVJBTkdFIG9uIG92ZXJmbG93LiAgRm9yIHBsYXRmb3JtIGxpYnJhcmllcyB0aGF0IGV4cGxvaXQgdGhpcyBuZXcKICBmcmVlZG9tLCBQeXRob24ncyBvdmVyZmxvdy1jaGVja2luZyB3YXMgd2hvbGx5IGJyb2tlbi4gIEEgbmV3IG92ZXJmbG93LQogIGNoZWNraW5nIHNjaGVtZSBhdHRlbXB0cyB0byByZXBhaXIgdGhhdCwgYnV0IG1heSBub3QgYmUgcmVsaWFibGUgb24gYWxsCiAgcGxhdGZvcm1zIChDIGRvZXNuJ3Qgc2VlbSB0byBwcm92aWRlIGFueXRoaW5nIGJvdGggdXNlZnVsIGFuZCBwb3J0YWJsZQogIGluIHRoaXMgYXJlYSBhbnltb3JlKS4KCi0gQXN5bmNocm9ub3VzIHRpbWVvdXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIG5ldyBjbGFzcwogIHRocmVhZGluZy5UaW1lci4KCi0gbWF0aC5sb2cgYW5kIG1hdGgubG9nMTAgbm93IHJldHVybiBzZW5zaWJsZSByZXN1bHRzIGZvciBldmVuIGh1Z2UKICBsb25nIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlLCBtYXRoLmxvZzEwKDEwICoqIDEwMDAwKSB+PSAxMDAwMC4wLgoKLSBBIG5ldyBmdW5jdGlvbiwgaW1wLmxvY2tfaGVsZCgpLCByZXR1cm5zIDEgd2hlbiB0aGUgaW1wb3J0IGxvY2sgaXMKICBjdXJyZW50bHkgaGVsZC4gIFNlZSB0aGUgZG9jcyBmb3IgdGhlIGltcCBtb2R1bGUuCgotIHBpY2tsZSwgY1BpY2tsZSBhbmQgbWFyc2hhbCBvbiAzMi1iaXQgcGxhdGZvcm1zIGNhbiBub3cgY29ycmVjdGx5IHJlYWQKICBkdW1wcyBjb250YWluaW5nIGludHMgd3JpdHRlbiBvbiBwbGF0Zm9ybXMgd2hlcmUgUHl0aG9uIGludHMgYXJlIDggYnl0ZXMuCiAgV2hlbiByZWFkIG9uIGEgYm94IHdoZXJlIFB5dGhvbiBpbnRzIGFyZSA0IGJ5dGVzLCBzdWNoIHZhbHVlcyBhcmUKICBjb252ZXJ0ZWQgdG8gUHl0aG9uIGxvbmdzLgoKLSBJbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlICh1c2luZyB0aGUgcmV4ZWMgbW9kdWxlKSwgdW5tYXJzaGFsbGluZwogIGNvZGUgb2JqZWN0cyBpcyBubyBsb25nZXIgYWxsb3dlZC4gIFRoaXMgcGx1Z3MgYSBzZWN1cml0eSBob2xlLgoKLSB1bml0dGVzdC5UZXN0UmVzdWx0IGluc3RhbmNlcyBubyBsb25nZXIgc3RvcmUgcmVmZXJlbmNlcyB0byB0cmFjZWJhY2tzCiAgZ2VuZXJhdGVkIGJ5IHRlc3QgZmFpbHVyZXMuIFRoaXMgcHJldmVudHMgdW5leHBlY3RlZCBkYW5nbGluZyByZWZlcmVuY2VzCiAgdG8gb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBnYXJiYWdlIGNvbGxlY3RlZCBiZXR3ZWVuIHRlc3RzLgoKVG9vbHMKCi0gVG9vbHMvc2NyaXB0cy9maXhkaXYucHkgaGFzIGJlZW4gYWRkZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZml4CiAgZGl2aXNpb24gb3BlcmF0b3JzIGFzIHBlciBQRVAgMjM4LgoKQnVpbGQKCi0gSWYgeW91IGFyZSBhbiBhZHZlbnR1cm91cyBwZXJzb24gdXNpbmcgTWFjIE9TIFggeW91IG1heSB3YW50IHRvIGxvb2sgYXQKICBNYWMvT1NYLiBUaGVyZSBpcyBhIE1ha2VmaWxlIHRoZXJlIHRoYXQgd2lsbCBidWlsZCBQeXRob24gYXMgYSByZWFsIE1hYwogIGFwcGxpY2F0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZXhwZXJpbWVudGluZyB3aXRoIENhcmJvbiBvciBDb2NvYS4KICBEaXNjdXNzaW9uIG9mIHRoaXMgb24gcHl0aG9ubWFjLXNpZywgcGxlYXNlLgoKQyBBUEkKCi0gTmV3IGZ1bmN0aW9uIFB5T2JqZWN0X0RpcihvYmopLCBsaWtlIFB5dGhvbiBfX2J1aWx0aW5fXy5kaXIob2JqKS4KCi0gTm90ZSB0aGF0IFB5TG9uZ19Bc0RvdWJsZSBjYW4gZmFpbCEgIFRoaXMgaGFzIGFsd2F5cyBiZWVuIHRydWUsIGJ1dCBubwogIGNhbGxlcnMgY2hlY2tlZCBmb3IgaXQuICBJdCdzIG1vcmUgbGlrZWx5IHRvIGZhaWwgbm93LCBiZWNhdXNlIG92ZXJmbG93CiAgZXJyb3JzIGFyZSBwcm9wZXJseSBkZXRlY3RlZCBub3cuICBUaGUgcHJvcGVyIHdheSB0byBjaGVjazoKCiAgZG91YmxlIHggPSBQeUxvbmdfQXNEb3VibGUoc29tZV9sb25nX29iamVjdCk7CiAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAvKiBUaGUgY29udmVyc2lvbiBmYWlsZWQuICovCiAgfQoKLSBUaGUgR0MgQVBJIGhhcyBiZWVuIGNoYW5nZWQuICBFeHRlbnNpb25zIHRoYXQgdXNlIHRoZSBvbGQgQVBJIHdpbGwgc3RpbGwKICBjb21waWxlIGJ1dCB3aWxsIG5vdCBwYXJ0aWNpcGF0ZSBpbiBHQy4gIFRvIHVwZ3JhZGUgYW4gZXh0ZW5zaW9uCiAgbW9kdWxlOgoKICAgIC0gcmVuYW1lIFB5X1RQRkxBR1NfR0MgdG8gUHlUUEZMQUdTX0hBVkVfR0MKCiAgICAtIHVzZSBQeU9iamVjdF9HQ19OZXcgb3IgUHlPYmplY3RfR0NfTmV3VmFyIHRvIGFsbG9jYXRlIG9iamVjdHMgYW5kCiAgICAgIFB5T2JqZWN0X0dDX0RlbCB0byBkZWFsbG9jYXRlIHRoZW0KCiAgICAtIHJlbmFtZSBQeU9iamVjdF9HQ19Jbml0IHRvIFB5T2JqZWN0X0dDX1RyYWNrIGFuZCBQeU9iamVjdF9HQ19GaW5pCiAgICAgIHRvIFB5T2JqZWN0X0dDX1VuVHJhY2sKCiAgICAtIHJlbW92ZSBQeUdDX0hFQURfU0laRSBmcm9tIG9iamVjdCBzaXplIGNhbGN1bGF0aW9ucwoKICAgIC0gcmVtb3ZlIGNhbGxzIHRvIFB5T2JqZWN0X0FTX0dDIGFuZCBQeU9iamVjdF9GUk9NX0dDCgotIFR3byBuZXcgZnVuY3Rpb25zOiBQeVN0cmluZ19Gcm9tRm9ybWF0KCkgYW5kIFB5U3RyaW5nX0Zyb21Gb3JtYXRWKCkuCiAgVGhlc2UgY2FuIGJlIHVzZWQgc2FmZWx5IHRvIGNvbnN0cnVjdCBzdHJpbmcgb2JqZWN0cyBmcm9tIGEKICBzcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcgKHNpbWlsYXIgdG8gdGhlIGZvcm1hdCBzdHJpbmcgc3VwcG9ydGVkCiAgYnkgUHlFcnJfRm9ybWF0KCkpLgoKTmV3IHBsYXRmb3JtcwoKLSBTdGVwaGVuIEhhbnNlbiBjb250cmlidXRlZCBwYXRjaGVzIHN1ZmZpY2llbnQgdG8gZ2V0IGEgY2xlYW4gY29tcGlsZQogIHVuZGVyIEJvcmxhbmQgQyAoV2luZG93cyksIGJ1dCBoZSByZXBvcnRzIHByb2JsZW1zIHJ1bm5pbmcgaXQgYW5kIHJhbgogIG91dCBvZiB0aW1lIHRvIGNvbXBsZXRlIHRoZSBwb3J0LiAgVm9sdW50ZWVycz8gIEV4cGVjdCBhIE1lbW9yeUVycm9yCiAgd2hlbiBpbXBvcnRpbmcgdGhlIHR5cGVzIG1vZHVsZTsgdGhpcyBpcyBwcm9iYWJseSBzaGFsbG93LCBhbmQKICBjYXVzaW5nIGxhdGVyIGZhaWx1cmVzIHRvby4KClRlc3RzCgpXaW5kb3dzCgotIExhcmdlIGZpbGUgc3VwcG9ydCBpcyBub3cgZW5hYmxlZCBvbiBXaW4zMiBwbGF0Zm9ybXMgYXMgd2VsbCBhcyBvbgogIFdpbjY0LiAgVGhpcyBtZWFucyB0aGF0LCBmb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgZi50ZWxsKCkgYW5kIGYuc2VlaygpCiAgdG8gbWFuaXB1bGF0ZSBmaWxlcyBsYXJnZXIgdGhhbiAyIGdpZ2FieXRlcyAocHJvdmlkZWQgeW91IGhhdmUgZW5vdWdoCiAgZGlzayBzcGFjZSwgYW5kIGFyZSB1c2luZyBhIFdpbmRvd3MgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIGxhcmdlCiAgcGFydGl0aW9ucykuICBXaW5kb3dzIGZpbGVzeXN0ZW0gbGltaXRzOiAgRkFUIGhhcyBhIDJHQiAoZ2lnYWJ5dGUpCiAgZmlsZXNpemUgbGltaXQsIGFuZCBsYXJnZSBmaWxlIHN1cHBvcnQgbWFrZXMgbm8gZGlmZmVyZW5jZSB0aGVyZS4KICBGQVQzMidzIGxpbWl0IGlzIDRHQiwgYW5kIGZpbGVzID49IDJHQiBhcmUgZWFzaWVyIHRvIHVzZSBmcm9tIFB5dGhvbiBub3cuCiAgTlRGUyBoYXMgbm8gcHJhY3RpY2FsIGxpbWl0IG9uIGZpbGUgc2l6ZSwgYW5kIGZpbGVzIG9mIGFueSBzaXplIGNhbiBiZQogIHVzZWQgZnJvbSBQeXRob24gbm93LgoKLSBUaGUgdzl4cG9wZW4gaGFjayBpcyBub3cgdXNlZCBvbiBXaW5kb3dzIE5UIGFuZCAyMDAwIHRvbyB3aGVuIENPTVBTUEVDCiAgcG9pbnRzIHRvIGNvbW1hbmQuY29tIChwYXRjaCBmcm9tIEJyaWFuIFF1aW5sYW4pLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmEyPwpSZWxlYXNlIERhdGU6IDIyLUF1Zy0yMDAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQnVpbGQKCi0gVGltIFBldGVycyBkZXZlbG9wZWQgYSBicmFuZCBuZXcgV2luZG93cyBpbnN0YWxsZXIgdXNpbmcgV2lzZSA4LjEsCiAgZ2VuZXJvdXNseSBkb25hdGVkIHRvIHVzIGJ5IFdpc2UgU29sdXRpb25zLgoKLSBjb25maWd1cmUgc3VwcG9ydHMgYSBuZXcgb3B0aW9uIC0tZW5hYmxlLXVuaWNvZGUsIHdpdGggdGhlIHZhbHVlcwogIHVjczIgYW5kIHVjczQgKG5ldyBpbiAyLjJhMSkuIFdpdGggLS1kaXNhYmxlLXVuaWNvZGUsIHRoZSBVbmljb2RlCiAgdHlwZSBhbmQgc3VwcG9ydGluZyBjb2RlIGlzIGNvbXBsZXRlbHkgcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcnByZXRlci4KCi0gQSBuZXcgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1mcmFtZXdvcmsgYnVpbGRzIGEgTWFjIE9TIFggZnJhbWV3b3JrLAogIHdoaWNoICJtYWtlIGZyYW1ld29ya2luc3RhbGwiIHdpbGwgaW5zdGFsbC4gVGhpcyBwcm92aWRlcyBhIHN0YXJ0aW5nCiAgcG9pbnQgZm9yIG1vcmUgbWFjLWxpa2UgZnVuY3Rpb25hbGl0eSwgam9pbiBweXRob25tYWMtc2lnQHB5dGhvbi5vcmcKICBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gaGVscGluZy4KCi0gVGhlIE5lWFQgcGxhdGZvcm0gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KCi0gVGhlIGBuZXcnIG1vZHVsZSBpcyBub3cgc3RhdGljYWxseSBsaW5rZWQuCgpUb29scwoKLSBUaGUgbmV3IFRvb2xzL3NjcmlwdHMvY2xlYW5mdXR1cmUucHkgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseQogIGVkaXQgb3V0IG9ic29sZXRlIGZ1dHVyZSBzdGF0ZW1lbnRzIGZyb20gUHl0aG9uIHNvdXJjZSBjb2RlLiAgU2VlCiAgdGhlIG1vZHVsZSBkb2NzdHJpbmcgZm9yIGRldGFpbHMuCgpUZXN0cwoKLSByZWdydGVzdC5weSBub3cga25vd3Mgd2hpY2ggdGVzdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHNraXBwZWQgb24gc29tZQogIHBsYXRmb3JtcywgYWxsb3dpbmcgdG8gZ2l2ZSBjbGVhcmVyIHRlc3QgcmVzdWx0IG91dHB1dC4gIHJlZ3J0ZXN0CiAgYWxzbyBoYXMgb3B0aW9uYWwgLS11c2UvLXUgc3dpdGNoIHRvIHJ1biBub3JtYWxseSBkaXNhYmxlZCB0ZXN0cwogIHdoaWNoIHJlcXVpcmUgbmV0d29yayBhY2Nlc3Mgb3IgY29uc3VtZSBzaWduaWZpY2FudCBkaXNrIHJlc291cmNlcy4KCi0gU2V2ZXJhbCBuZXcgdGVzdHMgaW4gdGhlIHN0YW5kYXJkIHRlc3Qgc3VpdGUsIHdpdGggc3BlY2lhbCB0aGFua3MgdG8KICBOaWNrIE1hdGhld3Nvbi4KCkNvcmUKCi0gVGhlIGZsb29yIGRpdmlzaW9uIG9wZXJhdG9yIC8vIGhhcyBiZWVuIGFkZGVkIGFzIG91dGxpbmVkIGluIFBFUAogIDIzOC4gIFRoZSAvIG9wZXJhdG9yIHN0aWxsIHByb3ZpZGVzIGNsYXNzaWMgZGl2aXNpb24gKGFuZCB3aWxsIHVudGlsCiAgUHl0aG9uIDMuMCkgdW5sZXNzICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uIiBpcyBpbmNsdWRlZCwgaW4KICB3aGljaCBjYXNlIHRoZSAvIG9wZXJhdG9yIHdpbGwgcHJvdmlkZSB0cnVlIGRpdmlzaW9uLiAgVGhlIG9wZXJhdG9yCiAgbW9kdWxlIHByb3ZpZGVzIHRydWVkaXYoKSBhbmQgZmxvb3JkaXYoKSBmdW5jdGlvbnMuICBBdWdtZW50ZWQKICBhc3NpZ25tZW50IHZhcmlhbnRzIGFyZSBpbmNsdWRlZCwgYXMgYXJlIHRoZSBlcXVpdmFsZW50IG92ZXJsb2FkYWJsZQogIG1ldGhvZHMgYW5kIEMgQVBJIG1ldGhvZHMuICBTZWUgdGhlIFBFUCBmb3IgYSBmdWxsIGRpc2N1c3Npb246CiAgPGh0dHA6Ly9weXRob24uc2YubmV0L3BlcHMvcGVwLTAyMzguaHRtbD4KCi0gRnV0dXJlIHN0YXRlbWVudHMgYXJlIG5vdyBlZmZlY3RpdmUgaW4gc2ltdWxhdGVkIGludGVyYWN0aXZlIHNoZWxscwogIChsaWtlIElETEUpLiAgVGhpcyBzaG91bGQgImp1c3Qgd29yayIgYnkgbWFnaWMsIGJ1dCByZWFkIE1pY2hhZWwKICBIdWRzb24ncyAiRnV0dXJlIHN0YXRlbWVudHMgaW4gc2ltdWxhdGVkIHNoZWxscyIgUEVQIDI2NCBmb3IgZnVsbAogIGRldGFpbHM6ICA8aHR0cDovL3B5dGhvbi5zZi5uZXQvcGVwcy9wZXAtMDI2NC5odG1sPi4KCi0gVGhlIHR5cGUvY2xhc3MgdW5pZmljYXRpb24gKFBFUCAyNTItMjUzKSB3YXMgaW50ZWdyYXRlZCBpbnRvIHRoZQogIHRydW5rIGFuZCBpcyBub3Qgc28gdGVudGF0aXZlIGFueSBtb3JlICh0aGUgZXhhY3Qgc3BlY2lmaWNhdGlvbiBvZgogIHNvbWUgZmVhdHVyZXMgaXMgc3RpbGwgdGVudGF0aXZlKS4gIEEgbG90IG9mIHdvcmsgaGFzIGRvbmUgb24gZml4aW5nCiAgYnVncyBhbmQgYWRkaW5nIHJvYnVzdG5lc3MgYW5kIGZlYXR1cmVzIChwZXJmb3JtYW5jZSBzdGlsbCBoYXMgdG8KICBjb21lIGEgbG9uZyB3YXkpLgoKLSBXYXJuaW5ncyBhYm91dCBhIG1pc21hdGNoIGluIHRoZSBQeXRob24gQVBJIGR1cmluZyBleHRlbnNpb24gaW1wb3J0CiAgbm93IHVzZSB0aGUgUHl0aG9uIHdhcm5pbmcgZnJhbWV3b3JrICh3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0bwogIHdyaXRlIGZpbHRlcnMgZm9yIHRoZXNlIHdhcm5pbmdzKS4KCi0gQSBmdW5jdGlvbidzIF9fZGljdF9fIChha2EgZnVuY19kaWN0KSB3aWxsIG5vdyBhbHdheXMgYmUgYQogIGRpY3Rpb25hcnkuICBJdCB1c2VkIHRvIGJlIHBvc3NpYmxlIHRvIGRlbGV0ZSBpdCBvciBzZXQgaXQgdG8gTm9uZSwKICBidXQgbm93IGJvdGggYWN0aW9ucyByYWlzZSBUeXBlRXJyb3JzLiAgSXQgaXMgc3RpbGwgbGVnYWwgdG8gc2V0IGl0CiAgdG8gYSBkaWN0aW9uYXJ5IG9iamVjdC4gIEdldHRpbmcgZnVuYy5fX2RpY3RfXyBiZWZvcmUgYW55IGF0dHJpYnV0ZXMKICBoYXZlIGJlZW4gYXNzaWduZWQgbm93IHJldHVybnMgYW4gZW1wdHkgZGljdGlvbmFyeSBpbnN0ZWFkIG9mIE5vbmUuCgotIEEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24sIC1FLCB3YXMgYWRkZWQgd2hpY2ggZGlzYWJsZXMgdGhlIHVzZSBvZgogIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIG9yIGF0IGxlYXN0IHRob3NlIHRoYXQgYXJlIHNwZWNpZmljYWxseQogIHNpZ25pZmljYW50IHRvIFB5dGhvbi4gIFVzdWFsbHkgdGhvc2UgaGF2ZSBhIG5hbWUgc3RhcnRpbmcgd2l0aAogICJQWVRIT04iLiAgVGhpcyB3YXMgdXNlZCB0byBmaXggYSBwcm9ibGVtIHdoZXJlIHRoZSB0ZXN0cyBmYWlsIGlmCiAgdGhlIHVzZXIgaGFwcGVucyB0byBoYXZlIFBZVEhPTkhPTUUgb3IgUFlUSE9OUEFUSCBwb2ludGluZyB0byBhbgogIG9sZGVyIGRpc3RyaWJ1dGlvbi4KCkxpYnJhcnkKCi0gTmV3IGNsYXNzIERpZmZlciBhbmQgbmV3IGZ1bmN0aW9ucyBuZGlmZigpIGFuZCByZXN0b3JlKCkgaW4gZGlmZmxpYi5weS4KICBUaGVzZSBwYWNrYWdlIHRoZSBhbGdvcml0aG1zIHVzZWQgYnkgdGhlIHBvcHVsYXIgVG9vbHMvc2NyaXB0cy9uZGlmZi5weSwKICBmb3IgcHJvZ3JhbW1hdGljIHJldXNlLgoKLSBOZXcgZnVuY3Rpb24geG1sLnNheC5zYXh1dGlscy5xdW90ZWF0dHIoKTogIFF1b3RlIGFuIFhNTCBhdHRyaWJ1dGUKICB2YWx1ZSB1c2luZyB0aGUgbWluaW1hbCBxdW90aW5nIHJlcXVpcmVkIGZvciB0aGUgdmFsdWU7IG1vcmUKICByZWxpYWJsZSB0aGFuIHVzaW5nIHhtbC5zYXguc2F4dXRpbHMuZXNjYXBlKCkgZm9yIGF0dHJpYnV0ZSB2YWx1ZXMuCgotIFJlYWRsaW5lIGNvbXBsZXRpb24gc3VwcG9ydCBmb3IgY21kLkNtZCB3YXMgYWRkZWQuCgotIENhbGxpbmcgb3MudGVtcG5hbSgpIG9yIG9zLnRtcG5hbSgpIGdlbmVyYXRlIFJ1bnRpbWVXYXJuaW5ncy4KCi0gQWRkZWQgZnVuY3Rpb24gdGhyZWFkaW5nLkJvdW5kZWRTZW1hcGhvcmUoKQoKLSBBZGRlZCBLYS1QaW5nIFllZSdzIGNnaXRiLnB5IG1vZHVsZS4KCi0gVGhlIGBuZXcnIG1vZHVsZSBub3cgZXhwb3NlcyB0aGUgQ09feHh4IGZsYWdzLgoKLSBUaGUgZ2MgbW9kdWxlIG9mZmVycyB0aGUgZ2V0X3JlZmVyZW50cyBmdW5jdGlvbi4KCk5ldyBwbGF0Zm9ybXMKCkMgQVBJCgotIFR3byBuZXcgQVBJcyBQeU9TX3NucHJpbnRmKCkgYW5kIFB5T1NfdnNucHJpbnRmKCkgd2VyZSBhZGRlZAogIHdoaWNoIHByb3ZpZGUgYSBjcm9zcy1wbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZQogIHJlbGF0aXZlbHkgbmV3IHNucHJpbnRmKCkvdnNucHJpbnRmKCkgQyBsaWIgQVBJcy4gSW4gY29udHJhc3QgdG8KICB0aGUgc3RhbmRhcmQgc3ByaW50ZigpIGFuZCB2c3ByaW50ZigpIEMgbGliIEFQSXMsIHRoZXNlIHZlcnNpb25zCiAgYXBwbHkgYm91bmRzIGNoZWNraW5nIG9uIHRoZSB1c2VkIGJ1ZmZlciB3aGljaCBlbmhhbmNlcyBwcm90ZWN0aW9uCiAgYWdhaW5zdCBidWZmZXIgb3ZlcnJ1bnMuCgotIFVuaWNvZGUgQVBJcyBub3cgdXNlIG5hbWUgbWFuZ2xpbmcgdG8gYXNzdXJlIHRoYXQgbWl4aW5nIGludGVycHJldGVycwogIGFuZCBleHRlbnNpb25zIHVzaW5nIGRpZmZlcmVudCBVbmljb2RlIHdpZHRocyBpcyByZW5kZXJlZCBuZXh0IHRvCiAgaW1wb3NzaWJsZS4gVHJ5aW5nIHRvIGltcG9ydCBhbiBpbmNvbXBhdGlibGUgVW5pY29kZS1hd2FyZSBleHRlbnNpb24KICB3aWxsIHJlc3VsdCBpbiBhbiBJbXBvcnRFcnJvci4gIFVuaWNvZGUgZXh0ZW5zaW9ucyB3cml0ZXJzIG11c3QgbWFrZQogIHN1cmUgdG8gY2hlY2sgdGhlIFVuaWNvZGUgd2lkdGggY29tcGF0aWJpbGl0eSBpbiB0aGVpciBleHRlbnNpb25zIGJ5CiAgdXNpbmcgYXQgbGVhc3Qgb25lIG9mIHRoZSBtYW5nbGVkIFVuaWNvZGUgQVBJcyBpbiB0aGUgZXh0ZW5zaW9uLgoKLSBUd28gbmV3IGZsYWdzIE1FVEhfTk9BUkdTIGFuZCBNRVRIX08gYXJlIGF2YWlsYWJsZSBpbiBtZXRob2QgZGVmaW5pdGlvbgogIHRhYmxlcyB0byBzaW1wbGlmeSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIHdpdGggbm8gYXJndW1lbnRzIGFuZCBhCiAgc2luZ2xlIHVudHlwZWQgYXJndW1lbnQuIENhbGxpbmcgc3VjaCBtZXRob2RzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KICBjYWxsaW5nIGNvcnJlc3BvbmRpbmcgTUVUSF9WQVJBUkdTIG1ldGhvZHMuIE1FVEhfT0xEQVJHUyBpcyBub3cKICBkZXByZWNhdGVkLgoKV2luZG93cwoKLSAiaW1wb3J0IG1vZHVsZSIgbm93IGNvbXBpbGVzIG1vZHVsZS5weXcgaWYgaXQgZXhpc3RzIGFuZCBub3RoaW5nIGVsc2UKICByZWxldmFudCBpcyBmb3VuZC4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJhMT8KUmVsZWFzZSBkYXRlOiAxOC1KdWwtMjAwMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUKCi0gVEVOVEFUSVZFTFksIGEgbGFyZ2UgYW1vdW50IG9mIGNvZGUgaW1wbGVtZW50aW5nIG11Y2ggb2Ygd2hhdCdzCiAgZGVzY3JpYmVkIGluIFBFUCAyNTIgKE1ha2luZyBUeXBlcyBMb29rIE1vcmUgTGlrZSBDbGFzc2VzKSBhbmQgUEVQCiAgMjUzIChTdWJ0eXBpbmcgQnVpbHQtaW4gVHlwZXMpIHdhcyBhZGRlZC4gIFRoaXMgd2lsbCBiZSByZWxlYXNlZAogIHdpdGggUHl0aG9uIDIuMmExLiAgRG9jdW1lbnRhdGlvbiB3aWxsIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkKICB0aHJvdWdoIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvLiAgVGhlIHB1cnBvc2Ugb2YgcmVsZWFzaW5nIHRoaXMKICB3aXRoIFB5dGhvbiAyLjJhMSBpcyB0byB0ZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgSXQgaXMKICBwb3NzaWJsZSwgdGhvdWdoIG5vdCBsaWtlbHksIHRoYXQgYSBkZWNpc2lvbiBpcyBtYWRlIG5vdCB0byByZWxlYXNlCiAgdGhpcyBjb2RlIGFzIHBhcnQgb2YgMi4yIGZpbmFsLCBpZiBhbnkgc2VyaW91cyBiYWNrd2FyZHMKICBpbmNvbXBhcGF0aWJpbGl0aWVzIGFyZSBmb3VuZCBkdXJpbmcgYWxwaGEgdGVzdGluZyB0aGF0IGNhbm5vdCBiZQogIHJlcGFpcmVkLgoKLSBHZW5lcmF0b3JzIHdlcmUgYWRkZWQ7IHRoaXMgaXMgYSBuZXcgd2F5IHRvIGNyZWF0ZSBhbiBpdGVyYXRvciAoc2VlCiAgYmVsb3cpIHVzaW5nIHdoYXQgbG9va3MgbGlrZSBhIHNpbXBsZSBmdW5jdGlvbiBjb250YWluaW5nIG9uZSBvcgogIG1vcmUgJ3lpZWxkJyBzdGF0ZW1lbnRzLiAgU2VlIFBFUCAyNTUuICBTaW5jZSB0aGlzIGFkZHMgYSBuZXcKICBrZXl3b3JkIHRvIHRoZSBsYW5ndWFnZSwgdGhpcyBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCBieSBpbmNsdWRpbmcgYQogIGZ1dHVyZSBzdGF0ZW1lbnQ6ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMiIChzZWUgUEVQIDIzNikuCiAgR2VuZXJhdG9ycyB3aWxsIGJlY29tZSBhIHN0YW5kYXJkIGZlYXR1cmUgaW4gYSBmdXR1cmUgcmVsZWFzZQogIChwcm9iYWJseSAyLjMpLiAgV2l0aG91dCB0aGlzIGZ1dHVyZSBzdGF0ZW1lbnQsICd5aWVsZCcgcmVtYWlucyBhbgogIG9yZGluYXJ5IGlkZW50aWZpZXIsIGJ1dCBhIHdhcm5pbmcgaXMgaXNzdWVkIGVhY2ggdGltZSBpdCBpcyB1c2VkLgogIChUaGVzZSB3YXJuaW5ncyBjdXJyZW50bHkgZG9uJ3QgY29uZm9ybSB0byB0aGUgd2FybmluZ3MgZnJhbWV3b3JrIG9mCiAgUEVQIDIzMDsgd2UgaW50ZW5kIHRvIGZpeCB0aGlzIGluIDIuMmEyLikKCi0gVGhlIFVURi0xNiBjb2RlYyB3YXMgbW9kaWZpZWQgdG8gYmUgbW9yZSBSRkMgY29tcGxpYW50LiBJdCB3aWxsIG5vdwogIG9ubHkgcmVtb3ZlIEJPTSBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nIGFuZCB0aGVuCiAgb25seSBpZiBydW5uaW5nIGluIG5hdGl2ZSBtb2RlIChVVEYtMTYtTEUgYW5kIC1CRSB3b24ndCByZW1vdmUgYQogIGxlYWRpbmcgQk1PIGNoYXJhY3RlcikuCgotIFN0cmluZ3Mgbm93IGhhdmUgYSBuZXcgbWV0aG9kIC5kZWNvZGUoKSB0byBjb21wbGVtZW50IHRoZSBhbHJlYWR5CiAgZXhpc3RpbmcgLmVuY29kZSgpIG1ldGhvZC4gVGhlc2UgdHdvIG1ldGhvZHMgcHJvdmlkZSBkaXJlY3QgYWNjZXNzCiAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGVjb2RlcnMgYW5kIGVuY29kZXJzIG9mIHRoZSByZWdpc3RlcmVkIGNvZGVjcy4KCiAgVG8gZW5oYW5jZSB0aGUgdXNhYmlsaXR5IG9mIHRoZSAuZW5jb2RlKCkgbWV0aG9kLCB0aGUgc3BlY2lhbAogIGNhc2luZyBvZiBVbmljb2RlIG9iamVjdCByZXR1cm4gdmFsdWVzIHdhcyBkcm9wcGVkIChVbmljb2RlIG9iamVjdHMKICB3ZXJlIGF1dG8tbWFnaWNhbGx5IGNvbnZlcnRlZCB0byBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgoKICBCb3RoIG1ldGhvZHMgd2lsbCBub3cgcmV0dXJuIHdoYXRldmVyIHRoZSBjb2RlYyBpbiBjaGFyZ2Ugb2YgdGhlCiAgcmVxdWVzdGVkIGVuY29kaW5nIHJldHVybnMgYXMgb2JqZWN0LCBlLmcuIFVuaWNvZGUgY29kZWNzIHdpbGwKICByZXR1cm4gVW5pY29kZSBvYmplY3RzIHdoZW4gZGVjb2RpbmcgaXMgcmVxdWVzdGVkICgi5Pb8Ii5kZWNvZGUoImxhdGluLTEiKQogIHdpbGwgcmV0dXJuIHUi5Pb8IikuIFRoaXMgZW5hYmxlcyBjb2RlYyB3cml0ZXIgdG8gY3JlYXRlIGNvZGVjcwogIGZvciB2YXJpb3VzIHNpbXBsZSB0byB1c2UgY29udmVyc2lvbnMuCgogIE5ldyBjb2RlY3Mgd2VyZSBhZGRlZCB0byBkZW1vbnN0cmF0ZSB0aGVzZSBuZXcgZmVhdHVyZXMgKHRoZSAuZW5jb2RlKCkKICBhbmQgLmRlY29kZSgpIGNvbHVtbnMgaW5kaWNhdGUgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIG9iamVjdHMpOgoKICBOYW1lICAgICB8IC5lbmNvZGUoKSB8IC5kZWNvZGUoKSB8IERlc2NyaXB0aW9uCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHV1ICAgICAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgVVUgY29kZWMgKGUuZy4gZm9yIGVtYWlsKQogIGJhc2U2NCAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgYmFzZTY0IGNvZGVjCiAgcXVvcHJpICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBxdW90ZWQtcHJpbnRhYmxlIGNvZGVjCiAgemxpYiAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCB6bGliIGNvbXByZXNzaW9uCiAgaGV4ICAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCAyLWJ5dGUgaGV4IGNvZGVjCiAgcm90LTEzICAgfCBzdHJpbmcgICAgfCBVbmljb2RlICAgfCBST1QtMTMgVW5pY29kZSBjaGFybWFwIGNvZGVjCgotIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgbm93IHN1cHBvcnQgdGhlIGNvbmNlcHQgb2YgYSBkZWZhdWx0IFVuaWNvZGUKICBlbmNvZGluZyBmb3IgZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4gIE5vdGFibHksIFdpbmRvd3Mgc3VwcG9ydHMgJ21iY3MnCiAgYXMgdGhlIGRlZmF1bHQuICBUaGUgTWFjaW50b3NoIHdpbGwgYWxzbyBhZG9wdCB0aGlzIGNvbmNlcHQgaW4gdGhlIG1lZGl1bQogIHRlcm0sIGFsdGhvdWdoIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGF0IHBsYXRmb3JtIHdpbGwgYmUgb3RoZXIgdGhhbgogICdtYmNzJy4KCiAgT24gb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHN1cHBvcnQgbm9uLUFTQ0lJIGZpbGVuYW1lcywgaXQgaXMgY29tbW9uIGZvcgogIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBmaWxlbmFtZXMgKHN1Y2ggYXMgb3MubGlzdGRpcigpKSB0byByZXR1cm4gUHl0aG9uCiAgc3RyaW5nIG9iamVjdHMgcHJlLWVuY29kZWQgdXNpbmcgdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgZm9yCiAgdGhlIHBsYXRmb3JtLiAgQXMgdGhpcyBlbmNvZGluZyBpcyBsaWtlbHkgdG8gYmUgZGlmZmVyZW50IGZyb20gUHl0aG9uJ3MKICBkZWZhdWx0IGVuY29kaW5nLCBjb252ZXJ0aW5nIHRoaXMgbmFtZSB0byBhIFVuaWNvZGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nCiAgaXQgYmFjayB0byB0aGUgT3BlcmF0aW5nIFN5c3RlbSB3b3VsZCByZXN1bHQgaW4gYSBVbmljb2RlIGVycm9yLCBhcyBQeXRob24KICB3b3VsZCBhdHRlbXB0IHRvIHVzZSBpdHMgZGVmYXVsdCBlbmNvZGluZyAoZ2VuZXJhbGx5IEFTQ0lJKSByYXRoZXIgdGhhbgogIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgZmlsZSBzeXN0ZW0uCgogIEluIGdlbmVyYWwsIHRoaXMgY2hhbmdlIHNpbXBseSByZW1vdmVzIHN1cnByaXNlcyB3aGVuIHdvcmtpbmcgd2l0aAogIFVuaWNvZGUgYW5kIHRoZSBmaWxlIHN5c3RlbSwgbWFraW5nIHRoZXNlIG9wZXJhdGlvbnMgd29yayBhcyB5b3UgZXhwZWN0LAogIGluY3JlYXNpbmcgdGhlIHRyYW5zcGFyZW5jeSBvZiBVbmljb2RlIG9iamVjdHMgaW4gdGhpcyBjb250ZXh0LgogIFNlZSBbPz8/P10gZm9yIG1vcmUgZGV0YWlscywgaW5jbHVkaW5nIGV4YW1wbGVzLgoKLSBGbG9hdCAoYW5kIGNvbXBsZXgpIGxpdGVyYWxzIGluIHNvdXJjZSBjb2RlIHdlcmUgZXZhbHVhdGVkIHRvIGZ1bGwKICBwcmVjaXNpb24gb25seSB3aGVuIHJ1bm5pbmcgZnJvbSBhIC5weSBmaWxlOyB0aGUgc2FtZSBjb2RlIGxvYWRlZCBmcm9tIGEKICAucHljIChvciAucHlvKSBmaWxlIGNvdWxkIHN1ZmZlciBudW1lcmljIGRpZmZlcmVuY2VzIHN0YXJ0aW5nIGF0IGFib3V0IHRoZQogIDEydGggc2lnbmlmaWNhbnQgZGVjaW1hbCBkaWdpdC4gIEZvciBleGFtcGxlLCBvbiBhIG1hY2hpbmUgd2l0aCBJRUVFLTc1NAogIGZsb2F0aW5nIGFyaXRobWV0aWMsCgogICAgICB4ID0gOTAwNzE5OTI1NDc0MDk5Mi4wCiAgICAgIHByaW50IGxvbmcoeCkKCiAgcHJpbnRlZCA5MDA3MTk5MjU0NzQwOTkyIGlmIHJ1biBkaXJlY3RseSBmcm9tIC5weSwgYnV0IDkwMDcxOTkyNTQ3NDAwMDAKICBpZiBmcm9tIGEgY29tcGlsZWQgKC5weWMgb3IgLnB5bykgZmlsZS4gIFRoaXMgd2FzIGR1ZSB0byBtYXJzaGFsIHVzaW5nCiAgc3RyKGZsb2F0KSBpbnN0ZWFkIG9mIHJlcHIoZmxvYXQpIHdoZW4gYnVpbGRpbmcgY29kZSBvYmplY3RzLiAgbWFyc2hhbAogIG5vdyB1c2VzIHJlcHIoZmxvYXQpIGluc3RlYWQsIHdoaWNoIHNob3VsZCByZXByb2R1Y2UgZmxvYXRzIHRvIGZ1bGwKICBtYWNoaW5lIHByZWNpc2lvbiAoYXNzdW1pbmcgdGhlIHBsYXRmb3JtIEMgZmxvYXQ8LT5zdHJpbmcgSS9PIGNvbnZlcnNpb24KICBmdW5jdGlvbnMgYXJlIG9mIGdvb2QgcXVhbGl0eSkuCgogIFRoaXMgbWF5IGNhdXNlIGZsb2F0aW5nLXBvaW50IHJlc3VsdHMgdG8gY2hhbmdlIGluIHNvbWUgY2FzZXMsIGFuZAogIHVzdWFsbHkgZm9yIHRoZSBiZXR0ZXIsIGJ1dCBtYXkgYWxzbyBjYXVzZSBudW1lcmljYWxseSB1bnN0YWJsZQogIGFsZ29yaXRobXMgdG8gYnJlYWsuCgotIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBkaWN0cyBzdWZmZXJzIGZld2VyIGNvbGxpc2lvbnMsIHdoaWNoIGhhcyBzcGVlZAogIGJlbmVmaXRzLiAgSG93ZXZlciwgdGhlIG9yZGVyIGluIHdoaWNoIGRpY3QgZW50cmllcyBhcHBlYXIgaW4gZGljdC5rZXlzKCksCiAgZGljdC52YWx1ZXMoKSBhbmQgZGljdC5pdGVtcygpIG1heSBkaWZmZXIgZnJvbSBwcmV2aW91cyByZWxlYXNlcyBmb3IgYQogIGdpdmVuIGRpY3QuICBOb3RoaW5nIGlzIGRlZmluZWQgYWJvdXQgdGhpcyBvcmRlciwgc28gbm8gcHJvZ3JhbSBzaG91bGQKICByZWx5IG9uIGl0LiAgTmV2ZXJ0aGVsZXNzLCBpdCdzIGVhc3kgdG8gd3JpdGUgdGVzdCBjYXNlcyB0aGF0IHJlbHkgb24gdGhlCiAgb3JkZXIgYnkgYWNjaWRlbnQsIHR5cGljYWxseSBiZWNhdXNlIG9mIHByaW50aW5nIHRoZSBzdHIoKSBvciByZXByKCkgb2YgYQogIGRpY3QgdG8gYW4gImV4cGVjdGVkIHJlc3VsdHMiIGZpbGUuICBTZWUgTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5J3MgbmV3CiAgc29ydGRpY3QoZGljdCkgZnVuY3Rpb24gZm9yIGEgc2ltcGxlIHdheSB0byBkaXNwbGF5IGEgZGljdCBpbiBzb3J0ZWQKICBvcmRlci4KCi0gTWFueSBvdGhlciBzbWFsbCBjaGFuZ2VzIHRvIGRpY3RzIHdlcmUgbWFkZSwgcmVzdWx0aW5nIGluIGZhc3RlcgogIG9wZXJhdGlvbiBhbG9uZyB0aGUgbW9zdCBjb21tb24gY29kZSBwYXRocy4KCi0gRGljdGlvbmFyeSBvYmplY3RzIG5vdyBzdXBwb3J0IHRoZSAiaW4iIG9wZXJhdG9yOiAieCBpbiBkaWN0IiBtZWFucwogIHRoZSBzYW1lIGFzIGRpY3QuaGFzX2tleSh4KS4KCi0gVGhlIHVwZGF0ZSgpIG1ldGhvZCBvZiBkaWN0aW9uYXJpZXMgbm93IGFjY2VwdHMgZ2VuZXJpYyBtYXBwaW5nCiAgb2JqZWN0cy4gIFNwZWNpZmljYWxseSB0aGUgYXJndW1lbnQgb2JqZWN0IG11c3Qgc3VwcG9ydCB0aGUgLmtleXMoKQogIGFuZCBfX2dldGl0ZW1fXygpIG1ldGhvZHMuICBUaGlzIGFsbG93cyB5b3UgdG8gc2F5LCBmb3IgZXhhbXBsZSwKICB7fS51cGRhdGUoVXNlckRpY3QoKSkKCi0gSXRlcmF0b3JzIHdlcmUgYWRkZWQ7IHRoaXMgaXMgYSBnZW5lcmFsaXplZCB3YXkgb2YgcHJvdmlkaW5nIHZhbHVlcwogIHRvIGEgZm9yIGxvb3AuICBTZWUgUEVQIDIzNC4gIFRoZXJlJ3MgYSBuZXcgYnVpbHQtaW4gZnVuY3Rpb24gaXRlcigpCiAgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yLiAgVGhlcmUncyBhIG5ldyBwcm90b2NvbCB0byBnZXQgdGhlIG5leHQgdmFsdWUKICBmcm9tIGFuIGl0ZXJhdG9yIHVzaW5nIHRoZSBuZXh0KCkgbWV0aG9kIChpbiBQeXRob24pIG9yIHRoZQogIHRwX2l0ZXJuZXh0IHNsb3QgKGluIEMpLiAgVGhlcmUncyBhIG5ldyBwcm90b2NvbCB0byBnZXQgaXRlcmF0b3JzCiAgdXNpbmcgdGhlIF9faXRlcl9fKCkgbWV0aG9kIChpbiBQeXRob24pIG9yIHRoZSB0cF9pdGVyIHNsb3QgKGluIEMpLgogIEl0ZXJhdGluZyAoaS5lLiBhIGZvciBsb29wKSBvdmVyIGEgZGljdGlvbmFyeSBnZW5lcmF0ZXMgaXRzIGtleXMuCiAgSXRlcmF0aW5nIG92ZXIgYSBmaWxlIGdlbmVyYXRlcyBpdHMgbGluZXMuCgotIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdlcmUgZ2VuZXJhbGl6ZWQgdG8gd29yayBuaWNlbHkgd2l0aCBpdGVyYXRvcgogIGFyZ3VtZW50czoKICAgIG1hcCgpLCBmaWx0ZXIoKSwgcmVkdWNlKCksIHppcCgpCiAgICBsaXN0KCksIHR1cGxlKCkgKFB5U2VxdWVuY2VfVHVwbGUoKSBhbmQgUHlTZXF1ZW5jZV9GYXN0KCkgaW4gQyBBUEkpCiAgICBtYXgoKSwgbWluKCkKICAgIGpvaW4oKSBtZXRob2Qgb2Ygc3RyaW5ncwogICAgZXh0ZW5kKCkgbWV0aG9kIG9mIGxpc3RzCiAgICAneCBpbiB5JyBhbmQgJ3ggbm90IGluIHknIChQeVNlcXVlbmNlX0NvbnRhaW5zKCkgaW4gQyBBUEkpCiAgICBvcGVyYXRvci5jb3VudE9mKCkgKFB5U2VxdWVuY2VfQ291bnQoKSBpbiBDIEFQSSkKICAgIHJpZ2h0LWhhbmQgc2lkZSBvZiBhc3NpZ25tZW50IHN0YXRlbWVudHMgd2l0aCBtdWx0aXBsZSB0YXJnZXRzLCBzdWNoIGFzCiAgICAgICAgeCwgeSwgeiA9IHNvbWVfaXRlcmFibGVfb2JqZWN0X3JldHVybmluZ19leGFjdGx5XzNfdmFsdWVzCgotIEFjY2Vzc2luZyBtb2R1bGUgYXR0cmlidXRlcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciAoZm9yIGV4YW1wbGUsCiAgcmFuZG9tLnJhbmRvbSBvciBvcy5wYXRoIG9yIHlvdXJQeXRob25Nb2R1bGUueW91ckF0dHJpYnV0ZSkuCgotIENvbXBhcmluZyBkaWN0aW9uYXJ5IG9iamVjdHMgdmlhID09IGFuZCAhPSBpcyBmYXN0ZXIsIGFuZCBub3cgd29ya3MgZXZlbgogIGlmIHRoZSBrZXlzIGFuZCB2YWx1ZXMgZG9uJ3Qgc3VwcG9ydCBjb21wYXJpc29ucyBvdGhlciB0aGFuID09LgoKLSBDb21wYXJpbmcgZGljdGlvbmFyaWVzIGluIHdheXMgb3RoZXIgdGhhbiA9PSBhbmQgIT0gaXMgc2xvd2VyOiAgdGhlcmUgd2VyZQogIGluc2VjdXJpdGllcyBpbiB0aGUgZGljdCBjb21wYXJpc29uIGltcGxlbWVudGF0aW9uIHRoYXQgY291bGQgY2F1c2UgUHl0aG9uCiAgdG8gY3Jhc2ggaWYgdGhlIGVsZW1lbnQgY29tcGFyaXNvbiByb3V0aW5lcyBmb3IgdGhlIGRpY3Qga2V5cyBhbmQvb3IKICB2YWx1ZXMgbXV0YXRlZCB0aGUgZGljdHMuICBNYWtpbmcgdGhlIGNvZGUgYnVsbGV0cHJvb2Ygc2xvd2VkIGl0IGRvd24uCgotIENvbGxpc2lvbnMgaW4gZGljdHMgYXJlIHJlc29sdmVkIHZpYSBhIG5ldyBhcHByb2FjaCwgd2hpY2ggY2FuIGhlbHAKICBkcmFtYXRpY2FsbHkgaW4gYmFkIGNhc2VzLiAgRm9yIGV4YW1wbGUsIGxvb2tpbmcgdXAgZXZlcnkga2V5IGluIGEgZGljdAogIGQgd2l0aCBkLmtleXMoKSA9PSBbaSA8PCAxNiBmb3IgaSBpbiByYW5nZSgyMDAwMCldIGlzIGFwcHJveGltYXRlbHkgNTAweAogIGZhc3RlciBub3cuICBUaGFua3MgdG8gQ2hyaXN0aWFuIFRpc21lciBmb3IgcG9pbnRpbmcgb3V0IHRoZSBjYXVzZSBhbmQKICB0aGUgbmF0dXJlIG9mIGFuIGVmZmVjdGl2ZSBjdXJlIChsYXN0IERlY2VtYmVyISBiZXR0ZXIgbGF0ZSB0aGFuIG5ldmVyKS4KCi0gcmVwcigpIGlzIG11Y2ggZmFzdGVyIGZvciBsYXJnZSBjb250YWluZXJzIChkaWN0LCBsaXN0LCB0dXBsZSkuCgoKTGlicmFyeQoKLSBUaGUgY29uc3RhbnRzIGFzY2lpX2xldHRlcnMsIGFzY2lpX2xvd2VyY2FzZS4gYW5kIGFzY2lpX3VwcGVyY2FzZQogIHdlcmUgYWRkZWQgdG8gdGhlIHN0cmluZyBtb2R1bGUuICBUaGVzZSBhIGxvY2FsZS1pbmRlbnBlbmRlbnQKICBjb25zdGFudHMsIHVubGlrZSBsZXR0ZXJzLCBsb3dlcmNhc2UsIGFuZCB1cHBlcmNhc2UuICBUaGVzZSBhcmUgbm93CiAgdXNlIGluIGFwcHJvcHJpYXRlIGxvY2F0aW9ucyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeS4KCi0gVGhlIGZsYWdzIHVzZWQgaW4gZGxvcGVuIGNhbGxzIGNhbiBub3cgYmUgY29uZmlndXJlZCB1c2luZwogIHN5cy5zZXRkbG9wZW5mbGFncyBhbmQgcXVlcmllZCB1c2luZyBzeXMuZ2V0ZGxvcGVuZmxhZ3MuCgotIEZyZWRyaWsgTHVuZGgncyB4bWxycGNsaWIgaXMgbm93IGEgc3RhbmRhcmQgbGlicmFyeSBtb2R1bGUuICBUaGlzCiAgcHJvdmlkZXMgZnVsbCBjbGllbnQtc2lkZSBYTUwtUlBDIHN1cHBvcnQuICBJbiBhZGRpdGlvbiwKICBEZW1vL3htbHJwYy8gY29udGFpbnMgdHdvIHNlcnZlciBmcmFtZXdvcmtzIChvbmUgU29ja2V0U2VydmVyLWJhc2VkLAogIG9uZSBhc3luY29yZS1iYXNlZCkuICBUaGFua3MgdG8gRXJpYyBSYXltb25kIGZvciB0aGUgZG9jdW1lbnRhdGlvbi4KCi0gVGhlIHhyYW5nZSgpIG9iamVjdCBpcyBzaW1wbGlmaWVkOiBpdCBubyBsb25nZXIgc3VwcG9ydHMgc2xpY2luZywKICByZXBldGl0aW9uLCBjb21wYXJpc29ucywgZWZmaWNpZW50ICdpbicgY2hlY2tpbmcsIHRoZSB0b2xpc3QoKQogIG1ldGhvZCwgb3IgdGhlIHN0YXJ0LCBzdG9wIGFuZCBzdGVwIGF0dHJpYnV0ZXMuICBTZWUgUEVQIDI2MC4KCi0gQSBuZXcgZnVuY3Rpb24gZm5tYXRjaC5maWx0ZXIgdG8gZmlsdGVyIGxpc3RzIG9mIGZpbGUgbmFtZXMgd2FzIGFkZGVkLgoKLSBjYWxlbmRhci5weSB1c2VzIG1vbnRoIGFuZCBkYXkgbmFtZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgoKLSBzdHJvcCBpcyBub3cgKnJlYWxseSogb2Jzb2xldGUgKHRoaXMgd2FzIGFubm91bmNlZCBiZWZvcmUgd2l0aCAxLjYpLAogIGFuZCBpc3N1ZXMgRGVwcmVjYXRpb25XYXJuaW5nIHdoZW4gdXNlZCAoZXhjZXB0IGZvciB0aGUgZm91ciBpdGVtcwogIHRoYXQgYXJlIHN0aWxsIGltcG9ydGVkIGludG8gc3RyaW5nLnB5KS4KCi0gQ29va2llLnB5IG5vdyBzb3J0cyBrZXkrdmFsdWUgcGFpcnMgYnkga2V5IGluIG91dHB1dCBzdHJpbmdzLgoKLSBwcHJpbnQuaXNyZWN1cnNpdmUob2JqZWN0KSBkaWRuJ3QgY29ycmVjdGx5IGlkZW50aWZ5IHJlY3Vyc2l2ZSBvYmplY3RzLgogIE5vdyBpdCBkb2VzLgoKLSBwcHJpbnQgZnVuY3Rpb25zIG5vdyBtdWNoIGZhc3RlciBmb3IgbGFyZ2UgY29udGFpbmVycyAodHVwbGUsIGxpc3QsIGRpY3QpLgoKLSBOZXcgJ3EnIGFuZCAnUScgZm9ybWF0IGNvZGVzIGluIHRoZSBzdHJ1Y3QgbW9kdWxlLCBjb3JyZXNwb25kaW5nIHRvIEMKICB0eXBlcyAibG9uZyBsb25nIiBhbmQgInVuc2lnbmVkIGxvbmcgbG9uZyIgKG9uIFdpbmRvd3MsIF9faW50NjQpLiAgSW4KICBuYXRpdmUgbW9kZSwgdGhlc2UgY2FuIGJlIHVzZWQgb25seSB3aGVuIHRoZSBwbGF0Zm9ybSBDIGNvbXBpbGVyIHN1cHBvcnRzCiAgdGhlc2UgdHlwZXMgKHdoZW4gSEFWRV9MT05HX0xPTkcgaXMgI2RlZmluZSdkIGJ5IHRoZSBQeXRob24gY29uZmlnCiAgcHJvY2VzcyksIGFuZCB0aGVuIHRoZXkgaW5oZXJpdCB0aGUgc2l6ZXMgYW5kIGFsaWdubWVudHMgb2YgdGhlIEMgdHlwZXMuCiAgSW4gc3RhbmRhcmQgbW9kZSwgJ3EnIGFuZCAnUScgYXJlIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBhbmQgYXJlCiAgOC1ieXRlIGludGVncmFsIHR5cGVzLgoKLSBUaGUgc2l0ZSBtb2R1bGUgaW5zdGFsbHMgYSBuZXcgYnVpbHQtaW4gZnVuY3Rpb24gJ2hlbHAnIHRoYXQgaW52b2tlcwogIHB5ZG9jLmhlbHAuICBJdCBtdXN0IGJlIGludm9rZWQgYXMgJ2hlbHAoKSc7IHdoZW4gaW52b2tlZCBhcyAnaGVscCcsCiAgaXQgZGlzcGxheXMgYSBtZXNzYWdlIHJlbWluZGluZyB0aGUgdXNlciB0byB1c2UgJ2hlbHAoKScgb3IKICAnaGVscChvYmplY3QpJy4KClRlc3RzCgotIE5ldyB0ZXN0X211dGFudHMucHkgcnVucyBkaWN0IGNvbXBhcmlzb25zIHdoZXJlIHRoZSBrZXkgYW5kIHZhbHVlCiAgY29tcGFyaXNvbiBvcGVyYXRvcnMgbXV0dXRlIHRoZSBkaWN0cyByYW5kb21seSBkdXJpbmcgY29tcGFyaXNvbi4gIFRoaXMKICByYXBpZGx5IGNhdXNlcyBQeXRob24gdG8gY3Jhc2ggdW5kZXIgZWFybGllciByZWxlYXNlcyAobm90IGZvciB0aGUgZmFpbnQKICBvZiBoZWFydDogIGl0IGNhbiBhbHNvIGNhdXNlIFdpbjl4IHRvIGZyZWV6ZSBvciByZWJvb3QhKS4KCi0gTmV3IHRlc3RfcHByaW50LnB5IHZlcmZpZXMgdGhhdCBwcHJpbnQuaXNyZWN1cnNpdmUoKSBhbmQKICBwcHJpbnQuaXNyZWFkYWJsZSgpIHJldHVybiBzZW5zaWJsZSByZXN1bHRzLiAgQWxzbyB2ZXJpZmllcyB0aGF0IHNpbXBsZQogIGNhc2VzIHByb2R1Y2UgY29ycmVjdCBvdXRwdXQuCgpDIEFQSQoKLSBSZW1vdmVkIHRoZSB1bnVzZWQgbGFzdF9pc19zdGlja3kgYXJndW1lbnQgZnJvbSB0aGUgaW50ZXJuYWwKICBfUHlUdXBsZV9SZXNpemUoKS4gIElmIHRoaXMgYWZmZWN0cyB5b3UsIHlvdSB3ZXJlIGNoZWF0aW5nLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgKGZpbmFsKT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpXZSBvbmx5IGNoYW5nZWQgYSBmZXcgdGhpbmdzIHNpbmNlIHRoZSBsYXN0IHJlbGVhc2UgY2FuZGlkYXRlLCBhbGwgaW4KUHl0aG9uIGxpYnJhcnkgY29kZToKCi0gQSBidWcgaW4gdGhlIGxvY2FsZSBtb2R1bGUgd2FzIGZpeGVkIHRoYXQgYWZmZWN0ZWQgbG9jYWxlcyB3aGljaAogIGRlZmluZSBubyBncm91cGluZyBmb3IgbnVtZXJpYyBmb3JtYXR0aW5nLgoKLSBBIGZldyBidWdzIGluIHRoZSB3ZWFrcmVmIG1vZHVsZSdzIGltcGxlbWVudGF0aW9ucyBvZiB3ZWFrCiAgZGljdGlvbmFyaWVzIChXZWFrVmFsdWVEaWN0aW9uYXJ5IGFuZCBXZWFrS2V5RGljdGlvbmFyeSkgd2VyZSBmaXhlZCwKICBhbmQgdGhlIHRlc3Qgc3VpdGUgd2FzIHVwZGF0ZWQgdG8gY2hlY2sgZm9yIHRoZXNlIGJ1Z3MuCgotIEFuIG9sZCBidWcgaW4gdGhlIG9zLnBhdGgud2FsaygpIGZ1bmN0aW9uIChpbnRyb2R1Y2VkIGluIFB5dGhvbgogIDIuMCEpIHdhcyBmaXhlZDogYSBub24tZXhpc3RlbnQgZmlsZSB3b3VsZCBjYXVzZSBhbiBleGNlcHRpb24KICBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuCgotIEZpeGVkIGEgZmV3IGJ1Z3MgaW4gdGhlIG5ldyBzeW10YWJsZSBtb2R1bGUgZm91bmQgYnkgTmVpbCBOb3J3aXR6J3MKICBQeUNoZWNrZXIuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xYzI/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQSBmbHVycnkgb2Ygc21hbGwgY2hhbmdlcywgYW5kIG9uZSBzaG93c3RvcHBlciBmaXhlZCBpbiB0aGUgbmljayBvZgp0aW1lIG1hZGUgaXQgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgYW5vdGhlciByZWxlYXNlIGNhbmRpZGF0ZS4gIFRoZSBsaXN0CmhlcmUgaXMgdGhlICpjb21wbGV0ZSogbGlzdCBvZiBwYXRjaGVzIChleGNlcHQgdmVyc2lvbiB1cGRhdGVzKToKCkNvcmUKCi0gVGltIGRpc2NvdmVyZWQgYSBuYXN0eSBidWcgaW4gdGhlIGRpY3Rpb25hcnkgY29kZSwgY2F1c2VkIGJ5CiAgUHlEaWN0X05leHQoKSBjYWxsaW5nIGRpY3RfcmVzaXplKCksIGFuZCB0aGUgR0MgY29kZSdzIHVzZSBvZgogIFB5RGljdF9OZXh0KCkgdmlvbGF0aW5nIGFuIGFzc3VtcHRpb24gaW4gZGljdF9pdGVtcygpLiAgVGhpcyB3YXMKICBmaXhlZCB3aXRoIGNvbnNpZGVyYWJsZSBhbW91bnRzIG9mIGJhbmQtYWlkLCBidXQgdGhlIG5ldCBlZmZlY3QgaXMgYQogIHNhbmVyIGFuZCBtb3JlIHJvYnVzdCBpbXBsZW1lbnRhdGlvbi4KCi0gTWFkZSBhIGJ1bmNoIG9mIHN5bWJvbHMgc3RhdGljIHRoYXQgd2VyZSBhY2NpZGVudGFsbHkgZ2xvYmFsLgoKQnVpbGQgYW5kIFBvcnRzCgotIFRoZSBzZXR1cC5weSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBhIG5ldyBlbm91Z2ggdmVyc2lvbiBvZiB6bGliCiAgKDEuMS4zIGlzIG5lZWRlZCkuICBOb3cgaXQgZG9lcy4KCi0gQ2hhbmdlZCAibWFrZSBjbGVhbiIgdGFyZ2V0IHRvIGFsc28gcmVtb3ZlIHNoYXJlZCBsaWJyYXJpZXMuCgotIEFkZGVkIGEgbW9yZSBnZW5lcmFsIHdhcm5pbmcgYWJvdXQgdGhlIFNHSSBJcml4IG9wdGltaXplciB0byBSRUFETUUuCgpMaWJyYXJ5CgotIEZpeCBhIGJ1ZyBpbiB1cmxsaWIuYmFzZWpvaW4oImh0dHA6Ly9ob3N0IiwgIi4uL2ZpbGUuaHRtbCIpIHdoaWNoCiAgb21pdHRlZCB0aGUgc2xhc2ggYmV0d2VlbiBob3N0IGFuZCBmaWxlLmh0bWwuCgotIFRoZSBtYWlsYm94IG1vZHVsZSdzIF9NYWlsYm94IGNsYXNzIGNvbnRhaW5lZCBhIGNvbXBsZXRlbHkgYnJva2VuCiAgYW5kIHVuZG9jdW1lbnRlZCBzZWVrKCkgbWV0aG9kLiAgUmlwcGVkIGl0IG91dC4KCi0gRml4ZWQgYSBidW5jaCBvZiB0eXBvcyBpbiB2YXJpb3VzIGxpYnJhcnkgbW9kdWxlcyAodXJsbGliMiwgc210cGQsCiAgc2dtbGxpYiwgbmV0cmMsIGNodW5rKSBmb3VuZCBieSBOZWlsIE5vcndpdHoncyBQeUNoZWNrZXIuCgotIEZpeGVkIGEgZmV3IGxhc3QtbWludXRlIGJ1Z3MgaW4gdW5pdHRlc3QuCgpFeHRlbnNpb25zCgotIFJldmVydGVkIHRoZSBwYXRjaCB0byB0aGUgT3BlblNTTCBjb2RlIGluIHNvY2tldG1vZHVsZS5jIHRvIHN1cHBvcnQKICBSQU5EX3N0YXR1cygpIGFuZCB0aGUgRUdELCBhbmQgdGhlIHN1YnNlcXVlbnQgcGF0Y2ggdGhhdCB0cmllZCB0bwogIGZpeCBpdCBmb3IgcHJlLTAuOS41IHZlcnNpb25zOyB0aGUgcHJvYmxlbSB3aXRoIHRoZSBwYXRjaCBpcyB0aGF0IG9uCiAgc29tZSBzeXN0ZW1zIGl0IGlzc3VlcyBhIHdhcm5pbmcgd2hlbmV2ZXIgc29ja2V0IGlzIGltcG9ydGVkLCBhbmQKICB0aGF0J3MgdW5hY2NlcHRhYmxlLgoKVGVzdHMKCi0gRml4ZWQgdGhlIHBpY2tsZSB0ZXN0cyB0byB3b3JrIHdpdGggImltcG9ydCB0ZXN0LnRlc3RfcGlja2xlIi4KCi0gVHdlYWtlZCB0ZXN0X2xvY2FsZS5weSB0byBhY3R1YWxseSBydW4gdGhlIHRlc3QgV2luZG93cy4KCi0gSW4gZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weSwgY2FsbCB6aXBmaWxlLlppcEZpbGUoKSB3aXRoIG1vZGUgInciLAogIG5vdCAid2IiICh3aGljaCBpcyBub3QgYSB2YWxpZCBtb2RlIGF0IGFsbCkuCgotIEZpeCBwc3RhdHMgYnJvd3NlciBjcmFzaGVzLiAgSW1wb3J0IHJlYWRsaW5lIGlmIGl0IGV4aXN0cyB0byBtYWtlCiAgdGhlIHVzZXIgaW50ZXJmYWNlIG5pY2VyLgoKLSBBZGQgImltcG9ydCB0aHJlYWQiIHRvIHRoZSB0b3Agb2YgdGVzdCBtb2R1bGVzIHRoYXQgaW1wb3J0IHRoZQogIHRocmVhZGluZyBtb2R1bGUgKHRlc3RfYXN5bmNoYXQgYW5kIHRlc3RfdGhyZWFkZWR0ZW1wZmlsZSkuICBUaGlzCiAgcHJldmVudHMgdGVzdCBmYWlsdXJlcyBjYXVzZWQgYnkgYSBicm9rZW4gdGhyZWFkaW5nIG1vZHVsZSByZXN1bHRpbmcKICBmcm9tIGEgcHJldmlvdXNseSBjYXVnaHQgZmFpbGVkIGltcG9ydC4KCi0gQ2hhbmdlZCB0ZXN0X2FzeW5jaGF0LnB5IHRvIHNldCB0aGUgU09fUkVVU0VBRERSIG9wdGlvbjsgdGhpcyB3YXMKICBuZWVkZWQgb24gc29tZSBwbGF0Zm9ybXMgKGUuZy4gU29sYXJpcyA4KSB3aGVuIHRoZSB0ZXN0cyBhcmUgcnVuCiAgdHdpY2UgaW4gc3VjY2Vzc2lvbi4KCi0gU2tpcCByYXRoZXIgdGhhbiBmYWlsIHRlc3Rfc3VuYXVkaW9kZXYgaWYgbm8gYXVkaW8gZGV2aWNlIGlzIGZvdW5kLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMWMxPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgbGlzdCB3YXMgc2lnbmlmaWNhbnRseSB1cGRhdGVkIHdoZW4gMi4xYzIgd2FzIHJlbGVhc2VkOyB0aGUgMi4xYzEKcmVsZWFzZSBkaWRuJ3QgbWVudGlvbiBtb3N0IGNoYW5nZXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHBhcnQgb2YgMi4xYzE6CgpMZWdhbAoKLSBDb3B5cmlnaHQgd2FzIGFzc2lnbmVkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiAoUFNGKSBhbmQgYQogIFBTRiBsaWNlbnNlICh2ZXJ5IHNpbWlsYXIgdG8gdGhlIENOUkkgbGljZW5zZSkgd2FzIGFkZGVkLgoKLSBUaGUgQ05SSSBjb3B5cmlnaHQgbm90aWNlIHdhcyB1cGRhdGVkIHRvIGluY2x1ZGUgMjAwMS4KCkNvcmUKCi0gQWZ0ZXIgYSBwdWJsaWMgb3V0Y3J5LCBhc3NpZ25tZW50IHRvIF9fZGVidWdfXyBpcyBubyBsb25nZXIgaWxsZWdhbDsKICBpbnN0ZWFkLCBhIHdhcm5pbmcgaXMgaXNzdWVkLiAgSXQgd2lsbCBiZWNvbWUgaWxsZWdhbCBpbiAyLjIuCgotIEZpeGVkIGEgY29yZSBkdW1wIHdpdGggIiUjeCIgJSAwLCBhbmQgY2hhbmdlZCB0aGUgc2VtYW50aWNzIHNvIHRoYXQKICAiJSN4IiBub3cgYWx3YXlzIHByZXBlbmRzICIweCIsIGV2ZW4gaWYgdGhlIHZhbHVlIGlzIHplcm8uCgotIEZpeGVkIHNvbWUgbml0cyBpbiB0aGUgYnl0ZWNvZGUgY29tcGlsZXIuCgotIEZpeGVkIGNvcmUgZHVtcHMgd2hlbiBjYWxsaW5nIGNlcnRhaW4ga2luZHMgb2Ygbm9uLWZ1bmN0aW9ucy4KCi0gRml4ZWQgdmFyaW91cyBjb3JlIGR1bXBzIGNhdXNlZCBieSByZWZlcmVuY2UgY291bnQgYnVncy4KCkJ1aWxkIGFuZCBQb3J0cwoKLSBVc2UgSU5TVEFMTF9TQ1JJUFQgdG8gaW5zdGFsbCBzY3JpcHQgZmlsZXMuCgotIE5ldyBwb3J0OiBTQ08gVW5peHdhcmUgNywgYnkgQmlsbHkgRy4gQWxsaWUuCgotIFVwZGF0ZWQgUklTQ09TIHBvcnQuCgotIFVwZGF0ZWQgQmVPUyBwb3J0IGFuZCBub3Rlcy4KCi0gVmFyaW91cyBvdGhlciBwb3J0aW5nIHByb2JsZW1zIHJlc29sdmVkLgoKTGlicmFyeQoKLSBUaGUgVEVSTUlPUyBhbmQgU09DS0VUIG1vZHVsZXMgYXJlIG5vdyB0cnVseSBvYnNvbGV0ZSBhbmQKICB1bm5lY2Vzc2FyeS4gIFRoZWlyIHN5bWJvbHMgYXJlIGluY29ycG9yYXRlZCBpbiB0aGUgdGVybWlvcyBhbmQKICBzb2NrZXQgbW9kdWxlcy4KCi0gRml4ZWQgc29tZSA2NC1iaXQgYnVncyBpbiBwaWNrbGUsIGNQaWNrbGUsIGFuZCBzdHJ1Y3QsIGFuZCBhZGRlZAogIGJldHRlciB0ZXN0cyBmb3IgcGlja2xpbmcuCgotIHRocmVhZGluZzogbWFrZSBDb25kaXRpb24ud2FpdCgpIHJvYnVzdCBhZ2FpbnN0IEtleWJvYXJkSW50ZXJydXB0LgoKLSB6aXBmaWxlOiBhZGQgc3VwcG9ydCB0byB6aXBmaWxlIHRvIHN1cHBvcnQgb3BlbmluZyBhbiBhcmNoaXZlCiAgcmVwcmVzZW50ZWQgYnkgYW4gb3BlbiBmaWxlIHJhdGhlciB0aGFuIGEgZmlsZSBuYW1lLiAgRml4IGJ1ZyB3aGVyZQogIHRoZSBhcmNoaXZlIHdhcyBub3QgcHJvcGVybHkgY2xvc2VkLiAgRml4ZWQgYSBidWcgaW4gdGhpcyBidWdmaXgKICB3aGVyZSBmbHVzaCgpIHdhcyBjYWxsZWQgZm9yIGEgcmVhZC1vbmx5IGZpbGUuCgotIGltcHV0aWw6IGFkZGVkIGFuIHVuaW5zdGFsbCgpIG1ldGhvZCB0byB0aGUgSW1wb3J0TWFuYWdlci4KCi0gQ2FudmFzOiBmaXhlZCBidWdzIGluIGxvd2VyKCkgYW5kIHRrcmFpc2UoKSBtZXRob2RzLgoKLSBTb2NrZXRTZXJ2ZXI6IEFQSSBjaGFuZ2UgKGFkZGVkIG92ZXJyaWRhYmxlIGNsb3NlX3JlcXVlc3QoKSBtZXRob2QpCiAgc28gdGhhdCB0aGUgVENQIHNlcnZlciBjYW4gZXhwbGljaXRseSBjbG9zZSB0aGUgcmVxdWVzdC4KCi0gcHN0YXRzOiBFcmljIFJheW1vbmQgYWRkZWQgYSBzaW1wbGUgaW50ZXJhY3RpdmUgc3RhdGlzdGljcyBicm93c2VyLAogIGludm9rZWQgd2hlbiB0aGUgbW9kdWxlIGlzIHJ1biBhcyBhIHNjcmlwdC4KCi0gbG9jYWxlOiBmaXhlZCBhIHByb2JsZW0gaW4gZm9ybWF0KCkuCgotIHdlYmJyb3dzZXI6IG1hZGUgaXQgd29yayB3aGVuIHRoZSBCUk9XU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBhCiAgdmFsdWUgbGlrZSAiL3Vzci9iaW4vbmV0c2NhcGUiLiAgTWFkZSBpdCBhdXRvLWRldGVjdCBLb25xdWVyb3IgZm9yCiAgS0RFIDIuICBGaXhlZCBzb21lIG90aGVyIG5pdHMuCgotIHVuaXR0ZXN0OiBjaGFuZ2VzIHRvIGFsbG93IHVzaW5nIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiB0aGFuCiAgQXNzZXJ0aW9uRXJyb3IsIGFuZCBhZGRlZCBhIGZldyBtb3JlIGZ1bmN0aW9uIGFsaWFzZXMuICBTb21lIG90aGVyCiAgc21hbGwgY2hhbmdlcy4KCi0gdXJsbGliLCB1cmxsaWIyOiBmaXhlZCByZWRpcmVjdCBwcm9ibGVtcyBhbmQgYSBjb3VwbGVvZiBvdGhlciBuaXRzLgoKLSBhc3luY2hhdDogZml4ZWQgYSBjcml0aWNhbCBidWcgaW4gYXN5bmNoYXQgdGhhdCBzbGlwcGVkIHRocm91Z2ggdGhlCiAgMi4xYjIgcmVsZWFzZS4gIEZpeGVkIGFub3RoZXIgcmFyZSBidWcuCgotIEZpeCBzb21lIHVucXVhbGlmaWVkIGV4Y2VwdDogY2xhdXNlcyAoYWx3YXlzIGEgYmFkIGNvZGUgZXhhbXBsZSkuCgpYTUwKCi0gcHlleHBhdDogbmV3IEFQSSBnZXRfdmVyc2lvbl9zdHJpbmcoKS4KCi0gRml4ZWQgc29tZSBtaW5pZG9tIGJ1Z3MuCgpFeHRlbnNpb25zCgotIEZpeGVkIGEgY29yZSBkdW1wIGluIF93ZWFrcmVmLiAgUmVtb3ZlZCB0aGUgd2Vha3JlZi5tYXBwaW5nKCkKICBmdW5jdGlvbiAoaXQgYWRkcyBub3RoaW5nIHRvIHRoZSBBUEkpLgoKLSBSYXRpb25hbGl6ZWQgdGhlIHVzZSBvZiBoZWFkZXIgZmlsZXMgaW4gdGhlIHJlYWRsaW5lIG1vZHVsZSwgdG8gbWFrZQogIGl0IGNvbXBpbGUgKGFsYmVpdCB3aXRoIHNvbWUgd2FybmluZ3MpIHdpdGggdGhlIHZlcnkgcmVjZW50IHJlYWRsaW5lCiAgNC4yLCB3aXRob3V0IGJyZWFraW5nIGZvciBlYXJsaWVyIHZlcnNpb25zLgoKLSBIb3BlZnVsbHkgZml4ZWQgYSBidWZmZXJpbmcgcHJvYmxlbSBpbiBsaW51eGF1ZGlvZGV2LgoKLSBBdHRlbXB0ZWQgYSBmaXggdG8gbWFrZSB0aGUgT3BlblNTTCBzdXBwb3J0IGluIHRoZSBzb2NrZXQgbW9kdWxlCiAgd29yayBhZ2FpbiB3aXRoIHByZS0wLjkuNSB2ZXJzaW9ucyBvZiBPcGVuU1NMLgoKVGVzdHMKCi0gQWRkZWQgYSB0ZXN0IGNhc2UgZm9yIGFzeW5jaGF0IGFuZCBhc3luY29yZS4KCi0gUmVtb3ZlZCBjb3VwbGluZyBiZXR3ZWVuIHRlc3RzIHdoZXJlIG9uZSB0ZXN0IGZhaWxpbmcgY291bGQgYnJlYWsKICBhbm90aGVyLgoKVG9vbHMKCi0gUGluZyBhZGRlZCBhbiBpbnRlcmFjdGl2ZSBoZWxwIGJyb3dzZXIgdG8gcHlkb2MsIGZpeGVkIHNvbWUgbml0cwogIGluIHRoZSByZXN0IG9mIHRoZSBweWRvYyBjb2RlLCBhbmQgYWRkZWQgc29tZSBmZWF0dXJlcyB0byBoaXMKICBpbnNwZWN0IG1vZHVsZS4KCi0gQW4gdXBkYXRlZCBweXRob24tbW9kZS5lbCB2ZXJzaW9uIDQuMSB3aGljaCBpbnRlZ3JhdGVzIEtlbgogIE1hbmhlaW1lcidzIHBkYnRyYWNrLmVsLiAgVGhpcyBtYWtlcyBkZWJ1Z2dpbmcgUHl0aG9uIGNvZGUgdmlhIHBkYgogIG11Y2ggbmljZXIgaW4gWEVtYWNzIGFuZCBFbWFjcy4gIFdoZW4gc3RlcHBpbmcgdGhyb3VnaCB5b3VyIHByb2dyYW0KICB3aXRoIHBkYiwgaW4gZWl0aGVyIHRoZSBzaGVsbCB3aW5kb3cgb3IgdGhlICpQeXRob24qIHdpbmRvdywgdGhlCiAgc291cmNlIGZpbGUgYW5kIGxpbmUgd2lsbCBiZSB0cmFja2VkIGJ5IGFuIGFycm93LiAgVmVyeSBjb29sIQoKLSBJRExFOiBzeW50YXggd2FybmluZ3MgaW4gaW50ZXJhY3RpdmUgbW9kZSBhcmUgY2hhbmdlZCBpbnRvIGVycm9ycy4KCi0gU29tZSBpbXByb3ZlbWVudHMgdG8gVG9vbHMvd2ViY2hlY2tlciAoaWdub3JlIHNvbWUgbW9yZSBVUkwgdHlwZXMsCiAgZm9sbG93IHNvbWUgbW9yZSBsaW5rcykuCgotIEJyb3VnaHQgdGhlIFRvb2xzL2NvbXBpbGVyIHBhY2thZ2UgdXAgdG8gZGF0ZS4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgYmV0YSAyPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKFVubGlzdGVkIGFyZSBtYW55IGZpeGVkIGJ1Z3MsIG1vcmUgZG9jdW1lbnRhdGlvbiwgZXRjLikKCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gVGhlIG5lc3RlZCBzY29wZXMgd29yayAoZW5hYmxlZCBieSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydAogIG5lc3RlZF9zY29wZXMiKSBpcyBjb21wbGV0ZWQ7IGluIHBhcnRpY3VsYXIsIHRoZSBmdXR1cmUgbm93IGV4dGVuZHMKICBpbnRvIGNvZGUgZXhlY3V0ZWQgdGhyb3VnaCBleGVjLCBldmFsKCkgYW5kIGV4ZWNmaWxlKCksIGFuZCBpbnRvIHRoZQogIGludGVyYWN0aXZlIGludGVycHJldGVyLgoKLSBXaGVuIGNhbGxpbmcgYSBiYXNlIGNsYXNzIG1ldGhvZCAoZS5nLiBCYXNlQ2xhc3MuX19pbml0X18oc2VsZikpLAogIHRoaXMgaXMgbm93IGFsbG93ZWQgZXZlbiBpZiBzZWxmIGlzIG5vdCBzdHJpY3RseSBzcG9rZW4gYSBjbGFzcwogIGluc3RhbmNlIChlLmcuIHdoZW4gdXNpbmcgbWV0YWNsYXNzZXMgb3IgdGhlIERvbiBCZWF1ZHJ5IGhvb2spLgoKLSBTbGljZSBvYmplY3RzIGFyZSBub3cgY29tcGFyYWJsZSBidXQgbm90IGhhc2hhYmxlOyB0aGlzIHByZXZlbnRzCiAgZGljdFs6XSBmcm9tIGJlaW5nIGFjY2VwdGVkIGJ1dCBtZWFuaW5nbGVzcy4KCi0gQ29tcGxleCBkaXZpc2lvbiBpcyBub3cgY2FsY3VsYXRlZCB1c2luZyBsZXNzIGJyYWluZGVhZCBhbGdvcml0aG1zLgogIFRoaXMgZG9lc24ndCBjaGFuZ2Ugc2VtYW50aWNzIGV4Y2VwdCBpdCdzIG1vcmUgbGlrZWx5IHRvIGdpdmUgdXNlZnVsCiAgcmVzdWx0cyBpbiBleHRyZW1lIGNhc2VzLiAgQ29tcGxleCByZXByKCkgbm93IHVzZXMgZnVsbCBwcmVjaXNpb24KICBsaWtlIGZsb2F0IHJlcHIoKS4KCi0gc2dtbGxpYi5weSBub3cgY2FsbHMgaGFuZGxlX2RlY2woKSBmb3Igc2ltcGxlIDwhLi4uPiBkZWNsYXJhdGlvbnMuCgotIEl0IGlzIGlsbGVnYWwgdG8gYXNzaWduIHRvIHRoZSBuYW1lIF9fZGVidWdfXywgd2hpY2ggaXMgc2V0IHdoZW4gdGhlCiAgaW50ZXJwcmV0ZXIgc3RhcnRzLiAgSXQgaXMgZWZmZWN0aXZlbHkgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCgotIEEgd2FybmluZyB3aWxsIGJlIGlzc3VlZCBpZiBhIGdsb2JhbCBzdGF0ZW1lbnQgZm9yIGEgdmFyaWFibGUKICBmb2xsb3dzIGEgdXNlIG9yIGFzc2lnbm1lbnQgb2YgdGhhdCB2YXJpYWJsZS4KClN0YW5kYXJkIGxpYnJhcnkKCi0gdW5pdHRlc3QucHksIGEgdW5pdCB0ZXN0aW5nIGZyYW1ld29yayBieSBTdGV2ZSBQdXJjZWxsIChQeVVOSVQsCiAgaW5zcGlyZWQgYnkgSlVuaXQpLCBpcyBub3cgcGFydCBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeS4gIFlvdSBub3cKICBoYXZlIGEgY2hvaWNlIG9mIHR3byB0ZXN0aW5nIGZyYW1ld29ya3M6IHVuaXR0ZXN0IHJlcXVpcmVzIHlvdSB0bwogIHdyaXRlIHRlc3RjYXNlcyBhcyBzZXBhcmF0ZSBjb2RlLCBkb2N0ZXN0IGdhdGhlcnMgdGhlbSBmcm9tCiAgZG9jc3RyaW5ncy4gIEJvdGggYXBwcm9hY2hlcyBoYXZlIHRoZWlyIGFkdmFudGFnZXMgYW5kCiAgZGlzYWR2YW50YWdlcy4KCi0gQSBuZXcgbW9kdWxlIFRpeCB3YXMgYWRkZWQsIHdoaWNoIHdyYXBzIHRoZSBUaXggZXh0ZW5zaW9uIGxpYnJhcnkKICBmb3IgVGsuICBXaXRoIHRoYXQgbW9kdWxlLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHN0YXRpY2FsbHkgbGluawogIFRpeCB3aXRoIF90a2ludGVyLCBzaW5jZSBUaXggd2lsbCBiZSBsb2FkZWQgd2l0aCBUY2wncyAicGFja2FnZQogIHJlcXVpcmUiIGNvbW1hbmQuICBTZWUgRGVtby90aXgvLgoKLSB0enBhcnNlLnB5IGlzIG5vdyBvYnNvbGV0ZS4KCi0gSW4gZ3ppcC5weSwgdGhlIHNlZWsoKSBhbmQgdGVsbCgpIG1ldGhvZHMgYXJlIHJlbW92ZWQgLS0gdGhleSB3ZXJlCiAgbm9uLWZ1bmN0aW9uYWwgYW55d2F5LCBhbmQgaXQncyBiZXR0ZXIgaWYgY2FsbGVycyBjYW4gdGVzdCBmb3IgdGhlaXIKICBleGlzdGVuY2Ugd2l0aCBoYXNhdHRyKCkuCgpQeXRob24vQyBBUEkKCi0gUHlEaWN0X05leHQoKTogaXQgaXMgbm93IHNhZmUgdG8gY2FsbCBQeURpY3RfU2V0SXRlbSgpIHdpdGggYSBrZXkKICB0aGF0J3MgYWxyZWFkeSBpbiB0aGUgZGljdGlvbmFyeSBkdXJpbmcgYSBQeURpY3RfTmV4dCgpIGl0ZXJhdGlvbi4KICBUaGlzIHVzZWQgdG8gZmFpbCBvY2Nhc2lvbmFsbHkgd2hlbiBhIGRpY3Rpb25hcnkgcmVzaXplIG9wZXJhdGlvbgogIGNvdWxkIGJlIHRyaWdnZXJlZCB0aGF0IHdvdWxkIHJlaGFzaCBhbGwgdGhlIGtleXMuICBBbGwgb3RoZXIKICBtb2RpZmljYXRpb25zIHRvIHRoZSBkaWN0aW9uYXJ5IGFyZSBzdGlsbCBvZmYtbGltaXRzIGR1cmluZyBhCiAgUHlEaWN0X05leHQoKSBpdGVyYXRpb24hCgotIE5ldyBleHRlbmRlZCBBUElzIHJlbGF0ZWQgdG8gcGFzc2luZyBjb21waWxlciB2YXJpYWJsZXMgYXJvdW5kLgoKLSBOZXcgYWJzdHJhY3QgQVBJcyBQeU9iamVjdF9Jc0luc3RhbmNlKCksIFB5T2JqZWN0X0lzU3ViY2xhc3MoKQogIGltcGxlbWVudCBpc2luc3RhbmNlKCkgYW5kIGlzc3ViY2xhc3MoKS4KCi0gUHlfQnVpbGRWYWx1ZSgpIG5vdyBoYXMgYSAiRCIgY29udmVyc2lvbiB0byBjcmVhdGUgYSBQeXRob24gY29tcGxleAogIG51bWJlciBmcm9tIGEgUHlfY29tcGxleCBDIHZhbHVlLgoKLSBFeHRlbnNpb25zIHR5cGVzIHdoaWNoIHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIG11c3Qgbm93IHNldCB0aGUKICBmaWVsZCBhbGxvY2F0ZWQgZm9yIHRoZSB3ZWFrIHJlZmVyZW5jZSBtYWNoaW5lcnkgdG8gTlVMTCB0aGVtc2VsdmVzOwogIHRoaXMgaXMgZG9uZSB0byBhdm9pZCB0aGUgY29zdCBvZiBjaGVja2luZyBlYWNoIG9iamVjdCBmb3IgaGF2aW5nIGEKICB3ZWFrbHkgcmVmZXJlbmNhYmxlIHR5cGUgaW4gUHlPYmplY3RfSU5JVCgpLCBzaW5jZSBtb3N0IHR5cGVzIGFyZQogIG5vdCB3ZWFrbHkgcmVmZXJlbmNhYmxlLgoKLSBQeUZyYW1lX0Zhc3RUb0xvY2FscygpIGFuZCBQeUZyYW1lX0xvY2Fsc1RvRmFzdCgpIGNvcHkgYmluZGluZ3MgZm9yCiAgZnJlZSB2YXJpYWJsZXMgYW5kIGNlbGwgdmFyaWFibGVzIHRvIGFuZCBmcm9tIHRoZSBmcmFtZSdzIGZfbG9jYWxzLgoKLSBWYXJpYW50cyBvZiBzZXZlcmFsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHB5dGhvbnJ1bi5oIGhhdmUgYmVlbiBhZGRlZAogIHRvIHN1cHBvcnQgdGhlIG5lc3RlZF9zY29wZXMgZnV0dXJlIHN0YXRlbWVudC4gIFRoZSB2YXJpYW50cyBhbGwgZW5kCiAgaW4gRmxhZ3MgYW5kIHRha2UgYW4gZXh0cmEgYXJndW1lbnQsIGEgUHlDb21waWxlckZsYWdzICo7IGV4YW1wbGVzOgogIFB5UnVuX0FueUZpbGVFeEZsYWdzKCksIFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzKCkuICBUaGVzZQogIHZhcmlhbnRzIG1heSBiZSByZW1vdmVkIGluIFB5dGhvbiAyLjIsIHdoZW4gbmVzdGVkIHNjb3BlcyBhcmUKICBtYW5kYXRvcnkuCgpEaXN0dXRpbHMKCi0gdGhlIHNkaXN0IGNvbW1hbmQgbm93IHdyaXRlcyBhIFBLRy1JTkZPIGZpbGUsIGFzIGRlc2NyaWJlZCBpbiBQRVAgMjQxLAogIGludG8gdGhlIHJlbGVhc2UgdHJlZS4KCi0gc2V2ZXJhbCBlbmhhbmNlbWVudHMgdG8gdGhlIGJkaXN0X3dpbmluc3QgY29tbWFuZCBmcm9tIFRob21hcyBIZWxsZXIKICAoYW4gdW5pbnN0YWxsZXIsIG1vcmUgY3VzdG9taXphdGlvbiBvZiB0aGUgaW5zdGFsbGVyJ3MgZGlzcGxheSkKCi0gZnJvbSBKYWNrIEphbnNlbjogYWRkZWQgTWFjLXNwZWNpZmljIGNvZGUgdG8gZ2VuZXJhdGUgYSBkaWFsb2cgZm9yCiAgdXNlcnMgdG8gc3BlY2lmeSB0aGUgY29tbWFuZC1saW5lIChiZWNhdXNlIHByb3ZpZGluZyBhIGNvbW1hbmQtbGluZSB3aXRoCiAgTWFjUHl0aG9uIGlzIGF3a3dhcmQpLiAgSmFjayBhbHNvIG1hZGUgdmFyaW91cyBmaXhlcyBmb3IgdGhlIE1hYwogIGFuZCB0aGUgTWV0cm93ZXJrcyBjb21waWxlci4KCi0gYWRkZWQgJ3BsYXRmb3JtcycgYW5kICdrZXl3b3JkcycgdG8gdGhlIHNldCBvZiBtZXRhZGF0YSB0aGF0IGNhbiBiZQogIHNwZWNpZmllZCBmb3IgYSBkaXN0cmlidXRpb24uCgotIGFwcGxpZWQgcGF0Y2hlcyBmcm9tIEphc29uIFRpc2hsZXIgdG8gbWFrZSB0aGUgY29tcGlsZXIgY2xhc3Mgd29yayB3aXRoCiAgQ3lnd2luLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMSBiZXRhIDE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIEZvbGxvd2luZyBhbiBvdXRjcnkgZnJvbSB0aGUgY29tbXVuaXR5IGFib3V0IHRoZSBhbW91bnQgb2YgY29kZQogIGJyb2tlbiBieSB0aGUgbmVzdGVkIHNjb3BlcyBmZWF0dXJlIGludHJvZHVjZWQgaW4gMi4xYTIsIHdlIGRlY2lkZWQKICB0byBtYWtlIHRoaXMgZmVhdHVyZSBvcHRpb25hbCwgYW5kIHRvIHdhaXQgdW50aWwgUHl0aG9uIDIuMiAob3IgYXQKICBsZWFzdCA2IG1vbnRocykgdG8gbWFrZSBpdCBzdGFuZGFyZC4gIFRoZSBvcHRpb24gY2FuIGJlIGVuYWJsZWQgb24gYQogIHBlci1tb2R1bGUgYmFzaXMgYnkgYWRkaW5nICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMiIGF0CiAgdGhlIGJlZ2lubmluZyBvZiBhIG1vZHVsZSAoYmVmb3JlIGFueSBvdGhlciBzdGF0ZW1lbnRzLCBidXQgYWZ0ZXIKICBjb21tZW50cyBhbmQgYW4gb3B0aW9uYWwgZG9jc3RyaW5nKS4gIFNlZSBQRVAgMjM2IChCYWNrIHRvIHRoZQogIF9fZnV0dXJlX18pIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBfX2Z1dHVyZV9fIHN0YXRlbWVudC4gIFBFUCAyMjcKICAoU3RhdGljYWxseSBOZXN0ZWQgU2NvcGVzKSBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UsCiAgYW5kIHRvIGNsYXJpZnkgdGhlIHNlbWFudGljcyBpbiBhIG51bWJlciBvZiBlbmRjYXNlcy4KCi0gVGhlIG5lc3RlZCBzY29wZXMgY29kZSwgd2hlbiBlbmFibGVkLCBoYXMgYmVlbiBoYXJkZW5lZCwgYW5kIG1vc3QKICBidWdzIGFuZCBtZW1vcnkgbGVha3MgaW4gaXQgaGF2ZSBiZWVuIGZpeGVkLgoKLSBDb21waWxlLXRpbWUgd2FybmluZ3MgYXJlIG5vdyBnZW5lcmF0ZWQgZm9yIGEgbnVtYmVyIG9mIGNvbmRpdGlvbnMKICB0aGF0IHdpbGwgYnJlYWsgb3IgY2hhbmdlIGluIG1lYW5pbmcgd2hlbiBuZXN0ZWQgc2NvcGVzIGFyZSBlbmFibGVkOgoKICAtIFVzaW5nICJmcm9tLi4uaW1wb3J0ICoiIG9yICJleGVjIiB3aXRob3V0IGluLWNsYXVzZSBpbiBhIGZ1bmN0aW9uCiAgICBzY29wZSB0aGF0IGFsc28gZGVmaW5lcyBhIGxhbWJkYSBvciBuZXN0ZWQgZnVuY3Rpb24gd2l0aCBvbmUgb3IKICAgIG1vcmUgZnJlZSAobm9uLWxvY2FsKSB2YXJpYWJsZXMuICBUaGUgcHJlc2VuY2Ugb2YgdGhlIGltcG9ydCogb3IKICAgIGJhcmUgZXhlYyBtYWtlcyBpdCBpbXBvc3NpYmxlIGZvciB0aGUgY29tcGlsZXIgdG8gZGV0ZXJtaW5lIHRoZQogICAgZXhhY3Qgc2V0IG9mIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIG1ha2VzIGl0CiAgICBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB0aGUgYmluZGluZ3MgZm9yIGZyZWUgdmFyaWFibGVzIGluIHRoZQogICAgaW5uZXIgc2NvcGUuICBUbyBhdm9pZCB0aGUgd2FybmluZyBhYm91dCBpbXBvcnQgKiwgY2hhbmdlIGl0IGludG8KICAgIGFuIGltcG9ydCBvZiBleHBsaWNpdGx5IG5hbWUgb2JqZWN0LCBvciBtb3ZlIHRoZSBpbXBvcnQqIHN0YXRlbWVudAogICAgdG8gdGhlIGdsb2JhbCBzY29wZTsgdG8gYXZvaWQgdGhlIHdhcm5pbmcgYWJvdXQgYmFyZSBleGVjLCB1c2UKICAgIGV4ZWMuLi5pbi4uLiAoYSBnb29kIGlkZWEgYW55d2F5IC0tIHRoZXJlJ3MgYSBwb3NzaWJpbGl0eSB0aGF0CiAgICBiYXJlIGV4ZWMgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUpLgoKICAtIFVzZSBvZiBhIGdsb2JhbCB2YXJpYWJsZSBpbiBhIG5lc3RlZCBzY29wZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYQogICAgbG9jYWwgdmFyaWFibGUgaW4gYSBzdXJyb3VuZGluZyBzY29wZS4gIFRoaXMgd2lsbCBjaGFuZ2UgaW4KICAgIG1lYW5pbmcgd2l0aCBuZXN0ZWQgc2NvcGVzOiB0aGUgbmFtZSBpbiB0aGUgaW5uZXIgc2NvcGUgd2lsbAogICAgcmVmZXJlbmNlIHRoZSB2YXJpYWJsZSBpbiB0aGUgb3V0ZXIgc2NvcGUgcmF0aGVyIHRoYW4gdGhlIGdsb2JhbAogICAgb2YgdGhlIHNhbWUgbmFtZS4gIFRvIGF2b2lkIHRoZSB3YXJuaW5nLCBlaXRoZXIgcmVuYW1lIHRoZSBvdXRlcgogICAgdmFyaWFibGUsIG9yIHVzZSBhIGdsb2JhbCBzdGF0ZW1lbnQgaW4gdGhlIGlubmVyIGZ1bmN0aW9uLgoKLSBBbiBvcHRpb25hbCBvYmplY3QgYWxsb2NhdG9yIGhhcyBiZWVuIGluY2x1ZGVkLiAgVGhpcyBhbGxvY2F0b3IgaXMKICBvcHRpbWl6ZWQgZm9yIFB5dGhvbiBvYmplY3RzIGFuZCBzaG91bGQgYmUgZmFzdGVyIGFuZCB1c2UgbGVzcyBtZW1vcnkKICB0aGFuIHRoZSBzdGFuZGFyZCBzeXN0ZW0gYWxsb2NhdG9yLiAgSXQgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdAogIGJlY2F1c2Ugb2YgcG9zc2libGUgdGhyZWFkIHNhZmV0eSBwcm9ibGVtcy4gIFRoZSBhbGxvY2F0b3IgaXMgb25seQogIHByb3RlY3RlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyIGxvY2sgYW5kIGl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZQogIGV4dGVuc2lvbiBtb2R1bGVzIHJlcXVpcmUgYSB0aHJlYWQgc2FmZSBhbGxvY2F0b3IuICBUaGUgb2JqZWN0CiAgYWxsb2NhdG9yIGNhbiBiZSBlbmFibGVkIGJ5IHByb3ZpZGluZyB0aGUgIi0td2l0aC1weW1hbGxvYyIgb3B0aW9uIHRvCiAgY29uZmlndXJlLgoKU3RhbmRhcmQgbGlicmFyeQoKLSBweWV4cGF0IG5vdyBkZXRlY3RzIHRoZSBleHBhdCB2ZXJzaW9uIGlmIGV4cGF0LmggZGVmaW5lcyBpdC4gQQogIG51bWJlciBvZiBhZGRpdGlvbmFsIGhhbmRsZXJzIGFyZSBwcm92aWRlZCwgd2hpY2ggYXJlIG9ubHkgYXZhaWxhYmxlCiAgc2luY2UgZXhwYXQgMS45NS4gSW4gYWRkaXRpb24sIHRoZSBtZXRob2RzIFNldFBhcmFtRW50aXR5UGFyc2luZyBhbmQKICBHZXRJbnB1dENvbnRleHQgb2YgUGFyc2VyIG9iamVjdHMgYXJlIGF2YWlsYWJsZSB3aXRoIDEuOTUueAogIG9ubHkuIFBhcnNlciBvYmplY3RzIG5vdyBwcm92aWRlIHRoZSBvcmRlcmVkX2F0dHJpYnV0ZXMgYW5kCiAgc3BlY2lmaWVkX2F0dHJpYnV0ZXMgYXR0cmlidXRlcy4gQSBuZXcgbW9kdWxlIGV4cGF0Lm1vZGVsIHdhcyBhZGRlZCwKICB3aGljaCBvZmZlcnMgYSBudW1iZXIgb2YgYWRkaXRpb25hbCBjb25zdGFudHMgaWYgMS45NS54IGlzIHVzZWQuCgotIHhtbC5kb20gb2ZmZXJzIHRoZSBuZXcgZnVuY3Rpb25zIHJlZ2lzdGVyRE9NSW1wbGVtZW50YXRpb24gYW5kCiAgZ2V0RE9NSW1wbGVtZW50YXRpb24uCgotIHhtbC5kb20ubWluaWRvbSBvZmZlcnMgYSB0b3ByZXR0eXhtbCBtZXRob2QuIEEgbnVtYmVyIG9mIERPTQogIGNvbmZvcm1hbmNlIGlzc3VlcyBoYXZlIGJlZW4gcmVzb2x2ZWQuIEluIHBhcnRpY3VsYXIsIEVsZW1lbnQgbm93CiAgaGFzIGFuIGhhc0F0dHJpYnV0ZXMgbWV0aG9kLCBhbmQgdGhlIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMgd2FzCiAgaW1wcm92ZWQuCgotIEthLVBpbmcgWWVlIGNvbnRyaWJ1dGVkIHR3byBuZXcgbW9kdWxlczogaW5zcGVjdC5weSwgYSBtb2R1bGUgZm9yCiAgZ2V0dGluZyBpbmZvcm1hdGlvbiBhYm91dCBsaXZlIFB5dGhvbiBjb2RlLCBhbmQgcHlkb2MucHksIGEgbW9kdWxlCiAgZm9yIGludGVyYWN0aXZlbHkgY29udmVydGluZyBkb2NzdHJpbmdzIHRvIEhUTUwgb3IgdGV4dC4KICBUb29scy9zY3JpcHRzL3B5ZG9jLCB3aGljaCBpcyBub3cgYXV0b21hdGljYWxseSBpbnN0YWxsZWQgaW50bwogIDxwcmVmaXg+L2JpbiwgdXNlcyBweWRvYy5weSB0byBkaXNwbGF5IGRvY3VtZW50YXRpb247IHRyeSBydW5uaW5nCiAgInB5ZG9jIC1oIiBmb3IgaW5zdHJ1Y3Rpb25zLiAgInB5ZG9jIC1nIiBwb3BzIHVwIGEgc21hbGwgR1VJIHRoYXQKICBsZXRzIHlvdSBicm93c2UgdGhlIG1vZHVsZSBkb2NzdHJpbmdzIHVzaW5nIGEgd2ViIGJyb3dzZXIuCgotIE5ldyBsaWJyYXJ5IG1vZHVsZSBkaWZmbGliLnB5LCBwcmltYXJpbHkgcGFja2FnaW5nIHRoZSBTZXF1ZW5jZU1hdGNoZXIKICBjbGFzcyBhdCB0aGUgaGVhcnQgb2YgdGhlIHBvcHVsYXIgbmRpZmYucHkgZmlsZS1jb21wYXJpc29uIHRvb2wuCgotIGRvY3Rlc3QucHkgKGEgZnJhbWV3b3JrIGZvciB2ZXJpZnlpbmcgUHl0aG9uIGNvZGUgZXhhbXBsZXMgaW4gZG9jc3RyaW5ncykKICBpcyBub3cgcGFydCBvZiB0aGUgc3RkIGxpYnJhcnkuCgpXaW5kb3dzIGNoYW5nZXMKCi0gQSBuZXcgZW50cnkgaW4gdGhlIFN0YXJ0IG1lbnUsICJNb2R1bGUgRG9jcyIsIHJ1bnMgInB5ZG9jIC1nIiAtLSBhCiAgc21hbGwgR1VJIHRoYXQgbGV0cyB5b3UgYnJvd3NlIHRoZSBtb2R1bGUgZG9jc3RyaW5ncyB1c2luZyB5b3VyCiAgZGVmYXVsdCB3ZWIgYnJvd3Nlci4KCi0gSW1wb3J0IGlzIG5vdyBjYXNlLXNlbnNpdGl2ZS4gIFBFUCAyMzUgKEltcG9ydCBvbiBDYXNlLUluc2Vuc2l0aXZlCiAgUGxhdGZvcm1zKSBpcyBpbXBsZW1lbnRlZC4gIFNlZQoKICAgICAgaHR0cDovL3B5dGhvbi5zb3VyY2Vmb3JnZS5uZXQvcGVwcy9wZXAtMDIzNS5odG1sCgogIGZvciBmdWxsIGRldGFpbHMsIGVzcGVjaWFsbHkgdGhlICJDdXJyZW50IExvd2VyLUxlZnQgU2VtYW50aWNzIiBzZWN0aW9uLgogIFRoZSBuZXcgV2luZG93cyBpbXBvcnQgcnVsZXMgYXJlIHNpbXBsZXIgdGhhbiBiZWZvcmU6CgogIEEuIElmIHRoZSBQWVRIT05DQVNFT0sgZW52aXJvbm1lbnQgdmFyaWFibGUgZXhpc3RzLCBzYW1lIGFzCiAgICAgYmVmb3JlOiAgc2lsZW50bHkgYWNjZXB0IHRoZSBmaXJzdCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIG9mIGFueQogICAgIGtpbmQ7IHJhaXNlIEltcG9ydEVycm9yIGlmIG5vbmUgZm91bmQuCgogIEIuIEVsc2Ugc2VhcmNoIHN5cy5wYXRoIGZvciB0aGUgZmlyc3QgY2FzZS1zZW5zaXRpdmUgbWF0Y2g7IHJhaXNlCiAgICAgSW1wb3J0RXJyb3IgaWYgbm9uZSBmb3VuZC4KCiAgVGhlIHNhbWUgcnVsZXMgaGF2ZSBiZWVuIGltcGxlbnRlZCBvbiBvdGhlciBwbGF0Zm9ybXMgd2l0aCBjYXNlLQogIGluc2Vuc2l0aXZlIGJ1dCBjYXNlLXByZXNlcnZpbmcgZmlsZXN5c3RlbXMgdG9vIChpbmNsdWRpbmcgQ3lnd2luLCBhbmQKICBzZXZlcmFsIGZsYXZvcnMgb2YgTWFjaW50b3NoIG9wZXJhdGluZyBzeXN0ZW1zKS4KCi0gd2luc291bmQgbW9kdWxlOiAgVW5kZXIgV2luOXgsIHdpbnNvdW5kLkJlZXAoKSBub3cgYXR0ZW1wdHMgdG8gc2ltdWxhdGUKICB3aGF0IGl0J3Mgc3VwcG9zZWQgdG8gZG8gKGFuZCBkb2VzIGRvIHVuZGVyIE5UIGFuZCAyMDAwKSB2aWEgZGlyZWN0CiAgcG9ydCBtYW5pcHVsYXRpb24uICBJdCdzIHVua25vd24gd2hldGhlciB0aGlzIHdpbGwgd29yayBvbiBhbGwgc3lzdGVtcywKICBidXQgaXQgZG9lcyB3b3JrIG9uIG15IFdpbjk4U0Ugc3lzdGVtcyBub3cgYW5kIHdhcyBrbm93biB0byBiZSB1c2VsZXNzIG9uCiAgYWxsIFdpbjl4IHN5c3RlbXMgYmVmb3JlLgoKLSBCdWlsZDogIFN1YnByb2plY3QgX3Rlc3QgKGVmZmVjdGl2ZWx5KSByZW5hbWVkIHRvIF90ZXN0Y2FwaS4KCk5ldyBwbGF0Zm9ybXMKCi0gMi4xIHNob3VsZCBjb21waWxlIGFuZCBydW4gb3V0IG9mIHRoZSBib3ggdW5kZXIgTWFjT1MgWCwgZXZlbiB1c2luZyBIRlMrLgogIFRoYW5rcyB0byBTdGV2ZW4gTWFqZXdza2khCgotIDIuMSBzaG91bGQgY29tcGlsZSBhbmQgcnVuIG91dCBvZiB0aGUgYm94IG9uIEN5Z3dpbi4gIFRoYW5rcyB0byBKYXNvbgogIFRpc2hsZXIhCgotIDIuMSBjb250YWlucyBuZXcgZmlsZXMgYW5kIHBhdGNoZXMgZm9yIFJJU0NPUywgdGhhbmtzIHRvIERpZXRtYXIKICBTY2h3ZXJ0YmVyZ2VyISAgU2VlIFJJU0NPUy9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24gLS0gaXQgc2VlbXMKICB0aGF0IGJlY2F1c2Ugb2YgdGhlIGJpemFycmUgZmlsZW5hbWUgY29udmVudGlvbnMgb24gUklTQ09TLCBubyBwb3J0CiAgdG8gdGhhdCBwbGF0Zm9ybSBpcyBlYXN5LgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMSBhbHBoYSAyPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gU2NvcGVzIG5lc3QuICBJZiBhIG5hbWUgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzLCBidXQgaXMgbm90CiAgbG9jYWwsIHRoZSBkZWZpbml0aW9uIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZSB3aWxsCiAgYmUgdXNlZC4gIE9uZSBjb25zZXF1ZW5jZSBvZiB0aGlzIGNoYW5nZSBpcyB0aGF0IGxhbWJkYSBzdGF0ZW1lbnRzCiAgY291bGQgcmVmZXJlbmNlIHZhcmlhYmxlcyBpbiB0aGUgbmFtZXNwYWNlcyB3aGVyZSB0aGUgbGFtYmRhIGlzCiAgZGVmaW5lZC4gIEluIHNvbWUgdW51c3VhbCBjYXNlcywgdGhpcyBjaGFuZ2Ugd2lsbCBicmVhayBjb2RlLgoKICBJbiBhbGwgcHJldmlvdXMgdmVyc2lvbiBvZiBQeXRob24sIG5hbWVzIHdlcmUgcmVzb2x2ZWQgaW4gZXhhY3RseQogIHRocmVlIG5hbWVzcGFjZXMgLS0gdGhlIGxvY2FsIG5hbWVzcGFjZSwgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGFuZAogIHRoZSBidWlsdGluIG5hbWVzcGFjZS4gIEFjY29yZGluZyB0byB0aGlzIG9sZCBkZWZpbml0aW9uLCBpZiBhCiAgZnVuY3Rpb24gQSBpcyBkZWZpbmVkIHdpdGhpbiBhIGZ1bmN0aW9uIEIsIHRoZSBuYW1lcyBib3VuZCBpbiBCIGFyZQogIG5vdCB2aXNpYmxlIGluIEEuICBUaGUgbmV3IHJ1bGVzIG1ha2UgbmFtZXMgYm91bmQgaW4gQiB2aXNpYmxlIGluIEEsCiAgdW5sZXNzIEEgY29udGFpbnMgYSBuYW1lIGJpbmRpbmcgdGhhdCBoaWRlcyB0aGUgYmluZGluZyBpbiBCLgoKICBTZWN0aW9uIDQuMSBvZiB0aGUgcmVmZXJlbmNlIG1hbnVhbCBkZXNjcmliZXMgdGhlIG5ldyBzY29waW5nIHJ1bGVzCiAgaW4gZGV0YWlsLiAgVGhlIHRlc3Qgc2NyaXB0IGluIExpYi90ZXN0L3Rlc3Rfc2NvcGUucHkgZGVtb25zdHJhdGVzCiAgc29tZSBvZiB0aGUgZWZmZWN0cyBvZiB0aGUgY2hhbmdlLgoKICBUaGUgbmV3IHJ1bGVzIHdpbGwgY2F1c2UgZXhpc3RpbmcgY29kZSB0byBicmVhayBpZiBpdCBkZWZpbmVzIG5lc3RlZAogIGZ1bmN0aW9ucyB3aGVyZSBhbiBvdXRlciBmdW5jdGlvbiBoYXMgbG9jYWwgdmFyaWFibGVzIHdpdGggdGhlIHNhbWUKICBuYW1lIGFzIGdsb2JhbHMgb3IgYnVpbHRpbnMgdXNlZCBieSB0aGUgaW5uZXIgZnVuY3Rpb24uICBFeGFtcGxlOgoKICAgIGRlZiBtdW5nZShzdHIpOgogICAgICAgIGRlZiBoZWxwZXIoeCk6CiAgICAgICAgICAgIHJldHVybiBzdHIoeCkKICAgICAgICBpZiB0eXBlKHN0cikgIT0gdHlwZSgnJyk6CiAgICAgICAgICAgIHN0ciA9IGhlbHBlcihzdHIpCiAgICAgICAgcmV0dXJuIHN0ci5zdHJpcCgpCgogIFVuZGVyIHRoZSBvbGQgcnVsZXMsIHRoZSBuYW1lIHN0ciBpbiBoZWxwZXIoKSBpcyBib3VuZCB0byB0aGUKICBidWlsdGluIGZ1bmN0aW9uIHN0cigpLiAgVW5kZXIgdGhlIG5ldyBydWxlcywgaXQgd2lsbCBiZSBib3VuZCB0bwogIHRoZSBhcmd1bWVudCBuYW1lZCBzdHIgYW5kIGFuIGVycm9yIHdpbGwgb2NjdXIgd2hlbiBoZWxwZXIoKSBpcwogIGNhbGxlZC4KCi0gVGhlIGNvbXBpbGVyIHdpbGwgcmVwb3J0IGEgU3ludGF4RXJyb3IgaWYgImZyb20gLi4uIGltcG9ydCAqIiBvY2N1cnMKICBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIHNjb3BlLiAgVGhlIGxhbmd1YWdlIHJlZmVyZW5jZSBoYXMgZG9jdW1lbnRlZAogIHRoYXQgdGhpcyBjYXNlIGlzIGlsbGVnYWwsIGJ1dCB0aGUgY29tcGlsZXIgbmV2ZXIgY2hlY2tlZCBmb3IgaXQuCiAgVGhlIHJlY2VudCBpbnRyb2R1Y3Rpb24gb2YgbmVzdGVkIHNjb3BlIG1ha2VzIHRoZSBtZWFuaW5nIG9mIHRoaXMKICBmb3JtIG9mIG5hbWUgYmluZGluZyBhbWJpZ3VvdXMuICBJbiBhIGZ1dHVyZSByZWxlYXNlLCB0aGUgY29tcGlsZXIKICBtYXkgYWxsb3cgdGhpcyBmb3JtIHdoZW4gdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgb2YgYW1iaWd1aXR5LgoKLSByZXByKHN0cmluZykgaXMgZWFzaWVyIHRvIHJlYWQsIG5vdyB1c2luZyBoZXggZXNjYXBlcyBpbnN0ZWFkIG9mIG9jdGFsLAogIGFuZCB1c2luZyBcdCwgXG4gYW5kIFxyIGluc3RlYWQgb2YgXDAxMSwgXDAxMiBhbmQgXDAxNSAocmVzcGVjdGl2ZWx5KToKCiAgPj4+ICJcdGV4YW1wbGUgXHJcbiIgKyBjaHIoMCkgKyBjaHIoMjU1KQogICdcdGV4YW1wbGUgXHJcblx4MDBceGZmJyAgICAgICAgICMgaW4gMi4xCiAgJ1wwMTFleGFtcGxlIFwwMTVcMDEyXDAwMFwzNzcnICAgIyBpbiAyLjAKCi0gRnVuY3Rpb25zIGFyZSBub3cgY29tcGFyZWQgYW5kIGhhc2hlZCBieSBpZGVudGl0eSwgbm90IGJ5IHZhbHVlLCBzaW5jZQogIHRoZSBmdW5jX2NvZGUgYXR0cmlidXRlIGlzIHdyaXRhYmxlLgoKLSBXZWFrIHJlZmVyZW5jZXMgKFBFUCAyMDUpIGhhdmUgYmVlbiBhZGRlZC4gIFRoaXMgaW52b2x2ZXMgYSBmZXcKICBjaGFuZ2VzIGluIHRoZSBjb3JlLCBhbiBleHRlbnNpb24gbW9kdWxlIChfd2Vha3JlZiksIGFuZCBhIFB5dGhvbgogIG1vZHVsZSAod2Vha3JlZikuICBUaGUgd2Vha3JlZiBtb2R1bGUgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UuICBJdAogIGluY2x1ZGVzIHN1cHBvcnQgZm9yICJleHBsaWNpdCIgd2VhayByZWZlcmVuY2VzLCBwcm94eSBvYmplY3RzLCBhbmQKICBtYXBwaW5ncyB3aXRoIHdlYWtseSBoZWxkIHZhbHVlcy4KCi0gQSAnY29udGludWUnIHN0YXRlbWVudCBjYW4gbm93IGFwcGVhciBpbiBhIHRyeSBibG9jayB3aXRoaW4gdGhlIGJvZHkKICBvZiBhIGxvb3AuICBJdCBpcyBzdGlsbCBub3QgcG9zc2libGUgdG8gdXNlIGNvbnRpbnVlIGluIGEgZmluYWxseQogIGNsYXVzZS4KClN0YW5kYXJkIGxpYnJhcnkKCi0gbWFpbGJveC5weSBub3cgaGFzIGEgbmV3IGNsYXNzLCBQb3J0YWJsZVVuaXhNYWlsYm94IHdoaWNoIGlzCiAgaWRlbnRpY2FsIHRvIFVuaXhNYWlsYm94IGJ1dCB1c2VzIGEgbW9yZSBwb3J0YWJsZSBzY2hlbWUgZm9yCiAgZGV0ZXJtaW5pbmcgRnJvbV8gc2VwYXJhdG9ycy4gIEFsc28sIHRoZSBjb25zdHJ1Y3RvcnMgZm9yIGFsbCB0aGUKICBjbGFzc2VzIGluIHRoaXMgbW9kdWxlIGhhdmUgYSBuZXcgb3B0aW9uYWwgYGZhY3RvcnknIGFyZ3VtZW50LCB3aGljaAogIGlzIGEgY2FsbGFibGUgdXNlZCB3aGVuIG5ldyBtZXNzYWdlIGNsYXNzZXMgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYnkKICB0aGUgbmV4dCgpIG1ldGhvZC4KCi0gcmFuZG9tLnB5IGlzIG5vdyBzZWxmLWNvbnRhaW5lZCwgYW5kIG9mZmVycyBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgb2YKICB0aGUgbm93LWRlcHJlY2F0ZWQgd2hyYW5kb20ucHkuICBTZWUgdGhlIGRvY3MgZm9yIGRldGFpbHMuICByYW5kb20ucHkKICBhbHNvIHN1cHBvcnRzIG5ldyBmdW5jdGlvbnMgZ2V0c3RhdGUoKSBhbmQgc2V0c3RhdGUoKSwgZm9yIHNhdmluZwogIGFuZCByZXN0b3JpbmcgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBnZW5lcmF0b3I7IGFuZCBqdW1wYWhlYWQobiksCiAgZm9yIHF1aWNrbHkgZm9yY2luZyB0aGUgaW50ZXJuYWwgc3RhdGUgdG8gYmUgdGhlIHNhbWUgYXMgaWYgbiBjYWxscyB0bwogIHJhbmRvbSgpIGhhZCBiZWVuIG1hZGUuICBUaGUgbGF0dGVyIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIG11bHRpLQogIHRocmVhZGVkIHByb2dyYW1zLCBjcmVhdGluZyBvbmUgaW5zdGFuY2Ugb2YgdGhlIHJhbmRvbS5SYW5kb20oKSBjbGFzcyBmb3IKICBlYWNoIHRocmVhZCwgdGhlbiB1c2luZyAuanVtcGFoZWFkKCkgdG8gZm9yY2UgZWFjaCBpbnN0YW5jZSB0byB1c2UgYQogIG5vbi1vdmVybGFwcGluZyBzZWdtZW50IG9mIHRoZSBmdWxsIHBlcmlvZC4KCi0gcmFuZG9tLnB5J3Mgc2VlZCgpIGZ1bmN0aW9uIGlzIG5ldy4gIEZvciBiaXQtZm9yLWJpdCBjb21wYXRpYmlsaXR5IHdpdGgKICBwcmlvciByZWxlYXNlcywgdXNlIHRoZSB3aHNlZWQgZnVuY3Rpb24gaW5zdGVhZC4gIFRoZSBuZXcgc2VlZCBmdW5jdGlvbgogIGFkZHJlc3NlcyB0d28gcHJvYmxlbXM6ICAoMSkgVGhlIG9sZCBmdW5jdGlvbiBjb3VsZG4ndCBwcm9kdWNlIG1vcmUgdGhhbgogIGFib3V0IDIqKjI0IGRpc3RpbmN0IGludGVybmFsIHN0YXRlczsgdGhlIG5ldyBvbmUgYWJvdXQgMioqNDUgKHRoZSBiZXN0CiAgdGhhdCBjYW4gYmUgZG9uZSBpbiB0aGUgV2ljaG1hbm4tSGlsbCBnZW5lcmF0b3IpLiAgKDIpIFRoZSBvbGQgZnVuY3Rpb24KICBzb21ldGltZXMgcHJvZHVjZWQgaWRlbnRpY2FsIGludGVybmFsIHN0YXRlcyB3aGVuIHBhc3NlZCBkaXN0aW5jdAogIGludGVnZXJzLCBhbmQgdGhlcmUgd2FzIG5vIHNpbXBsZSB3YXkgdG8gcHJlZGljdCB3aGVuIHRoYXQgd291bGQgaGFwcGVuOwogIHRoZSBuZXcgb25lIGd1YXJhbnRlZXMgdG8gcHJvZHVjZSBkaXN0aW5jdCBpbnRlcm5hbCBzdGF0ZXMgZm9yIGFsbAogIGFyZ3VtZW50cyBpbiBbMCwgMjc4MTQ0MzE0ODY1NzZMKS4KCi0gVGhlIHNvY2tldCBtb2R1bGUgbm93IHN1cHBvcnRzIHJhdyBwYWNrZXRzIG9uIExpbnV4LiAgVGhlIHNvY2tldAogIGZhbWlseSBpcyBBRl9QQUNLRVQuCgotIHRlc3RfY2FwaS5weSBpcyBhIHN0YXJ0IGF0IHJ1bm5pbmcgdGVzdHMgb2YgdGhlIFB5dGhvbiBDIEFQSS4gIFRoZSB0ZXN0cwogIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgbmV3IE1vZHVsZXMvX3Rlc3Rtb2R1bGUuYy4KCi0gQSBuZXcgZXh0ZW5zaW9uIG1vZHVsZSwgX3N5bXRhYmxlLCBwcm92aWRlcyBwcm92aXNpb25hbCBhY2Nlc3MgdG8gdGhlCiAgaW50ZXJuYWwgc3ltYm9sIHRhYmxlIHVzZWQgYnkgdGhlIFB5dGhvbiBjb21waWxlci4gIEEgaGlnaGVyLWxldmVsCiAgaW50ZXJmYWNlIHdpbGwgYmUgYWRkZWQgb24gdG9wIG9mIF9zeW10YWJsZSBpbiBhIGZ1dHVyZSByZWxlYXNlLgoKLSBSZW1vdmVkIHRoZSBvYnNvbGV0ZSBzb3VuZGV4IG1vZHVsZS4KCi0geG1sLmRvbS5taW5pZG9tIG5vdyB1c2VzIHRoZSBzdGFuZGFyZCBET00gZXhjZXB0aW9ucy4gTm9kZSBzdXBwb3J0cwogIHRoZSBpc1NhbWVOb2RlIG1ldGhvZDsgTmFtZWROb2RlTWFwIHRoZSBnZXQgbWV0aG9kLgoKLSB4bWwuc2F4LmV4cGF0cmVhZGVyIHN1cHBvcnRzIHRoZSBsZXhpY2FsIGhhbmRsZXIgcHJvcGVydHk7IGl0CiAgZ2VuZXJhdGVzIGNvbW1lbnQsIHN0YXJ0Q0RBVEEsIGFuZCBlbmRDREFUQSBldmVudHMuCgpXaW5kb3dzIGNoYW5nZXMKCi0gQnVpbGQgcHJvY2VkdXJlOiAgdGhlIHpsaWIgcHJvamVjdCBpcyBidWlsdCBpbiBhIGRpZmZlcmVudCB3YXkgdGhhdAogIGVuc3VyZXMgdGhlIHpsaWIgaGVhZGVyIGZpbGVzIHVzZWQgY2FuIG5vIGxvbmdlciBnZXQgb3V0IG9mIHN5bmNoIHdpdGgKICB0aGUgemxpYiBiaW5hcnkgdXNlZC4gIFNlZSBQQ2J1aWxkXHJlYWRtZS50eHQgZm9yIGRldGFpbHMuICBZb3VyIG9sZAogIHpsaWItcmVsYXRlZCBkaXJlY3RvcmllcyBjYW4gYmUgZGVsZXRlZDsgeW91J2xsIG5lZWQgdG8gZG93bmxvYWQgZnJlc2gKICBzb3VyY2UgZm9yIHpsaWIgYW5kIHVucGFjayBpdCBpbnRvIGEgbmV3IGRpcmVjdG9yeS4KCi0gQnVpbGQ6ICBOZXcgc3VicHJvamVjdCBfdGVzdCBmb3IgdGhlIGJlbmVmaXQgb2YgdGVzdF9jYXBpLnB5IChzZWUgYWJvdmUpLgoKLSBCdWlsZDogIE5ldyBzdWJwcm9qZWN0IF9zeW10YWJsZSwgZm9yIG5ldyBETEwgX3N5bXRhYmxlLnB5ZCAoYSBuYXNjZW50CiAgaW50ZXJmYWNlIHRvIHNvbWUgUHl0aG9uIGNvbXBpbGVyIGludGVybmFscykuCgotIEJ1aWxkOiAgU3VicHJvamVjdCB1Y25oYXNoIGlzIGdvbmUsIHNpbmNlIHRoZSBjb2RlIHdhcyBmb2xkZWQgaW50byB0aGUKICB1bmljb2RlZGF0YSBzdWJwcm9qZWN0LgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xIGFscGhhIDE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZSBsYW5ndWFnZSwgYnVpbHRpbnMsIGFuZCBpbnRlcnByZXRlcgoKLSBUaGVyZSBpcyBhIG5ldyBVbmljb2RlIGNvbXBhbmlvbiB0byB0aGUgUHlPYmplY3RfU3RyKCkgQVBJCiAgY2FsbGVkIFB5T2JqZWN0X1VuaWNvZGUoKS4gSXQgYmVoYXZlcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlCiAgZm9ybWVyLCBidXQgYXNzdXJlcyB0aGF0IHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbiBVbmljb2RlIG9iamVjdAogIChhcHBseWluZyB0aGUgdXN1YWwgY29lcmNpb24gaWYgbmVjZXNzYXJ5KS4KCi0gVGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIHN1cHBvcnQgInJpY2ggY29tcGFyaXNvbiBvdmVybG9hZGluZyIgKFBFUAogIDIwNykuICBDIGV4dGVuc2lvbiB0eXBlcyBjYW4gcHJvdmlkZSBhIHJpY2ggY29tcGFyaXNvbiBmdW5jdGlvbiBpbgogIHRoZSBuZXcgdHBfcmljaGNvbXBhcmUgc2xvdCBpbiB0aGUgdHlwZSBvYmplY3QuICBUaGUgY21wKCkgZnVuY3Rpb24KICBhbmQgdGhlIEMgZnVuY3Rpb24gUHlPYmplY3RfQ29tcGFyZSgpIGZpcnN0IHRyeSB0aGUgbmV3IHJpY2gKICBjb21wYXJpc29uIG9wZXJhdG9ycyBiZWZvcmUgdHJ5aW5nIHRoZSBvbGQgMy13YXkgY29tcGFyaXNvbi4gIFRoZXJlCiAgaXMgYWxzbyBhIG5ldyBDIEFQSSBQeU9iamVjdF9SaWNoQ29tcGFyZSgpICh3aGljaCBhbHNvIGZhbGxzIGJhY2sgb24KICB0aGUgb2xkIDMtd2F5IGNvbXBhcmlzb24sIGJ1dCBkb2VzIG5vdCBjb25zdHJhaW4gdGhlIG91dGNvbWUgb2YgdGhlCiAgcmljaCBjb21wYXJpc29uIHRvIGEgQm9vbGVhbiByZXN1bHQpLgoKICBUaGUgcmljaCBjb21wYXJpc29uIGZ1bmN0aW9uIHRha2VzIHR3byBvYmplY3RzIChhdCBsZWFzdCBvbmUgb2YKICB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIHR5cGUgdGhhdCBwcm92aWRlZCB0aGUgZnVuY3Rpb24pIGFuZAogIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3Bjb2RlLCB3aGljaCBjYW4gYmUgUHlfTFQsIFB5X0xFLCBQeV9FUSwKICBQeV9ORSwgUHlfR1QsIFB5X0dFIChmb3IgPCwgPD0sID09LCAhPSwgPiwgPj0pLCBhbmQgcmV0dXJucyBhIFB5dGhvbgogIG9iamVjdCwgd2hpY2ggbWF5IGJlIE5vdEltcGxlbWVudGVkIChpbiB3aGljaCBjYXNlIHRoZSB0cF9jb21wYXJlCiAgc2xvdCBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgZmFsbGJhY2ssIGlmIGRlZmluZWQpLgoKICBDbGFzc2VzIGNhbiBvdmVybG9hZCBpbmRpdmlkdWFsIGNvbXBhcmlzb24gb3BlcmF0b3JzIGJ5IGRlZmluaW5nIG9uZQogIG9yIG1vcmUgb2YgdGhlIG1ldGhvZHNfX2x0X18sIF9fbGVfXywgX19lcV9fLCBfX25lX18sIF9fZ3RfXywKICBfX2dlX18uICBUaGVyZSBhcmUgbm8gZXhwbGljaXQgInJlZmxlY3RlZCBhcmd1bWVudCIgdmVyc2lvbnMgb2YKICB0aGVzZTsgaW5zdGVhZCwgX19sdF9fIGFuZCBfX2d0X18gYXJlIGVhY2ggb3RoZXIncyByZWZsZWN0aW9uLAogIGxpa2V3aXNlIGZvcl9fbGVfXyBhbmQgX19nZV9fOyBfX2VxX18gYW5kIF9fbmVfXyBhcmUgdGhlaXIgb3duCiAgcmVmbGVjdGlvbiAoc2ltaWxhciBhdCB0aGUgQyBsZXZlbCkuICBObyBvdGhlciBpbXBsaWNhdGlvbnMgYXJlCiAgbWFkZTsgaW4gcGFydGljdWxhciwgUHl0aG9uIGRvZXMgbm90IGFzc3VtZSB0aGF0ID09IGlzIHRoZSBCb29sZWFuCiAgaW52ZXJzZSBvZiAhPSwgb3IgdGhhdCA8IGlzIHRoZSBCb29sZWFuIGludmVyc2Ugb2YgPj0uICBUaGlzIG1ha2VzCiAgaXQgcG9zc2libGUgdG8gZGVmaW5lIHR5cGVzIHdpdGggcGFydGlhbCBvcmRlcmluZ3MuCgogIENsYXNzZXMgb3IgdHlwZXMgdGhhdCB3YW50IHRvIGltcGxlbWVudCAoaW4pZXF1YWxpdHkgdGVzdHMgYnV0IG5vdAogIHRoZSBvcmRlcmluZyBvcGVyYXRvcnMgKGkuZS4gdW5vcmRlcmVkIHR5cGVzKSBzaG91bGQgaW1wbGVtZW50ID09CiAgYW5kICE9LCBhbmQgcmFpc2UgYW4gZXJyb3IgZm9yIHRoZSBvcmRlcmluZyBvcGVyYXRvcnMuCgogIEl0IGlzIHBvc3NpYmxlIHRvIGRlZmluZSB0eXBlcyB3aG9zZSByaWNoIGNvbXBhcmlzb24gcmVzdWx0cyBhcmUgbm90CiAgQm9vbGVhbjsgZS5nLiBhIG1hdHJpeCB0eXBlIG1pZ2h0IHdhbnQgdG8gcmV0dXJuIGEgbWF0cml4IG9mIGJpdHMKICBmb3IgQSA8IEIsIGdpdmluZyBlbGVtZW50d2lzZSBjb21wYXJpc29ucy4gIFN1Y2ggdHlwZXMgc2hvdWxkIGVuc3VyZQogIHRoYXQgYW55IGludGVycHJldGF0aW9uIG9mIHRoZWlyIHZhbHVlIGluIGEgQm9vbGVhbiBjb250ZXh0IHJhaXNlcwogIGFuIGV4Y2VwdGlvbiwgZS5nLiBieSBkZWZpbmluZyBfX25vbnplcm9fXyAob3IgdGhlIHRwX25vbnplcm8gc2xvdAogIGF0IHRoZSBDIGxldmVsKSB0byBhbHdheXMgcmFpc2UgYW4gZXhjZXB0aW9uLgoKLSBDb21wbGV4IG51bWJlcnMgdXNlIHJpY2ggY29tcGFyaXNvbnMgdG8gZGVmaW5lID09IGFuZCAhPSBidXQgcmFpc2UKICBhbiBleGNlcHRpb24gZm9yIDwsIDw9LCA+IGFuZCA+PS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBtZWFucwogIHRoYXQgY21wKCkgb2YgdHdvIGNvbXBsZXggbnVtYmVycyByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gdGhlIHR3bwogIG51bWJlcnMgZGlmZmVyLiAgU2luY2UgaXQgaXMgbm90IG1hdGhlbWF0aWNhbGx5IG1lYW5pbmdmdWwgdG8gY29tcGFyZQogIGNvbXBsZXggbnVtYmVycyBleGNlcHQgZm9yIGVxdWFsaXR5LCBJIGhvcGUgdGhhdCB0aGlzIGRvZXNuJ3QgYnJlYWsKICB0b28gbXVjaCBjb2RlLgoKLSBUaGUgb3V0Y29tZSBvZiBjb21wYXJpbmcgbm9uLW51bWVyaWMgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgaXMKICBub3QgZGVmaW5lZCBieSB0aGUgbGFuZ3VhZ2UsIG90aGVyIHRoYW4gdGhhdCBpdCdzIGFyYml0cmFyeSBidXQKICBjb25zaXN0ZW50IChzZWUgdGhlIFJlZmVyZW5jZSBNYW51YWwpLiAgQW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIGNoYW5nZWQKICBpbiAyLjFhMSBzdWNoIHRoYXQgTm9uZSBub3cgY29tcGFyZXMgbGVzcyB0aGFuIGFueSBvdGhlciBvYmplY3QuICBDb2RlCiAgcmVseWluZyBvbiB0aGlzIG5ldyBiZWhhdmlvciAobGlrZSBjb2RlIHRoYXQgcmVsaWVkIG9uIHRoZSBwcmV2aW91cwogIGJlaGF2aW9yKSBkb2VzIHNvIGF0IGl0cyBvd24gcmlzay4KCi0gRnVuY3Rpb25zIGFuZCBtZXRob2RzIG5vdyBzdXBwb3J0IGdldHRpbmcgYW5kIHNldHRpbmcgYXJiaXRyYXJpbHkKICBuYW1lZCBhdHRyaWJ1dGVzIChQRVAgMjMyKS4gIEZ1bmN0aW9ucyBoYXZlIGEgbmV3IF9fZGljdF9fCiAgKGEuay5hLiBmdW5jX2RpY3QpIHdoaWNoIGhvbGQgdGhlIGZ1bmN0aW9uIGF0dHJpYnV0ZXMuICBNZXRob2RzIGdldAogIGFuZCBzZXQgYXR0cmlidXRlcyBvbiB0aGVpciB1bmRlcmx5aW5nIGltX2Z1bmMuICBJdCBpcyBhIFR5cGVFcnJvcgogIHRvIHNldCBhbiBhdHRyaWJ1dGUgb24gYSBib3VuZCBtZXRob2QuCgotIFRoZSB4cmFuZ2UoKSBvYmplY3QgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gaW1wcm92ZWQgc28gdGhhdAogIHhyYW5nZShzeXMubWF4aW50KSBjYW4gYmUgdXNlZCBvbiA2NC1iaXQgcGxhdGZvcm1zLiAgVGhlcmUncyBzdGlsbCBhCiAgbGltaXRhdGlvbiB0aGF0IGluIHRoaXMgY2FzZSBsZW4oeHJhbmdlKHN5cy5tYXhpbnQpKSBjYW4ndCBiZQogIGNhbGN1bGF0ZWQsIGJ1dCB0aGUgY29tbW9uIGlkaW9tICJmb3IgaSBpbiB4cmFuZ2Uoc3lzLm1heGludCkiIHdpbGwKICB3b3JrIGZpbmUgYXMgbG9uZyBhcyB0aGUgaW5kZXggaSBkb2Vzbid0IGFjdHVhbGx5IHJlYWNoIDIqKjMxLgogIChQeXRob24gdXNlcyByZWd1bGFyIGludHMgZm9yIHNlcXVlbmNlIGFuZCBzdHJpbmcgaW5kaWNlczsgZml4aW5nCiAgdGhhdCBpcyBtdWNoIG1vcmUgd29yay4pCgotIFR3byBjaGFuZ2VzIHRvIGZyb20uLi5pbXBvcnQ6CgogIDEpICJmcm9tIE0gaW1wb3J0IFgiIG5vdyB3b3JrcyBldmVuIGlmIChhZnRlciBsb2FkaW5nIG1vZHVsZSBNKQogICAgIHN5cy5tb2R1bGVzWydNJ10gaXMgbm90IGEgcmVhbCBtb2R1bGU7IGl0J3MgYmFzaWNhbGx5IGEgZ2V0YXR0cigpCiAgICAgb3BlcmF0aW9uIHdpdGggQXR0cmlidXRlRXJyb3IgZXhjZXB0aW9ucyBjaGFuZ2VkIGludG8gSW1wb3J0RXJyb3IuCgogIDIpICJmcm9tIE0gaW1wb3J0ICoiIG5vdyBsb29rcyBmb3IgTS5fX2FsbF9fIHRvIGRlY2lkZSB3aGljaCBuYW1lcyB0bwogICAgIGltcG9ydDsgaWYgTS5fX2FsbF9fIGRvZXNuJ3QgZXhpc3QsIGl0IHVzZXMgTS5fX2RpY3RfXy5rZXlzKCkgYnV0CiAgICAgZmlsdGVycyBvdXQgbmFtZXMgc3RhcnRpbmcgd2l0aCAnXycgYXMgYmVmb3JlLiAgV2hldGhlciBvciBub3QKICAgICBfX2FsbF9fIGV4aXN0cywgdGhlcmUncyBubyByZXN0cmljdGlvbiBvbiB0aGUgdHlwZSBvZiBNLgoKLSBGaWxlIG9iamVjdHMgaGF2ZSBhIG5ldyBtZXRob2QsIHhyZWFkbGluZXMoKS4gIFRoaXMgaXMgdGhlIGZhc3Rlc3QKICB3YXkgdG8gaXRlcmF0ZSBvdmVyIGFsbCBsaW5lcyBpbiBhIGZpbGU6CgogIGZvciBsaW5lIGluIGZpbGUueHJlYWRsaW5lcygpOgogICAgICAuLi5kbyBzb21ldGhpbmcgdG8gbGluZS4uLgoKICBTZWUgdGhlIHhyZWFkbGluZXMgbW9kdWxlIChtZW50aW9uZWQgYmVsb3cpIGZvciBob3cgdG8gZG8gdGhpcyBmb3IKICBvdGhlciBmaWxlLWxpa2Ugb2JqZWN0cy4KCi0gRXZlbiBpZiB5b3UgZG9uJ3QgdXNlIGZpbGUueHJlYWRsaW5lcygpLCB5b3UgbWF5IGV4cGVjdCBhIHNwZWVkdXAgb24KICBsaW5lLWJ5LWxpbmUgaW5wdXQuICBUaGUgZmlsZS5yZWFkbGluZSgpIG1ldGhvZCBoYXMgYmVlbiBvcHRpbWl6ZWQKICBxdWl0ZSBhIGJpdCBpbiBwbGF0Zm9ybS1zcGVjaWZpYyB3YXlzOiAgb24gc3lzdGVtcyAobGlrZSBMaW51eCkgdGhhdAogIHN1cHBvcnQgZmxvY2tmaWxlKCksIGdldGNfdW5sb2NrZWQoKSwgYW5kIGZ1bmxvY2tmaWxlKCksIHRob3NlIGFyZQogIHVzZWQgYnkgZGVmYXVsdC4gIE9uIHN5c3RlbXMgKGxpa2UgV2luZG93cykgd2l0aG91dCBnZXRjX3VubG9ja2VkKCksCiAgYSBjb21wbGljYXRlZCAoYnV0IHN0aWxsIHRocmVhZC1zYWZlKSBtZXRob2QgdXNpbmcgZmdldHMoKSBpcyB1c2VkIGJ5CiAgZGVmYXVsdC4KCiAgWW91IGNhbiBmb3JjZSB1c2Ugb2YgdGhlIGZnZXRzKCkgbWV0aG9kIGJ5ICNkZWZpbmUnaW5nCiAgVVNFX0ZHRVRTX0lOX0dFVExJTkUgYXQgYnVpbGQgdGltZSAoaXQgbWF5IGJlIGZhc3RlciB0aGFuCiAgZ2V0Y191bmxvY2tlZCgpKS4KCiAgWW91IGNhbiBmb3JjZSBmZ2V0cygpIG5vdCB0byBiZSB1c2VkIGJ5ICNkZWZpbmUnaW5nCiAgRE9OVF9VU0VfRkdFVFNfSU5fR0VUTElORSAodGhpcyBpcyB0aGUgZmlyc3QgdGhpbmcgdG8gdHJ5IGlmIHN0ZCB0ZXN0CiAgdGVzdF9idWZpby5weSBmYWlscyAtLSBhbmQgbGV0IHVzIGtub3cgaWYgaXQgZG9lcyEpLgoKLSBJbiBhZGRpdGlvbiwgdGhlIGZpbGVpbnB1dCBtb2R1bGUsIHdoaWxlIHN0aWxsIHNsb3dlciB0aGFuIHRoZSBvdGhlcgogIG1ldGhvZHMgb24gbW9zdCBwbGF0Zm9ybXMsIGhhcyBiZWVuIHNwZWQgdXAgdG9vLCBieSB1c2luZwogIGZpbGUucmVhZGxpbmVzKHNpemVoaW50KS4KCi0gU3VwcG9ydCBmb3IgcnVuLXRpbWUgd2FybmluZ3MgaGFzIGJlZW4gYWRkZWQsIGluY2x1ZGluZyBhIG5ldwogIGNvbW1hbmQgbGluZSBvcHRpb24gKC1XKSB0byBzcGVjaWZ5IHRoZSBkaXNwb3NpdGlvbiBvZiB3YXJuaW5ncy4KICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB3YXJuaW5ncyBtb2R1bGUgYmVsb3cuCgotIEV4dGVuc2l2ZSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb2VyY2lvbiBjb2RlLiAgVGhpcyBtb3N0bHkKICBhZmZlY3RzIGV4dGVuc2lvbiBtb2R1bGVzICh3aGljaCBjYW4gbm93IGltcGxlbWVudCBtaXhlZC10eXBlCiAgbnVtZXJpY2FsIG9wZXJhdG9ycyB3aXRob3V0IGhhdmluZyB0byB1c2UgY29lcmNpb24pLCBidXQKICBvY2Nhc2lvbmFsbHksIGluIGJvdW5kYXJ5IGNhc2VzIHRoZSBjb2VyY2lvbiBzZW1hbnRpY3MgaGF2ZSBjaGFuZ2VkCiAgc3VidGx5LiAgU2luY2UgdGhpcyB3YXMgYSB0ZXJyaWJsZSBncmF5IGFyZWEgb2YgdGhlIGxhbmd1YWdlLCB0aGlzCiAgaXMgY29uc2lkZXJlZCBhbiBpbXByb3ZlbWVudC4gIEFsc28gbm90ZSB0aGF0IF9fcmNtcF9fIGlzIG5vIGxvbmdlcgogIHN1cHBvcnRlZCAtLSBpbnN0ZWFkIG9mIGNhbGxpbmcgX19yY21wX18sIF9fY21wX18gaXMgY2FsbGVkIHdpdGgKICByZWZsZWN0ZWQgYXJndW1lbnRzLgoKLSBJbiBjb25uZWN0aW9uIHdpdGggdGhlIGNvZXJjaW9uIGNoYW5nZXMsIGEgbmV3IGJ1aWx0LWluIHNpbmdsZXRvbgogIG9iamVjdCwgTm90SW1wbGVtZW50ZWQgaXMgZGVmaW5lZC4gIFRoaXMgY2FuIGJlIHJldHVybmVkIGZvcgogIG9wZXJhdGlvbnMgdGhhdCB3aXNoIHRvIGluZGljYXRlIHRoZXkgYXJlIG5vdCBpbXBsZW1lbnRlZCBmb3IgYQogIHBhcnRpY3VsYXIgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLiAgRnJvbSBDLCB0aGlzIGlzCiAgUHlfTm90SW1wbGVtZW50ZWQuCgotIFRoZSBpbnRlcnByZXRlciBhY2NlcHRzIG5vdyBieXRlY29kZSBmaWxlcyBvbiB0aGUgY29tbWFuZCBsaW5lIGV2ZW4KICBpZiB0aGV5IGRvIG5vdCBoYXZlIGEgLnB5YyBvciAucHlvIGV4dGVuc2lvbi4gT24gTGludXgsIGFmdGVyIGV4ZWN1dGluZwoKaW1wb3J0IGltcCxzeXMsc3RyaW5nCm1hZ2ljID0gc3RyaW5nLmpvaW4oWyJcXHglLjJ4IiAlIG9yZChjKSBmb3IgYyBpbiBpbXAuZ2V0X21hZ2ljKCldLCIiKQpyZWcgPSAnOnB5YzpNOjolczo6JXM6JyAlIChtYWdpYywgc3lzLmV4ZWN1dGFibGUpCm9wZW4oIi9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9yZWdpc3RlciIsIndiIikud3JpdGUocmVnKQoKICBhbnkgYnl0ZSBjb2RlIGZpbGUgY2FuIGJlIHVzZWQgYXMgYW4gZXhlY3V0YWJsZSAoaS5lLiBhcyBhbiBhcmd1bWVudAogIHRvIGV4ZWN2ZSgyKSkuCgotICVbeFhvXSBmb3JtYXRzIG9mIG5lZ2F0aXZlIFB5dGhvbiBsb25ncyBub3cgcHJvZHVjZSBhIHNpZ24KICBjaGFyYWN0ZXIuICBJbiAxLjYgYW5kIGVhcmxpZXIsIHRoZXkgbmV2ZXIgcHJvZHVjZWQgYSBzaWduLAogIGFuZCByYWlzZWQgYW4gZXJyb3IgaWYgdGhlIHZhbHVlIG9mIHRoZSBsb25nIHdhcyB0b28gbGFyZ2UKICB0byBmaXQgaW4gYSBQeXRob24gaW50LiAgSW4gMi4wLCB0aGV5IHByb2R1Y2VkIGEgc2lnbiBpZiBhbmQKICBvbmx5IGlmIHRvbyBsYXJnZSB0byBmaXQgaW4gYW4gaW50LiAgVGhpcyB3YXMgaW5jb25zaXN0ZW50CiAgYWNyb3NzIHBsYXRmb3JtcyAoYmVjYXVzZSB0aGUgc2l6ZSBvZiBhbiBpbnQgdmFyaWVzIGFjcm9zcwogIHBsYXRmb3JtcyksIGFuZCBpbmNvbnNpc3RlbnQgd2l0aCBoZXgoKSBhbmQgb2N0KCkuICBFeGFtcGxlOgoKICA+Pj4gIiV4IiAlIC0weDQyTAogICctNDInICAgICAgIyBpbiAyLjEKICAnZmZmZmZmYmUnICMgaW4gMi4wIGFuZCBiZWZvcmUsIG9uIDMyLWJpdCBtYWNoaW5lcwogID4+PiBoZXgoLTB4NDJMKQogICctMHg0MkwnICAgIyBpbiBhbGwgdmVyc2lvbnMgb2YgUHl0aG9uCgogIFRoZSBiZWhhdmlvciBvZiAlZCBmb3JtYXRzIGZvciBuZWdhdGl2ZSBQeXRob24gbG9uZ3MgcmVtYWlucwogIHRoZSBzYW1lIGFzIGluIDIuMCAoYWx0aG91Z2ggaW4gMS42IGFuZCBiZWZvcmUsIHRoZXkgcmFpc2VkCiAgYW4gZXJyb3IgaWYgdGhlIGxvbmcgZGlkbid0IGZpdCBpbiBhIFB5dGhvbiBpbnQpLgoKICAldSBmb3JtYXRzIGRvbid0IG1ha2Ugc2Vuc2UgZm9yIFB5dGhvbiBsb25ncywgYnV0IGFyZSBhbGxvd2VkCiAgYW5kIHRyZWF0ZWQgdGhlIHNhbWUgYXMgJWQgaW4gMi4xLiAgSW4gMi4wLCBhIG5lZ2F0aXZlIGxvbmcKICBmb3JtYXR0ZWQgdmlhICV1IHByb2R1Y2VkIGEgc2lnbiBpZiBhbmQgb25seSBpZiB0b28gbGFyZ2UgdG8KICBmaXQgaW4gYW4gaW50LiAgSW4gMS42IGFuZCBlYXJsaWVyLCBhIG5lZ2F0aXZlIGxvbmcgZm9ybWF0dGVkCiAgdmlhICV1IHJhaXNlZCBhbiBlcnJvciBpZiBpdCB3YXMgdG9vIGJpZyB0byBmaXQgaW4gYW4gaW50LgoKLSBEaWN0aW9uYXJ5IG9iamVjdHMgaGF2ZSBhbiBvZGQgbmV3IG1ldGhvZCwgcG9waXRlbSgpLiAgVGhpcyByZW1vdmVzCiAgYW4gYXJiaXRyYXJ5IGl0ZW0gZnJvbSB0aGUgZGljdGlvbmFyeSBhbmQgcmV0dXJucyBpdCAoaW4gdGhlIGZvcm0gb2YKICBhIChrZXksIHZhbHVlKSBwYWlyKS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgYWxnb3JpdGhtcyB0aGF0IHVzZSBhCiAgZGljdGlvbmFyeSBhcyBhIGJhZyBvZiAidG8gZG8iIGl0ZW1zIGFuZCByZXBlYXRlZGx5IG5lZWQgdG8gcGljayBvbmUKICBpdGVtLiAgU3VjaCBhbGdvcml0aG1zIG5vcm1hbGx5IGVuZCB1cCBydW5uaW5nIGluIHF1YWRyYXRpYyB0aW1lOwogIHVzaW5nIHBvcGl0ZW0oKSB0aGV5IGNhbiB1c3VhbGx5IGJlIG1hZGUgdG8gcnVuIGluIGxpbmVhciB0aW1lLgoKU3RhbmRhcmQgbGlicmFyeQoKLSBJbiB0aGUgdGltZSBtb2R1bGUsIHRoZSB0aW1lIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbnMgc3RyZnRpbWUsCiAgbG9jYWx0aW1lLCBnbXRpbWUsIGFzY3RpbWUgYW5kIGN0aW1lIGlzIG5vdyBvcHRpb25hbCwgZGVmYXVsdGluZyB0bwogIHRoZSBjdXJyZW50IHRpbWUgKGluIHRoZSBsb2NhbCB0aW1lem9uZSkuCgotIFRoZSBmdHBsaWIgbW9kdWxlIG5vdyBkZWZhdWx0cyB0byBwYXNzaXZlIG1vZGUsIHdoaWNoIGlzIGRlZW1lZCBhCiAgbW9yZSB1c2VmdWwgZGVmYXVsdCBnaXZlbiB0aGF0IGNsaWVudHMgYXJlIG9mdGVuIGluc2lkZSBmaXJld2FsbHMKICB0aGVzZSBkYXlzLiAgTm90ZSB0aGF0IHRoaXMgY291bGQgYnJlYWsgaWYgZnRwbGliIGlzIHVzZWQgdG8gY29ubmVjdAogIHRvIGEgKnNlcnZlciogdGhhdCBpcyBpbnNpZGUgYSBmaXJld2FsbCwgZnJvbSBvdXRzaWRlOyB0aGlzIGlzCiAgZXhwZWN0ZWQgdG8gYmUgYSB2ZXJ5IHJhcmUgc2l0dWF0aW9uLiAgVG8gZml4IHRoYXQsIHlvdSBjYW4gY2FsbAogIGZ0cC5zZXRfcGFzdigwKS4KCi0gVGhlIG1vZHVsZSBzaXRlIG5vdyB0cmVhdHMgLnB0aCBmaWxlcyBub3Qgb25seSBmb3IgcGF0aCBjb25maWd1cmF0aW9uLAogIGJ1dCBhbHNvIHN1cHBvcnRzIGV4dGVuc2lvbnMgdG8gdGhlIGluaXRpYWxpemF0aW9uIGNvZGU6IExpbmVzIHN0YXJ0aW5nCiAgd2l0aCBpbXBvcnQgYXJlIGV4ZWN1dGVkLgoKLSBUaGVyZSdzIGEgbmV3IG1vZHVsZSwgd2FybmluZ3MsIHdoaWNoIGltcGxlbWVudHMgYSBtZWNoYW5pc20gZm9yCiAgaXNzdWluZyBhbmQgZmlsdGVyaW5nIHdhcm5pbmdzLiAgVGhlcmUgYXJlIHNvbWUgbmV3IGJ1aWx0LWluCiAgZXhjZXB0aW9ucyB0aGF0IHNlcnZlIGFzIHdhcm5pbmcgY2F0ZWdvcmllcywgYW5kIGEgbmV3IGNvbW1hbmQgbGluZQogIG9wdGlvbiwgLVcsIHRvIGNvbnRyb2wgd2FybmluZ3MgKGUuZy4gLVdpIGlnbm9yZXMgYWxsIHdhcm5pbmdzLCAtV2UKICB0dXJucyB3YXJuaW5ncyBpbnRvIGVycm9ycykuICB3YXJuaW5ncy53YXJuKG1lc3NhZ2VbLCBjYXRlZ29yeV0pCiAgaXNzdWVzIGEgd2FybmluZyBtZXNzYWdlOyB0aGlzIGNhbiBhbHNvIGJlIGNhbGxlZCBmcm9tIEMgYXMKICBQeUVycl9XYXJuKGNhdGVnb3J5LCBtZXNzYWdlKS4KCi0gQSBuZXcgbW9kdWxlIHhyZWFkbGluZXMgd2FzIGFkZGVkLiAgVGhpcyBleHBvcnRzIGEgc2luZ2xlIGZhY3RvcnkKICBmdW5jdGlvbiwgeHJlYWRsaW5lcygpLiAgVGhlIGludGVudGlvbiBpcyB0aGF0IHRoaXMgY29kZSBpcyB0aGUKICBhYnNvbHV0ZWx5IGZhc3Rlc3Qgd2F5IHRvIGl0ZXJhdGUgb3ZlciBhbGwgbGluZXMgaW4gYW4gb3BlbgogIGZpbGUoLWxpa2UpIG9iamVjdDoKCiAgaW1wb3J0IHhyZWFkbGluZXMKICBmb3IgbGluZSBpbiB4cmVhZGxpbmVzLnhyZWFkbGluZXMoZmlsZSk6CiAgICAgIC4uLmRvIHNvbWV0aGluZyB0byBsaW5lLi4uCgogIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgcHJldmlvdXMgdGhlIHNwZWVkIHJlY29yZCBob2xkZXIgdXNpbmcKICBmaWxlLnJlYWRsaW5lcyhzaXplaGludCkuICBOb3RlIHRoYXQgaWYgZmlsZSBpcyBhIHJlYWwgZmlsZSBvYmplY3QKICAoYXMgb3Bwb3NlZCB0byBhIGZpbGUtbGlrZSBvYmplY3QpLCB0aGlzIGlzIGVxdWl2YWxlbnQ6CgogIGZvciBsaW5lIGluIGZpbGUueHJlYWRsaW5lcygpOgogICAgICAuLi5kbyBzb21ldGhpbmcgdG8gbGluZS4uLgoKLSBUaGUgYmlzZWN0IG1vZHVsZSBoYXMgbmV3IGZ1bmN0aW9ucyBiaXNlY3RfbGVmdCwgaW5zb3J0X2xlZnQsCiAgYmlzZWN0X3JpZ2h0IGFuZCBpbnNvcnRfcmlnaHQuICBUaGUgb2xkIG5hbWVzIGJpc2VjdCBhbmQgaW5zb3J0CiAgYXJlIG5vdyBhbGlhc2VzIGZvciBiaXNlY3RfcmlnaHQgYW5kIGluc29ydF9yaWdodC4gIFhYWF9yaWdodAogIGFuZCBYWFhfbGVmdCBtZXRob2RzIGRpZmZlciBpbiB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgbmV3IGVsZW1lbnQKICBjb21wYXJlcyBlcXVhbCB0byBvbmUgb3IgbW9yZSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBsaXN0OiAgdGhlCiAgWFhYX2xlZnQgbWV0aG9kcyBpbnNlcnQgdG8gdGhlIGxlZnQsIHRoZSBYWFhfcmlnaHQgbWV0aG9kcyB0byB0aGUKICByaWdodC4gIENvZGUgdGhhdCBkb2Vzbid0IGNhcmUgd2hlcmUgZXF1YWwgZWxlbWVudHMgZW5kIHVwIHNob3VsZAogIGNvbnRpbnVlIHRvIHVzZSB0aGUgb2xkLCBzaG9ydCBuYW1lcyAoImJpc2VjdCIgYW5kICJpbnNvcnQiKS4KCi0gVGhlIG5ldyBjdXJzZXMucGFuZWwgbW9kdWxlIHdyYXBzIHRoZSBwYW5lbCBsaWJyYXJ5IHRoYXQgZm9ybXMgcGFydAogIG9mIFNZU1YgY3Vyc2VzIGFuZCBuY3Vyc2VzLiAgQ29udHJpYnV0ZWQgYnkgVGhvbWFzIEdlbGxla3VtLgoKLSBUaGUgU29ja2V0U2VydmVyIG1vZHVsZSBub3cgc2V0cyB0aGUgYWxsb3dfcmV1c2VfYWRkcmVzcyBmbGFnIGJ5CiAgZGVmYXVsdCBpbiB0aGUgVENQU2VydmVyIGNsYXNzLgoKLSBBIG5ldyBmdW5jdGlvbiwgc3lzLl9nZXRmcmFtZSgpLCByZXR1cm5zIHRoZSBzdGFjayBmcmFtZSBwb2ludGVyIG9mCiAgdGhlIGNhbGxlci4gIFRoaXMgaXMgaW50ZW5kZWQgb25seSBhcyBhIGJ1aWxkaW5nIGJsb2NrIGZvcgogIGhpZ2hlci1sZXZlbCBtZWNoYW5pc21zIHN1Y2ggYXMgc3RyaW5nIGludGVycG9sYXRpb24uCgotIFRoZSBweWV4cGF0IG1vZHVsZSBzdXBwb3J0cyBhIG51bWJlciBvZiBuZXcgaGFuZGxlcnMsIHdoaWNoIGFyZQogIGF2YWlsYWJsZSBvbmx5IGluIGV4cGF0IDEuMi4gSWYgaW52b2NhdGlvbiBvZiBhIGNhbGxiYWNrIGZhaWxzLCBpdAogIHdpbGwgcmVwb3J0IGFuIGFkZGl0aW9uYWwgZnJhbWUgaW4gdGhlIHRyYWNlYmFjay4gUGFyc2VyIG9iamVjdHMKICBwYXJ0aWNpcGF0ZSBub3cgaW4gZ2FyYmFnZSBjb2xsZWN0aW9uLiBJZiBleHBhdCByZXBvcnRzIGFuIHVua25vd24KICBlbmNvZGluZywgcHlleHBhdCB3aWxsIHRyeSB0byB1c2UgYSBQeXRob24gY29kZWM7IHRoYXQgd29ya3Mgb25seQogIGZvciBzaW5nbGUtYnl0ZSBjaGFyc2V0cy4gVGhlIHBhcnNlciB0eXBlIG9iamVjdHMgaXMgZXhwb3NlZCBhcwogIFhNTFBhcnNlck9iamVjdC4KCi0geG1sLmRvbSBub3cgb2ZmZXJzIHN0YW5kYXJkIGRlZmluaXRpb25zIGZvciBzeW1ib2xpYyBub2RlIHR5cGUgYW5kCiAgZXhjZXB0aW9uIGNvZGUgY29uc3RhbnRzLCBhbmQgYSBoaWVyYXJjaHkgb2YgRE9NIGV4Y2VwdGlvbnMuIG1pbmlkb20KICB3YXMgYWRqdXN0ZWQgdG8gdXNlIHRoZW0uCgotIFRoZSBjb25mb3JtYW5jZSBvZiB4bWwuZG9tLm1pbmlkb20gdG8gdGhlIERPTSBzcGVjaWZpY2F0aW9uIHdhcwogIGltcHJvdmVkLiBJdCBkZXRlY3RzIGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgZXJyb3IgY2FzZXM7IHRoZQogIHByZXZpb3VzL25leHQgcmVsYXRpb25zaGlwIHdvcmtzIGV2ZW4gd2hlbiB0aGUgdHJlZSBpcyBtb2RpZmllZDsKICBOb2RlIHN1cHBvcnRzIHRoZSBub3JtYWxpemUoKSBtZXRob2Q7IE5hbWVkTm9kZU1hcCwgRG9jdW1lbnRUeXBlIGFuZAogIERPTUltcGxlbWVudGF0aW9uIGNsYXNzZXMgd2VyZSBhZGRlZDsgRWxlbWVudCBzdXBwb3J0cyB0aGUKICBoYXNBdHRyaWJ1dGUgYW5kIGhhc0F0dHJpYnV0ZU5TIG1ldGhvZHM7IGFuZCBUZXh0IHN1cHBvcnRzIHRoZSBzcGxpdFRleHQKICBtZXRob2QuCgpCdWlsZCBpc3N1ZXMKCi0gRm9yIFVuaXggKGFuZCBVbml4LWNvbXBhdGlibGUpIGJ1aWxkcywgY29uZmlndXJhdGlvbiBhbmQgYnVpbGRpbmcgb2YKICBleHRlbnNpb24gbW9kdWxlcyBpcyBub3cgZ3JlYXRseSBhdXRvbWF0ZWQuICBSYXRoZXIgdGhhbiBoYXZpbmcgdG8KICBlZGl0IHRoZSBNb2R1bGVzL1NldHVwIGZpbGUgdG8gaW5kaWNhdGUgd2hpY2ggbW9kdWxlcyBzaG91bGQgYmUKICBidWlsdCBhbmQgd2hlcmUgdGhlaXIgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzIGFyZSwgYQogIGRpc3R1dGlscy1iYXNlZCBzZXR1cC5weSBzY3JpcHQgbm93IHRha2VzIGNhcmUgb2YgYnVpbGRpbmcgbW9zdAogIGV4dGVuc2lvbiBtb2R1bGVzLiAgQWxsIGV4dGVuc2lvbiBtb2R1bGVzIGJ1aWx0IHRoaXMgd2F5IGFyZSBidWlsdAogIGFzIHNoYXJlZCBsaWJyYXJpZXMuICBPbmx5IGEgZmV3IG1vZHVsZXMgdGhhdCBtdXN0IGJlIGxpbmtlZAogIHN0YXRpY2FsbHkgYXJlIHN0aWxsIGxpc3RlZCBpbiB0aGUgU2V0dXAgZmlsZTsgeW91IHdvbid0IG5lZWQgdG8KICBlZGl0IHRoZWlyIGNvbmZpZ3VyYXRpb24uCgotIFB5dGhvbiBzaG91bGQgbm93IGJ1aWxkIG91dCBvZiB0aGUgYm94IG9uIEN5Z3dpbi4gIElmIGl0IGRvZXNuJ3QsCiAgbWFpbCB0byBKYXNvbiBUaXNobGVyIChqbHQ2MyBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpLgoKLSBQeXRob24gbm93IGFsd2F5cyB1c2VzIGl0cyBvd24gKHJlbmFtZWQpIGltcGxlbWVudGF0aW9uIG9mIGdldG9wdCgpCiAgLS0gdGhlcmUncyB0b28gbXVjaCB2YXJpYXRpb24gYW1vbmcgQyBsaWJyYXJ5IGdldG9wdCgpCiAgaW1wbGVtZW50YXRpb25zLgoKLSBDKysgY29tcGlsZXJzIGFyZSBiZXR0ZXIgc3VwcG9ydGVkOyB0aGUgQ1hYIG1hY3JvIGlzIGFsd2F5cyBzZXQgdG8gYQogIEMrKyBjb21waWxlciBpZiBvbmUgaXMgZm91bmQuCgpXaW5kb3dzIGNoYW5nZXMKCi0gc2VsZWN0IG1vZHVsZTogIEJ5IGRlZmF1bHQgdW5kZXIgV2luZG93cywgYSBzZWxlY3QoKSBjYWxsCiAgY2FuIHNwZWNpZnkgbm8gbW9yZSB0aGFuIDY0IHNvY2tldHMuICBQeXRob24gbm93IGJvb3N0cwogIHRoaXMgTWljcm9zb2Z0IGRlZmF1bHQgdG8gNTEyLiAgSWYgeW91IG5lZWQgZXZlbiBtb3JlIHRoYW4KICB0aGF0LCBzZWUgdGhlIE1TIGRvY3MgKHlvdSdsbCBuZWVkIHRvICNkZWZpbmUgRkRfU0VUU0laRQogIGFuZCByZWNvbXBpbGUgUHl0aG9uIGZyb20gc291cmNlKS4KCi0gU3VwcG9ydCBmb3IgV2luZG93cyAzLjEsIERPUyBhbmQgT1MvMiBpcyBnb25lLiAgVGhlIExpYi9kb3MtOHgzCiAgc3ViZGlyZWN0b3J5IGlzIG5vIG1vcmUhCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4wPwo9PT09PT09PT09PT09PT09PT09PT09PT09CgpCZWxvdyBpcyBhIGxpc3Qgb2YgYWxsIHJlbGV2YW50IGNoYW5nZXMgc2luY2UgcmVsZWFzZSAxLjYuICBPbGRlcgpjaGFuZ2VzIGFyZSBpbiB0aGUgZmlsZSBISVNUT1JZLiAgSWYgeW91IGFyZSBtYWtpbmcgdGhlIGp1bXAgZGlyZWN0bHkKZnJvbSBQeXRob24gMS41LjIgdG8gMi4wLCBtYWtlIHN1cmUgdG8gcmVhZCB0aGUgc2VjdGlvbiBmb3IgMS42IGluIHRoZQpISVNUT1JZIGZpbGUhICBNYW55IGltcG9ydGFudCBjaGFuZ2VzIGxpc3RlZCB0aGVyZS4KCkFsdGVybmF0aXZlbHksIGEgZ29vZCBvdmVydmlldyBvZiB0aGUgY2hhbmdlcyBiZXR3ZWVuIDEuNS4yIGFuZCAyLjAgaXMKdGhlIGRvY3VtZW50ICJXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjAiIGJ5IEt1Y2hsaW5nIGFuZCBNb3NoZSBaYWRrYToKaHR0cDovL3N0YXJzaGlwLnB5dGhvbi5uZXQvY3Jldy9hbWsvcHl0aG9uL3dyaXRpbmcvbmV3LXB5dGhvbi8uCgotLUd1aWRvIHZhbiBSb3NzdW0gKGhvbWUgcGFnZTogaHR0cDovL3d3dy5weXRob25sYWJzLmNvbS9+Z3VpZG8vKQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKV2hhdCdzIG5ldyBpbiAyLjAgKHNpbmNlIHJlbGVhc2UgY2FuZGlkYXRlIDEpPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTdGFuZGFyZCBsaWJyYXJ5CgotIFRoZSBjb3B5X3JlZyBtb2R1bGUgd2FzIG1vZGlmaWVkIHRvIGNsYXJpZnkgaXRzIGludGVuZGVkIHVzZTogdG8KICByZWdpc3RlciBwaWNrbGUgc3VwcG9ydCBmb3IgZXh0ZW5zaW9uIHR5cGVzLCBub3QgZm9yIGNsYXNzZXMuCiAgcGlja2xlKCkgd2lsbCByYWlzZSBhIFR5cGVFcnJvciBpZiBpdCBpcyBwYXNzZWQgYSBjbGFzcy4KCi0gRml4ZWQgYSBidWcgaW4gZ2V0dGV4dCdzICJub3JtYWxpemUgYW5kIGV4cGFuZCIgY29kZSB0aGF0IHByZXZlbnRlZAogIGl0IGZyb20gZmluZGluZyBhbiBleGlzdGluZyAubW8gZmlsZS4KCi0gUmVzdG9yZWQgc3VwcG9ydCBmb3IgSFRUUC8wLjkgc2VydmVycyBpbiBodHRwbGliLgoKLSBUaGUgbWF0aCBtb2R1bGUgd2FzIGNoYW5nZWQgdG8gc3RvcCByYWlzaW5nIE92ZXJmbG93RXJyb3IgaW4gY2FzZSBvZgogIHVuZGVyZmxvdywgYW5kIHJldHVybiAwIGluc3RlYWQgaW4gdW5kZXJmbG93IGNhc2VzLiAgV2hldGhlciBQeXRob24KICB1c2VkIHRvIHJhaXNlIE92ZXJmbG93RXJyb3IgaW4gY2FzZSBvZiB1bmRlcmZsb3cgd2FzIHBsYXRmb3JtLQogIGRlcGVuZGVudCAoaXQgZGlkIHdoZW4gdGhlIHBsYXRmb3JtIG1hdGggbGlicmFyeSBzZXQgZXJybm8gdG8gRVJBTkdFCiAgb24gdW5kZXJmbG93KS4KCi0gRml4ZWQgYSBidWcgaW4gU3RyaW5nSU8gdGhhdCBvY2N1cnJlZCB3aGVuIHRoZSBmaWxlIHBvc2l0aW9uIHdhcyBub3QKICBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCB3cml0ZSgpIHdhcyBjYWxsZWQgd2l0aCBlbm91Z2ggZGF0YSB0bwogIGV4dGVuZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCgotIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIFRraW50ZXIgZXJyb3IgbWVzc2FnZXMgdG8gZ2V0IGxvc3Qgb24KICBXaW5kb3dzLiAgVGhlIGJ1ZyB3YXMgZml4ZWQgYnkgcmVwbGFjaW5nIGRpcmVjdCB1c2Ugb2YKICBpbnRlcnAtPnJlc3VsdCB3aXRoIFRjbF9HZXRTdHJpbmdSZXN1bHQoaW50ZXJwKS4KCi0gRml4ZWQgYnVnIGluIHVybGxpYjIgdGhhdCBjYXVzZWQgaXQgdG8gZmFpbCB3aGVuIGl0IHJlY2VpdmVkIGFuIEhUVFAKICByZWRpcmVjdCByZXNwb25zZS4KCi0gU2V2ZXJhbCBjaGFuZ2VzIHdlcmUgbWFkZSB0byBkaXN0dXRpbHM6IFNvbWUgZGVidWdnaW5nIGNvZGUgd2FzCiAgcmVtb3ZlZCBmcm9tIHV0aWwuICBGaXhlZCB0aGUgaW5zdGFsbGVyIHVzZWQgd2hlbiBhbiBleHRlcm5hbCB6aXAKICBwcm9ncmFtIChsaWtlIFdpblppcCkgaXMgbm90IGZvdW5kOyB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMKICBpbnN0YWxsZXIgaXMgaW4gTWlzYy9kaXN0dXRpbHMuICBjaGVja19saWIoKSB3YXMgbW9kaWZpZWQgdG8gYmVoYXZlCiAgbW9yZSBsaWtlIEFDX0NIRUNLX0xJQiBieSBhZGQgb3RoZXJfbGlicmFyaWVzKCkgYXMgYSBwYXJhbWV0ZXIuICBUaGUKICB0ZXN0IGZvciB3aGV0aGVyIGluc3RhbGxlZCBtb2R1bGVzIGFyZSBvbiBzeXMucGF0aCB3YXMgY2hhbmdlZCB0bwogIHVzZSBib3RoIG5vcm1jYXNlKCkgYW5kIG5vcm1wYXRoKCkuCgotIFNldmVyYWwgbWlub3IgYnVncyB3ZXJlIGZpeGVkIGluIHRoZSB4bWwgcGFja2FnZSAodGhlIG1pbmlkb20sCiAgcHVsbGRvbSwgZXhwYXRyZWFkZXIsIGFuZCBzYXh1dGlscyBtb2R1bGVzKS4KCi0gVGhlIHJlZ3Jlc3Npb24gdGVzdCBkcml2ZXIgKHJlZ3J0ZXN0LnB5KSBiZWhhdmlvciB3aGVuIGludm9rZWQgd2l0aAogIC1sIGNoYW5nZWQ6IEl0IG5vdyByZXBvcnRzIGEgY291bnQgb2Ygb2JqZWN0cyB0aGF0IGFyZSByZWNvZ25pemVkIGFzCiAgZ2FyYmFnZSBidXQgbm90IGZyZWVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KCi0gVGhlIHJlZ3Jlc3Npb24gdGVzdCBmb3IgdGhlIG1hdGggbW9kdWxlIHdhcyBjaGFuZ2VkIHRvIHRlc3QKICBleGNlcHRpb25hbCBiZWhhdmlvciB3aGVuIHRoZSB0ZXN0IGlzIHJ1biBpbiB2ZXJib3NlIG1vZGUuICBQeXRob24KICBjYW5ub3QgeWV0IGd1YXJhbnRlZSBjb25zaXN0ZW50IGV4Y2VwdGlvbiBiZWhhdmlvciBhY3Jvc3MgcGxhdGZvcm1zLAogIHNvIHRoZSBleGNlcHRpb24gcGFydCBvZiB0ZXN0X21hdGggaXMgcnVuIG9ubHkgaW4gdmVyYm9zZSBtb2RlLCBhbmQKICBtYXkgZmFpbCBvbiB5b3VyIHBsYXRmb3JtLgoKSW50ZXJuYWxzCgotIFB5T1NfQ2hlY2tTdGFjaygpIGhhcyBiZWVuIGRpc2FibGVkIG9uIFdpbjY0LCB3aGVyZSBpdCBjYXVzZWQKICB0ZXN0X3NyZSB0byBmYWlsLgoKQnVpbGQgaXNzdWVzCgotIENoYW5nZWQgY29tcGlsZXIgZmxhZ3MsIHNvIHRoYXQgZ2NjIGlzIGFsd2F5cyBpbnZva2VkIHdpdGggLVdhbGwgYW5kCiAgLVdzdHJpY3QtcHJvdG90eXBlcy4gIFVzZXJzIGNvbXBpbGluZyBQeXRob24gd2l0aCBHQ0Mgc2hvdWxkIHNlZQogIGV4YWN0bHkgb25lIHdhcm5pbmcsIGV4Y2VwdCBpZiB0aGV5IGhhdmUgcGFzc2VkIGNvbmZpZ3VyZSB0aGUKICAtLXdpdGgtcHlkZWJ1ZyBmbGFnLiAgVGhlIGV4cGVjdGVkIHdhcm5pbmcgaXMgZm9yIGdldG9wdCgpIGluCiAgTW9kdWxlcy9tYWluLmMuICBUaGlzIHdhcm5pbmcgd2lsbCBiZSBmaXhlZCBmb3IgUHl0aG9uIDIuMS4KCi0gRml4ZWQgY29uZmlndXJlIHRvIGFkZCAtdGhyZWFkcyBhcmd1bWVudCBkdXJpbmcgbGlua2luZyBvbiBPU0YxLgoKVG9vbHMgYW5kIG90aGVyIG1pc2NlbGxhbnkKCi0gVGhlIGNvbXBpbGVyIGluIFRvb2xzL2NvbXBpbGVyIHdhcyB1cGRhdGVkIHRvIHN1cHBvcnQgdGhlIG5ldwogIGxhbmd1YWdlIGZlYXR1cmVzIGludHJvZHVjZWQgaW4gMi4wOiBleHRlbmRlZCBwcmludCBzdGF0ZW1lbnQsIGxpc3QKICBjb21wcmVoZW5zaW9ucywgYW5kIGF1Z21lbnRlZCBhc3NpZ25tZW50cy4gIFRoZSBuZXcgY29tcGlsZXIgc2hvdWxkCiAgYWxzbyBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAxLjUuMjsgdGhlIGNvbXBpbGVyIHdpbGwKICBhbHdheXMgZ2VuZXJhdGUgY29kZSBmb3IgdGhlIHZlcnNpb24gb2YgdGhlIGludGVycHJldGVyIGl0IHJ1bnMKICB1bmRlci4KCldoYXQncyBuZXcgaW4gMi4wIHJlbGVhc2UgY2FuZGlkYXRlIDEgKHNpbmNlIGJldGEgMik/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpXaGF0IGlzIHJlbGVhc2UgY2FuZGlkYXRlIDE/CgpXZSBiZWxpZXZlIHRoYXQgcmVsZWFzZSBjYW5kaWRhdGUgMSB3aWxsIGZpeCBhbGwga25vd24gYnVncyB0aGF0IHdlCmludGVuZCB0byBmaXggZm9yIHRoZSAyLjAgZmluYWwgcmVsZWFzZS4gIFRoaXMgcmVsZWFzZSBzaG91bGQgYmUgYSBiaXQKbW9yZSBzdGFibGUgdGhhbiB0aGUgcHJldmlvdXMgYmV0YXMuICBXZSB3b3VsZCBsaWtlIHRvIHNlZSBldmVuIG1vcmUKd2lkZXNwcmVhZCB0ZXN0aW5nIGJlZm9yZSB0aGUgZmluYWwgcmVsZWFzZSwgc28gd2UgYXJlIHByb2R1Y2luZyB0aGlzCnJlbGVhc2UgY2FuZGlkYXRlLiAgVGhlIGZpbmFsIHJlbGVhc2Ugd2lsbCBiZSBleGFjdGx5IHRoZSBzYW1lIHVubGVzcwphbnkgc2hvdy1zdG9wcGluZyAob3IgYnJvd24gYmFnKSBidWdzIGFyZSBmb3VuZCBieSB0ZXN0ZXJzIG9mIHRoZQpyZWxlYXNlIGNhbmRpZGF0ZS4KCkFsbCB0aGUgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCBiZXRhIHJlbGVhc2UgYXJlIGJ1ZyBmaXhlcyBvciBjaGFuZ2VzCnRvIHN1cHBvcnQgYnVpbGRpbmcgUHl0aG9uIGZvciBzcGVjaWZpYyBwbGF0Zm9ybXMuCgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIEEgYnVnIHRoYXQgY2F1c2VkIGNyYXNoZXMgd2hlbiBfX2NvZXJjZV9fIHdhcyB1c2VkIHdpdGggYXVnbWVudGVkCiAgYXNzaWdubWVudCwgZS5nLiArPSwgd2FzIGZpeGVkLgoKLSBSYWlzZSBaZXJvRGl2aXNpb25FcnJvciB3aGVuIHJhaXNpbmcgemVybyB0byBhIG5lZ2F0aXZlIG51bWJlciwKICBlLmcuIDAuMCAqKiAtMi4wLiAgTm90ZSB0aGF0IG1hdGgucG93IGlzIHVucmVsYXRlZCB0byB0aGUgYnVpbHRpbgogIHBvd2VyIG9wZXJhdG9yIGFuZCB0aGUgcmVzdWx0IG9mIG1hdGgucG93KDAuMCwgLTIuMCkgd2lsbCB2YXJ5IGJ5CiAgcGxhdGZvcm0uICBPbiBMaW51eCwgaXQgcmFpc2VzIGEgVmFsdWVFcnJvci4KCi0gQSBidWcgaW4gVW5pY29kZSBzdHJpbmcgaW50ZXJwb2xhdGlvbiB3YXMgZml4ZWQgdGhhdCBvY2Nhc2lvbmFsbHkKICBjYXVzZWQgZXJyb3JzIHdpdGggZm9ybWF0cyBpbmNsdWRpbmcgIiUlIi4gIEZvciBleGFtcGxlLCB0aGUKICBmb2xsb3dpbmcgZXhwcmVzc2lvbiAiJSUgJXMiICUgdSJhYmMiIG5vIGxvbmdlciByYWlzZXMgYSBUeXBlRXJyb3IuCgotIENvbXBpbGF0aW9uIG9mIGRlZXBseSBuZXN0ZWQgZXhwcmVzc2lvbnMgcmFpc2VzIE1lbW9yeUVycm9yIGluc3RlYWQKICBvZiBTeW50YXhFcnJvciwgZS5nLiBldmFsKCJbIiAqIDUwICsgIl0iICogNTApLgoKLSBJbiAyLjBiMiBvbiBXaW5kb3dzLCB0aGUgaW50ZXJwcmV0ZXIgd3JvdGUgLnB5YyBmaWxlcyBpbiB0ZXh0IG1vZGUsCiAgcmVuZGVyaW5nIHRoZW0gdXNlbGVzcy4gIFRoZXkgYXJlIG5vdyB3cml0dGVuIGluIGJpbmFyeSBtb2RlIGFnYWluLgoKU3RhbmRhcmQgbGlicmFyeQoKLSBLZXl3b3JkIGFyZ3VtZW50cyBhcmUgbm93IGFjY2VwdGVkIGZvciBtb3N0IHBhdHRlcm4gYW5kIG1hdGNoIG9iamVjdAogIG1ldGhvZHMgaW4gU1JFLCB0aGUgc3RhbmRhcmQgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZS4KCi0gSW4gU1JFLCBmaXhlZCBlcnJvciB3aXRoIG5lZ2F0aXZlIGxvb2thaGVhZCBhbmQgbG9va2JlaGluZCB0aGF0CiAgbWFuaWZlc3RlZCBpdHNlbGYgYXMgYSBydW50aW1lIGVycm9yIGluIHBhdHRlcm5zIGxpa2UgIig/PCFhYmMpKGRlZikiLgoKLSBTZXZlcmFsIGJ1Z3MgaW4gdGhlIFVuaWNvZGUgaGFuZGxpbmcgYW5kIGVycm9yIGhhbmRsaW5nIGluIF90a2ludGVyCiAgd2VyZSBmaXhlZC4KCi0gRml4IG1lbW9yeSBtYW5hZ2VtZW50IGVycm9ycyBpbiBNZXJnZSgpIGFuZCBUa2FwcF9DYWxsKCkgcm91dGluZXMuCgotIFNldmVyYWwgY2hhbmdlcyB3ZXJlIG1hZGUgdG8gY1N0cmluZ0lPIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoCiAgdGhlIGZpbGUtbGlrZSBvYmplY3QgaW50ZXJmYWNlIGFuZCB3aXRoIFN0cmluZ0lPLiAgSWYgb3BlcmF0aW9ucyBhcmUKICBwZXJmb3JtZWQgb24gYSBjbG9zZWQgb2JqZWN0LCBhbiBleGNlcHRpb24gaXMgcmFpc2VkLiAgVGhlIHRydW5jYXRlCiAgbWV0aG9kIG5vdyBhY2NlcHRzIGEgcG9zaXRpb24gYXJndW1lbnQgYW5kIHJlYWRsaW5lIGFjY2VwdHMgYSBzaXplCiAgYXJndW1lbnQuCgotIFRoZXJlIHdlcmUgbWFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGxpbnV4YXVkaW9kZXYgbW9kdWxlIGFuZCBpdHMKICB0ZXN0IHN1aXRlOyBhcyBhIHJlc3VsdCwgYSBzaG9ydCwgdW5leHBlY3RlZCBhdWRpbyBzYW1wbGUgc2hvdWxkIG5vdwogIHBsYXkgd2hlbiB0aGUgcmVncmVzc2lvbiB0ZXN0IGlzIHJ1bi4KCiAgTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIG5hbWVkIHBvb3JseSwgYmVjYXVzZSBpdCBzaG91bGQgd29yawogIGNvcnJlY3RseSBvbiBhbnkgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyB0aGUgT3BlbiBTb3VuZCBTeXN0ZW0KICAoT1NTKS4KCiAgVGhlIG1vZHVsZSBub3cgcmFpc2VzIGV4Y2VwdGlvbnMgd2hlbiBlcnJvcnMgb2NjdXIgaW5zdGVhZCBvZgogIGNyYXNoaW5nLiAgSXQgYWxzbyBkZWZpbmVzIHRoZSBBRk1UX0FfTEFXIGZvcm1hdCAobG9nYXJpdGhtaWMgQS1sYXcKICBhdWRpbykgYW5kIGRlZmluZXMgYSBnZXRwdHIoKSBtZXRob2QgdGhhdCBjYWxscyB0aGUKICBTTkRDVExfRFNQX0dFVHhQVFIgaW9jdGwgZGVmaW5lZCBpbiB0aGUgT1NTIFByb2dyYW1tZXIncyBHdWlkZS4KCi0gVGhlIGxpYnJhcnlfdmVyc2lvbiBhdHRyaWJ1dGUsIGludHJvZHVjZWQgaW4gYW4gZWFybGllciBiZXRhLCB3YXMKICByZW1vdmVkIGJlY2F1c2UgaXQgY2FuIG5vdCBiZSBzdXBwb3J0ZWQgd2l0aCBlYXJseSB2ZXJzaW9ucyBvZiB0aGUgQwogIHJlYWRsaW5lIGxpYnJhcnksIHdoaWNoIHByb3ZpZGVzIG5vIHdheSB0byBkZXRlcm1pbmUgdGhlIHZlcnNpb24gYXQKICBjb21waWxlLXRpbWUuCgotIFRoZSBiaW5hc2NpaSBtb2R1bGUgaXMgbm93IGVuYWJsZWQgb24gV2luNjQuCgotIHRva2VuaXplLnB5IG5vIGxvbmdlciBzdWZmZXJzICJyZWN1cnNpb24gZGVwdGgiIGVycm9ycyB3aGVuIHBhcnNpbmcKICBwcm9ncmFtcyB3aXRoIHZlcnkgbG9uZyBzdHJpbmcgbGl0ZXJhbHMuCgpJbnRlcm5hbHMKCi0gRml4ZWQgc2V2ZXJhbCBidWZmZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0aWVzIGluIGNhbGN1bGF0ZV9wYXRoKCksCiAgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIGludGVycHJldGVyIHN0YXJ0cyB1cCB0byBkZXRlcm1pbmUgd2hlcmUKICB0aGUgc3RhbmRhcmQgbGlicmFyeSBpcyBpbnN0YWxsZWQuICBUaGVzZSB2dWxuZXJhYmlsaXRpZXMgYWZmZWN0IGFsbAogIHByZXZpb3VzIHZlcnNpb25zIG9mIFB5dGhvbiBhbmQgY2FuIGJlIGV4cGxvaXRlZCBieSBzZXR0aW5nIHZlcnkKICBsb25nIHZhbHVlcyBmb3IgUFlUSE9OSE9NRSBvciBhcmd2WzBdLiAgVGhlIHJpc2sgaXMgZ3JlYXRlc3QgZm9yIGEKICBzZXR1aWQgUHl0aG9uIHNjcmlwdCwgYWx0aG91Z2ggdXNlIG9mIHRoZSB3cmFwcGVyIGluCiAgTWlzYy9zZXR1aWQtcHJvZy5jIHdpbGwgZWxpbWluYXRlIHRoZSB2dWxuZXJhYmlsaXR5LgoKLSBGaXhlZCBnYXJiYWdlIGNvbGxlY3Rpb24gYnVncyBpbiBpbnN0YW5jZSBjcmVhdGlvbiB0aGF0IHdlcmUKICB0cmlnZ2VyZWQgd2hlbiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAgVGhlIHNvbHV0aW9uLAogIGFwcGxpZWQgaW4gY1BpY2tsZSBhbmQgaW4gUHlJbnN0YW5jZV9OZXcoKSwgaXMgdG8gY2FsbAogIFB5T2JqZWN0X0dDX0luaXQoKSBhZnRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG9iamVjdCdzCiAgY29udGFpbmVyIGF0dHJpYnV0ZXMgaXMgY29tcGxldGUuCgotIHB5ZXhwYXQgYWRkcyBkZWZpbml0aW9ucyBvZiBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudCBhbmQKICBQeU1vZHVsZV9BZGRPYmplY3QgaWYgdGhlIFB5dGhvbiB2ZXJzaW9uIGlzIGxlc3MgdGhhbiAyLjAsIHdoaWNoCiAgcHJvdmlkZXMgY29tcGF0aWJpbGl0eSB3aXRoIFB5WE1MIG9uIFB5dGhvbiAxLjUuMi4KCi0gSWYgdGhlIHBsYXRmb3JtIGhhcyBhIGJvZ3VzIGRlZmluaXRpb24gZm9yIExPTkdfQklUICh0aGUgbnVtYmVyIG9mCiAgYml0cyBpbiBhIGxvbmcpLCBhbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS4KCi0gRml4IGJ1Z3MgaW4gX1B5VHVwbGVfUmVzaXplKCkgd2hpY2ggY2F1c2VkIGhhcmQtdG8taW50ZXJwcmV0IGdhcmJhZ2UKICBjb2xsZWN0aW9uIGNyYXNoZXMgYW5kIHBvc3NpYmx5IG90aGVyLCB1bnJlcG9ydGVkIGNyYXNoZXMuCgotIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gX1B5VW5pY29kZV9GaW5pKCkuCgpCdWlsZCBpc3N1ZXMKCi0gY29uZmlndXJlIG5vdyBhY2NlcHRzIGEgLS13aXRoLXN1ZmZpeCBvcHRpb24gdGhhdCBzcGVjaWZpZXMgdGhlCiAgZXhlY3V0YWJsZSBzdWZmaXguICBUaGlzIGlzIHVzZWZ1bCBmb3IgYnVpbGRzIG9uIEN5Z3dpbiBhbmQgTWFjIE9TCiAgWCwgZm9yIGV4YW1wbGUuCgotIFRoZSBtbWFwLlBBR0VTSVpFIGNvbnN0YW50IGlzIG5vdyBpbml0aWFsaXplZCB1c2luZyBzeXNjb25mIHdoZW4KICBwb3NzaWJsZSwgd2hpY2ggZWxpbWluYXRlcyBhIGRlcGVuZGVuY3kgb24gLWx1Y2IgZm9yIFJlbGlhbnQgVU5JWC4KCi0gVGhlIG1kNSBmaWxlIHNob3VsZCBub3cgY29tcGlsZSBvbiBhbGwgcGxhdGZvcm1zLgoKLSBUaGUgc2VsZWN0IG1vZHVsZSBub3cgY29tcGlsZXMgb24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IGRlZmluZQogIFBPTExSRE5PUk0gYW5kIHJlbGF0ZWQgY29uc3RhbnRzLgoKLSBEYXJ3aW4gKE1hYyBPUyBYKTogIEluaXRpYWwgc3VwcG9ydCBmb3Igc3RhdGljIGJ1aWxkcyBvbiB0aGlzCiAgcGxhdGZvcm0uCgotIEJlT1M6IEEgbnVtYmVyIG9mIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBidWlsZCBhbmQgaW5zdGFsbGF0aW9uCiAgcHJvY2Vzcy4gIGFyLWZha2Ugbm93IG9wZXJhdGVzIG9uIGEgZGlyZWN0b3J5IG9mIG9iamVjdCBmaWxlcy4KICBkbF9leHBvcnQuaCBpcyBnb25lLCBhbmQgaXRzIG1hY3JvcyBub3cgYXBwZWFyIG9uIHRoZSBtd2NjIGNvbW1hbmQKICBsaW5lIGR1cmluZyBidWlsZCBvbiBQUEMgQmVPUy4KCi0gUGxhdGZvcm0gZGlyZWN0b3J5IGluIGxpYi9weXRob24yLjAgaXMgInBsYXQtYmVvczUiIChvcgogICJwbGF0LWJlb3M0IiwgaWYgYnVpbGRpbmcgb24gQmVPUyA0LjUpLCByYXRoZXIgdGhhbiAicGxhdC1iZW9zIi4KCi0gQ3lnd2luOiBTdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzLCBUa2ludGVyLCBhbmQgc29ja2V0cy4KCi0gU3VuT1MgNC4xLjRfSkw6IEZpeCB0ZXN0IGZvciBkaXJlY3RvcnkgZXhpc3RlbmNlIGluIGNvbmZpZ3VyZS4KClRvb2xzIGFuZCBvdGhlciBtaXNjZWxsYW55CgotIFJlbW92ZWQgZGVidWdnaW5nIHByaW50cyBmcm9tIG1haW4gdXNlZCB3aXRoIGZyZWV6ZS4KCi0gSURMRSBhdXRvLWluZGVudCBubyBsb25nZXIgY3Jhc2hlcyB3aGVuIGl0IGVuY291bnRlcnMgVW5pY29kZQogIGNoYXJhY3RlcnMuCgpXaGF0J3MgbmV3IGluIDIuMCBiZXRhIDIgKHNpbmNlIGJldGEgMSk/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gQWRkIHN1cHBvcnQgZm9yIHVuYm91bmRlZCBpbnRzIGluICVkLGksdSx4LFgsbyBmb3JtYXRzOyBmb3IgZXhhbXBsZQogICIlZCIgJSAyTCoqNjQgPT0gIjE4NDQ2NzQ0MDczNzA5NTUxNjE2Ii4KCi0gQWRkIC1oIGFuZCAtViBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBwcmludCB0aGUgdXNhZ2UgbWVzc2FnZSBhbmQKICBQeXRob24gdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQgaW1tZWRpYXRlbHkuCgotIGV2YWwoKSBhbmQgZXhlYyBhY2NlcHQgVW5pY29kZSBvYmplY3RzIGFzIGNvZGUgcGFyYW1ldGVycy4KCi0gZ2V0YXR0cigpIGFuZCBzZXRhdHRyKCkgbm93IGFsc28gYWNjZXB0IFVuaWNvZGUgb2JqZWN0cyBmb3IgdGhlCiAgYXR0cmlidXRlIG5hbWUsIHdoaWNoIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdAogIGVuY29kaW5nIGJlZm9yZSBsb29rdXAuCgotIE11bHRpcGxpY2F0aW9uIG9uIHN0cmluZyBhbmQgVW5pY29kZSBub3cgZG9lcyBwcm9wZXIgYm91bmRzCiAgY2hlY2tpbmc7IGUuZy4gJ2EnICogNjU1MzYgKiA2NTUzNiB3aWxsIHJhaXNlIFZhbHVlRXJyb3IsICJyZXBlYXRlZAogIHN0cmluZyBpcyB0b28gbG9uZy4iCgotIEJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gY29udGludWUgaXMgZm91bmQgaW4gdHJ5IHN0YXRlbWVudCBpbiBhCiAgbG9vcC4KCgpTdGFuZGFyZCBsaWJyYXJ5IGFuZCBleHRlbnNpb25zCgotIHNvY2tldCBtb2R1bGU6IHRoZSBPcGVuU1NMIGNvZGUgbm93IGFkZHMgc3VwcG9ydCBmb3IgUkFORF9zdGF0dXMoKQogIGFuZCBFR0QgKEVudHJvcHkgR2F0aGVyaW5nIERldmljZSkuCgotIGFycmF5OiByZXZlcnNlKCkgbWV0aG9kIG9mIGFycmF5IG5vdyB3b3Jrcy4gIGJ1ZmZlcl9pbmZvKCkgbm93IGRvZXMKICBhcmd1bWVudCBjaGVja2luZzsgaXQgc3RpbGwgdGFrZXMgbm8gYXJndW1lbnRzLgoKLSBhc3luY29yZS9hc3luY2hhdDogSW5jbHVkZWQgbW9zdCByZWNlbnQgdmVyc2lvbiBmcm9tIFNhbSBSdXNoaW5nLgoKLSBjZ2k6IEFjY2VwdCAnJicgb3IgJzsnIGFzIHNlcGFyYXRvciBjaGFyYWN0ZXJzIHdoZW4gcGFyc2luZyBmb3JtIGRhdGEuCgotIENHSUhUVFBTZXJ2ZXI6IE5vdyB3b3JrcyBvbiBXaW5kb3dzIChhbmQgcGVyaGFwcyBldmVuIE1hYykuCgotIENvbmZpZ1BhcnNlcjogV2hlbiByZWFkaW5nIHRoZSBmaWxlLCBvcHRpb25zIHNwZWxsZWQgaW4gdXBwZXIgY2FzZQogIGxldHRlcnMgYXJlIG5vdyBjb3JyZWN0bHkgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KCi0gY29weTogQ29weSBVbmljb2RlIG9iamVjdHMgYXRvbWljYWxseS4KCi0gY1BpY2tsZTogRmFpbCBncmFjZWZ1bGx5IHdoZW4gY29weV9yZWcgY2FuJ3QgYmUgaW1wb3J0ZWQuCgotIGNTdHJpbmdJTzogSW1wbGVtZW50ZWQgcmVhZGxpbmVzKCkgbWV0aG9kLgoKLSBkYm06IEFkZCBnZXQoKSBhbmQgc2V0ZGVmYXVsdCgpIG1ldGhvZHMgdG8gZGJtIG9iamVjdC4gIEFkZCBjb25zdGFudAogIGBsaWJyYXJ5JyB0byBtb2R1bGUgdGhhdCBuYW1lcyB0aGUgbGlicmFyeSB1c2VkLiAgQWRkZWQgZG9jIHN0cmluZ3MKICBhbmQgbWV0aG9kIG5hbWVzIHRvIGVycm9yIG1lc3NhZ2VzLiAgVXNlcyBjb25maWd1cmUgdG8gZGV0ZXJtaW5lCiAgd2hpY2ggbmRibS5oIGZpbGUgdG8gaW5jbHVkZTsgQmVya2VsZXkgREIncyBuYmRtIGFuZCBHREJNJ3MgbmRibSBpcwogIG5vdyBhdmFpbGFibGUgb3B0aW9ucy4KCi0gZGlzdHV0aWxzOiBVcGRhdGUgdG8gdmVyc2lvbiAwLjkuMy4KCi0gZGw6IEFkZCBzZXZlcmFsIGRsLlJUTERfIGNvbnN0YW50cy4KCi0gZnBlY3RsOiBOb3cgc3VwcG9ydGVkIG9uIEZyZWVCU0QuCgotIGdjOiBBZGQgREVCVUdfU0FWRUFMTCBvcHRpb24uICBXaGVuIGVuYWJsZWQgYWxsIGdhcmJhZ2Ugb2JqZWN0cwogIGZvdW5kIGJ5IHRoZSBjb2xsZWN0b3Igd2lsbCBiZSBzYXZlZCBpbiBnYy5nYXJiYWdlLiAgVGhpcyBpcyB1c2VmdWwKICBmb3IgZGVidWdnaW5nIGEgcHJvZ3JhbSB0aGF0IGNyZWF0ZXMgcmVmZXJlbmNlIGN5Y2xlcy4KCi0gaHR0cGxpYjogVGhyZWUgY2hhbmdlczogUmVzdG9yZSBzdXBwb3J0IGZvciBzZXRfZGVidWdsZXZlbCBmZWF0dXJlCiAgb2YgSFRUUCBjbGFzcy4gIERvIG5vdCBjbG9zZSBzb2NrZXQgb24gemVyby1sZW5ndGggcmVzcG9uc2UuICBEbyBub3QKICBjcmFzaCB3aGVuIHNlcnZlciBzZW5kcyBpbnZhbGlkIGNvbnRlbnQtbGVuZ3RoIGhlYWRlci4KCi0gbWFpbGJveDogTWFpbGJveCBjbGFzcyBjb25mb3JtcyBiZXR0ZXIgdG8gcW1haWwgc3BlY2lmaWNhdGlvbnMuCgotIG1hcnNoYWw6IFdoZW4gcmVhZGluZyBhIHNob3J0LCBzaWduLWV4dGVuZCBvbiBwbGF0Zm9ybXMgd2hlcmUgc2hvcnRzCiAgYXJlIGJpZ2dlciB0aGFuIDE2IGJpdHMuICBXaGVuIHJlYWRpbmcgYSBsb25nLCByZXBhaXIgdGhlIHVucG9ydGFibGUKICBzaWduIGV4dGVuc2lvbiB0aGF0IHdhcyBiZWluZyBkb25lIGZvciA2NC1iaXQgbWFjaGluZXMuICAoSXQgYXNzdW1lZAogIHRoYXQgc2lnbmVkIHJpZ2h0IHNoaWZ0IHNpZ24tZXh0ZW5kcy4pCgotIG9wZXJhdG9yOiBBZGQgY29udGFpbnMoKSwgaW52ZXJ0KCksIF9faW52ZXJ0X18oKSBhcyBhbGlhc2VzIGZvcgogIF9fY29udGFpbnNfXygpLCBpbnYoKSwgYW5kIF9faW52X18oKSByZXNwZWN0aXZlbHkuCgotIG9zOiBBZGQgc3VwcG9ydCBmb3IgcG9wZW4yKCkgYW5kIHBvcGVuMygpIG9uIGFsbCBwbGF0Zm9ybXMgd2hlcmUKICBmb3JrKCkgZXhpc3RzLiAgKHBvcGVuNCgpIGlzIHN0aWxsIGluIHRoZSB3b3Jrcy4pCgotIG9zOiAoV2luZG93cyBvbmx5OikgQWRkIHN0YXJ0ZmlsZSgpIGZ1bmN0aW9uIHRoYXQgYWN0cyBsaWtlIGRvdWJsZS0KICBjbGlja2luZyBvbiBhIGZpbGUgaW4gRXhwbG9yZXIgKG9yIHBhc3NpbmcgdGhlIGZpbGUgbmFtZSB0byB0aGUKICBET1MgInN0YXJ0IiBjb21tYW5kKS4KCi0gb3MucGF0aDogKFdpbmRvd3MsIERPUzopIFRyZWF0IHRyYWlsaW5nIGNvbG9uIGNvcnJlY3RseSBpbgogIG9zLnBhdGguam9pbi4gIG9zLnBhdGguam9pbigiYToiLCAiYiIpIHlpZWxkcyAiYTpiIi4KCi0gcGlja2xlOiBOb3cgcmFpc2VzIFZhbHVlRXJyb3Igd2hlbiBhbiBpbnZhbGlkIHBpY2tsZSB0aGF0IGNvbnRhaW5zCiAgYSBub24tc3RyaW5nIHJlcHIgd2hlcmUgYSBzdHJpbmcgcmVwciB3YXMgZXhwZWN0ZWQuICBUaGlzIGJlaGF2aW9yCiAgbWF0Y2hlcyBjUGlja2xlLgoKLSBwb3NpeGZpbGU6IFJlbW92ZSBicm9rZW4gX19kZWxfXygpIG1ldGhvZC4KCi0gcHlfY29tcGlsZTogc3VwcG9ydCBDUitMRiBsaW5lIHRlcm1pbmF0b3JzIGluIHNvdXJjZSBmaWxlLgoKLSByZWFkbGluZTogRG9lcyBub3QgaW1tZWRpYXRlbHkgZXhpdCB3aGVuIF5DIGlzIGhpdCB3aGVuIHJlYWRsaW5lIGFuZAogIHRocmVhZHMgYXJlIGNvbmZpZ3VyZWQuICBBZGRzIGRlZmluaXRpb24gb2YgcmxfbGlicmFyeV92ZXJzaW9uLiAgKFRoZQogIGxhdHRlciBhZGRpdGlvbiByZXF1aXJlcyBHTlUgcmVhZGxpbmUgMi4yIG9yIGxhdGVyLikKCi0gcmZjODIyOiBEb21haW4gbGl0ZXJhbHMgcmV0dXJuZWQgYnkgQWRkcmxpc3RDbGFzcyBtZXRob2QKICBnZXRkb21haW5saXRlcmFsKCkgYXJlIG5vdyBwcm9wZXJseSB3cmFwcGVkIGluIGJyYWNrZXRzLgoKLSBzaXRlOiBzeXMuc2V0ZGVmYXVsdGVuY29kaW5nKCkgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIGNhc2UgdGhlCiAgc3RhbmRhcmQgZGVmYXVsdCBlbmNvZGluZyAoImFzY2lpIikgaXMgY2hhbmdlZC4gVGhpcyBzYXZlcyBxdWl0ZSBhCiAgZmV3IGN5Y2xlcyBkdXJpbmcgc3RhcnR1cCBzaW5jZSB0aGUgZmlyc3QgY2FsbCB0bwogIHNldGRlZmF1bHRlbmNvZGluZygpIHdpbGwgaW5pdGlhbGl6ZSB0aGUgY29kZWMgcmVnaXN0cnkgYW5kIHRoZQogIGVuY29kaW5ncyBwYWNrYWdlLgoKLSBzb2NrZXQ6IFN1cHBvcnQgZm9yIHNpemUgaGludCBpbiByZWFkbGluZXMoKSBtZXRob2Qgb2Ygb2JqZWN0IHJldHVybmVkCiAgYnkgbWFrZWZpbGUoKS4KCi0gc3JlOiBBZGRlZCBleHBlcmltZW50YWwgZXhwYW5kKCkgbWV0aG9kIHRvIG1hdGNoIG9iamVjdHMuICBEb2VzIG5vdAogIHVzZSBidWZmZXIgaW50ZXJmYWNlIG9uIFVuaWNvZGUgc3RyaW5ncy4gIERvZXMgbm90IGhhbmcgaWYgZ3JvdXAgaWQKICBpcyBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLgoKLSBTdHJpbmdJTzogU2l6ZSBoaW50IGluIHJlYWRsaW5lcygpIGlzIG5vdyBzdXBwb3J0ZWQgYXMgZG9jdW1lbnRlZC4KCi0gc3RydWN0OiBDaGVjayByYW5nZXMgZm9yIGJ5dGVzIGFuZCBzaG9ydHMuCgotIHVybGxpYjogSW1wcm92ZWQgaGFuZGxpbmcgb2Ygd2luMzIgcHJveHkgc2V0dGluZ3MuIEZpeGVkIHF1b3RlIGFuZAogIHF1b3RlX3BsdXMgZnVuY3Rpb25zIHNvIHRoYXQgdGhlIGFsd2F5cyBlbmNvZGUgYSBjb21tYS4KCi0gVGtpbnRlcjogSW1hZ2Ugb2JqZWN0cyBhcmUgbm93IGd1YXJhbnRlZWQgdG8gaGF2ZSB1bmlxdWUgaWRzLiAgU2V0CiAgZXZlbnQuZGVsdGEgdG8gemVybyBpZiBUayB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCBtb3VzZXdoZWVsLgogIFJlbW92ZWQgc29tZSBkZWJ1Z2dpbmcgcHJpbnRzLgoKLSBVc2VyTGlzdDogbm93IGltcGxlbWVudHMgX19jb250YWluc19fKCkuCgotIHdlYmJyb3dzZXI6IE9uIFdpbmRvd3MsIHVzZSBvcy5zdGFydGZpbGUoKSBpbnN0ZWFkIG9mIG9zLnBvcGVuKCksCiAgd2hpY2ggd29ya3MgYXJvdW5kIGEgYnVnIGluIE5vcnRvbiBBbnRpVmlydXMgMjAwMCB0aGF0IGxlYWRzIGRpcmVjdGx5CiAgdG8gYSBCbHVlIFNjcmVlbiBmcmVlemUuCgotIHhtbDogTmV3IHZlcnNpb24gZGV0ZWN0aW9uIGNvZGUgYWxsb3dzIFB5WE1MIHRvIG92ZXJyaWRlIHN0YW5kYXJkCiAgWE1MIHBhY2thZ2UgaWYgUHlYTUwgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gMC42LjEuCgotIHhtbC5kb206IERPTSBsZXZlbCAxIHN1cHBvcnQgZm9yIGJhc2ljIFhNTC4gIEluY2x1ZGVzIHhtbC5kb20ubWluaWRvbQogIChjb252ZW50aW9uYWwgRE9NKSwgYW5kIHhtbC5kb20ucHVsbGRvbSwgd2hpY2ggYWxsb3dzIGJ1aWxkaW5nIHRoZSBET00KICB0cmVlIG9ubHkgZm9yIG5vZGVzIHdoaWNoIGFyZSBzdWZmaWNpZW50bHkgaW50ZXJlc3RpbmcgdG8gYSBzcGVjaWZpYwogIGFwcGxpY2F0aW9uLiAgRG9lcyBub3QgcHJvdmlkZSB0aGUgSFRNTC1zcGVjaWZpYyBleHRlbnNpb25zLiAgU3RpbGwKICB1bmRvY3VtZW50ZWQuCgotIHhtbC5zYXg6IFNBWCAyIHN1cHBvcnQgZm9yIFB5dGhvbiwgaW5jbHVkaW5nIGFsbCB0aGUgaGFuZGxlcgogIGludGVyZmFjZXMgbmVlZGVkIHRvIHByb2Nlc3MgWE1MIDEuMCBjb21wbGlhbnQgWE1MLiAgU29tZQogIGRvY3VtZW50YXRpb24gaXMgYWxyZWFkeSBhdmFpbGFibGUuCgotIHB5ZXhwYXQ6IFJlbmFtZWQgdG8geG1sLnBhcnNlcnMuZXhwYXQgc2luY2UgdGhpcyBpcyBwYXJ0IG9mIHRoZSBuZXcsCiAgcGFja2FnaXplZCBYTUwgc3VwcG9ydC4KCgpDIEFQSQoKLSBBZGQgdGhyZWUgbmV3IGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgbW9kdWxlIGluaXRpYWxpemF0aW9uIC0tCiAgUHlNb2R1bGVfQWRkT2JqZWN0KCksIFB5TW9kdWxlX0FkZEludENvbnN0YW50KCksIGFuZAogIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KCkuCgotIENsZWFuZWQgdXAgZGVmaW5pdGlvbiBvZiBOVUxMIGluIEMgc291cmNlIGNvZGU7IGFsbCBkZWZpbml0aW9ucyB3ZXJlCiAgcmVtb3ZlZCBhbmQgYWRkICNlcnJvciB0byBQeXRob24uaCBpZiBOVUxMIGlzbid0IGRlZmluZWQgYWZ0ZXIKICAjaW5jbHVkZSBvZiBzdGRpby5oLgoKLSBQeV9QUk9UTygpIG1hY3JvcyB0aGF0IHdlcmUgcmVtb3ZlZCBpbiAyLjBiMSBoYXZlIGJlZW4gcmVzdG9yZWQgZm9yCiAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKGF0IHRoZSBzb3VyY2UgbGV2ZWwpIHdpdGggb2xkIGV4dGVuc2lvbnMuCgotIEEgd3JhcHBlciBBUEkgd2FzIGFkZGVkIGZvciBzaWduYWwoKSBhbmQgc2lnYWN0aW9uKCkuICBJbnN0ZWFkIG9mCiAgZWl0aGVyIGZ1bmN0aW9uLCBhbHdheXMgdXNlIFB5T1NfZ2V0c2lnKCkgdG8gZ2V0IGEgc2lnbmFsIGhhbmRsZXIKICBhbmQgUHlPU19zZXRzaWcoKSB0byBzZXQgb25lLiAgQSBuZXcgY29udmVuaWVuY2UgdHlwZWRlZgogIFB5T1Nfc2lnaGFuZGxlcl90IGlzIGRlZmluZWQgZm9yIHRoZSB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycy4KCi0gQWRkIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSgpIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQogIGludGVybmFsIGRhdGEgYnVmZmVyIGFuZCBzaXplIG9mIGEgc3RyaW5nIG9iamVjdCAtLSBvciB0aGUgZGVmYXVsdAogIGVuY29kZWQgdmVyc2lvbiBvZiBhIFVuaWNvZGUgb2JqZWN0LgoKLSBQeVN0cmluZ19TaXplKCkgYW5kIFB5U3RyaW5nX0FzU3RyaW5nKCkgYWNjZXB0IFVuaWNvZGUgb2JqZWN0cy4KCi0gVGhlIHN0YW5kYXJkIGhlYWRlciA8bGltaXRzLmg+IGlzIG5vdyBpbmNsdWRlZCBieSBQeXRob24uaCAoaWYgaXQKICBleGlzdHMpLiAgSU5UX01BWCBhbmQgTE9OR19NQVggd2lsbCBhbHdheXMgYmUgZGVmaW5lZCwgZXZlbiBpZgogIDxsaW1pdHMuaD4gaXMgbm90IGF2YWlsYWJsZS4KCi0gUHlGbG9hdF9Gcm9tU3RyaW5nIHRha2VzIGEgc2Vjb25kIGFyZ3VtZW50LCBwZW5kLCB0aGF0IHdhcwogIGVmZmVjdGl2ZWx5IHVzZWxlc3MuICBJdCBpcyBub3cgb2ZmaWNpYWxseSB1c2VsZXNzIGJ1dCBwcmVzZXJ2ZWQgZm9yCiAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBJZiB0aGUgcGVuZCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKnBlbmQgaXMKICBzZXQgdG8gTlVMTC4KCi0gUHlPYmplY3RfR2V0QXR0cigpIGFuZCBQeU9iamVjdF9TZXRBdHRyKCkgbm93IGFjY2VwdCBVbmljb2RlIG9iamVjdHMKICBmb3IgdGhlIGF0dHJpYnV0ZSBuYW1lLiAgU2VlIG5vdGUgb24gZ2V0YXR0cigpIGFib3ZlLgoKLSBBIGZldyBidWcgZml4ZXMgdG8gYXJndW1lbnQgcHJvY2Vzc2luZyBmb3IgVW5pY29kZS4KICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKSBub3cgYWNjZXB0cyAiZXMjIiBhbmQgImVzIi4KICBQeUFyZ19QYXJzZSgpIHNwZWNpYWwgY2FzZXMgInMjIiBmb3IgVW5pY29kZSBvYmplY3RzOyBpdCByZXR1cm5zIGEKICBwb2ludGVyIHRvIHRoZSBkZWZhdWx0IGVuY29kZWQgc3RyaW5nIGRhdGEgaW5zdGVhZCBvZiB0byB0aGUgcmF3CiAgVVRGLTE2LgoKLSBQeV9CdWlsZFZhbHVlIGFjY2VwdHMgQiBmb3JtYXQgKGZvciBiZ2VuLWdlbmVyYXRlZCBjb2RlKS4KCgpJbnRlcm5hbHMKCi0gT24gVW5peCwgZml4IGNvZGUgZm9yIGZpbmRpbmcgUHl0aG9uIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgc28gdGhhdAogIGl0IHdvcmtzIHdoZW4gYXJndlswXSBpcyBhIHJlbGF0aXZlIHBhdGguCgotIEFkZGVkIGEgdHJ1ZSB1bmljb2RlX2ludGVybmFsX2VuY29kZSgpIGZ1bmN0aW9uIGFuZCBmaXhlZCB0aGUKICB1bmljb2RlX2ludGVybmFsX2RlY29kZSBmdW5jdGlvbigpIHRvIHN1cHBvcnQgVW5pY29kZSBvYmplY3RzIGRpcmVjdGx5CiAgcmF0aGVyIHRoYW4gYnkgZ2VuZXJhdGluZyBhIGNvcHkgb2YgdGhlIG9iamVjdC4KCi0gU2V2ZXJhbCBvZiB0aGUgaW50ZXJuYWwgVW5pY29kZSB0YWJsZXMgYXJlIG11Y2ggc21hbGxlciBub3csIGFuZAogIHRoZSBzb3VyY2UgY29kZSBzaG91bGQgYmUgbXVjaCBmcmllbmRsaWVyIHRvIHdlYWtlciBjb21waWxlcnMuCgotIEluIHRoZSBnYXJiYWdlIGNvbGxlY3RvcjogRml4ZWQgYnVnIGluIGNvbGxlY3Rpb24gb2YgdHVwbGVzLiAgRml4ZWQKICBidWcgdGhhdCBjYXVzZWQgc29tZSBpbnN0YW5jZXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb250YWluZXIgc2V0CiAgd2hpbGUgdGhleSB3ZXJlIHN0aWxsIGxpdmUuICBGaXhlZCBwYXJzaW5nIGluIGdjLnNldF9kZWJ1ZygpIGZvcgogIHBsYXRmb3JtcyB3aGVyZSBzaXplb2YobG9uZykgPiBzaXplb2YoaW50KS4KCi0gRml4ZWQgcmVmY291bnQgcHJvYmxlbSBpbiBpbnN0YW5jZSBkZWFsbG9jYXRpb24gdGhhdCBvbmx5IG9jY3VycmVkCiAgd2hlbiBQeV9SRUZfREVCVUcgd2FzIGRlZmluZWQgYW5kIFB5X1RSQUNFX1JFRlMgd2FzIG5vdC4KCi0gT24gV2luZG93cywgZ2V0cHl0aG9ucmVncGF0aCBpcyBub3cgcHJvdGVjdGVkIGFnYWluc3QgbnVsbCBkYXRhIGluCiAgcmVnaXN0cnkga2V5LgoKLSBPbiBVbml4LCBjcmVhdGUgLnB5Yy8ucHlvIGZpbGVzIHdpdGggT19FWENMIGZsYWcgdG8gYXZvaWQgYSByYWNlCiAgY29uZGl0aW9uLgoKCkJ1aWxkIGFuZCBwbGF0Zm9ybS1zcGVjaWZpYyBpc3N1ZXMKCi0gQmV0dGVyIHN1cHBvcnQgb2YgR05VIFB0aCB2aWEgLS13aXRoLXB0aCBjb25maWd1cmUgb3B0aW9uLgoKLSBQeXRob24vQyBBUEkgbm93IHByb3Blcmx5IGV4cG9zZWQgdG8gZHluYW1pY2FsbHktbG9hZGVkIGV4dGVuc2lvbgogIG1vZHVsZXMgb24gUmVsaWFudCBVTklYLgoKLSBDaGFuZ2VzIGZvciB0aGUgYmVuZWZpdCBvZiBTdW5PUyA0LjEuNCAocmVhbGx5ISkuICBtbWFwbW9kdWxlLmM6CiAgRG9uJ3QgZGVmaW5lIE1TX1NZTkMgdG8gYmUgemVybyB3aGVuIGl0IGlzIHVuZGVmaW5lZC4gIEFkZGVkIG1pc3NpbmcKICBwcm90b3R5cGVzIGluIHBvc2l4bW9kdWxlLmMuCgotIEltcHJvdmVkIHN1cHBvcnQgZm9yIEhQLVVYIGJ1aWxkLiAgVGhyZWFkcyBzaG91bGQgbm93IGJlIGNvcnJlY3RseQogIGNvbmZpZ3VyZWQgKG9uIEhQLVVYIDEwLjIwIGFuZCAxMS4wMCkuCgotIEZpeCBsYXJnZWZpbGUgc3VwcG9ydCBvbiBvbGRlciBOZXRCU0Qgc3lzdGVtcyBhbmQgT3BlbkJTRCBieSBhZGRpbmcKICBkZWZpbmUgZm9yIFRFTEw2NC4KCgpUb29scyBhbmQgb3RoZXIgbWlzY2VsbGFueQoKLSBmdHBtaXJyb3I6IENhbGwgdG8gbWFpbigpIGlzIHdyYXBwZWQgaW4gaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIi4KCi0gZnJlZXplOiBUaGUgbW9kdWxlZmluZGVyIG5vdyB3b3JrcyB3aXRoIDIuMCBvcGNvZGVzLgoKLSBJRExFOgogIE1vdmUgaGFja2VyeSBvZiBzeXMuYXJndiB1bnRpbCBhZnRlciB0aGUgVGsgaW5zdGFuY2UgaGFzIGJlZW4KICBjcmVhdGVkLCB3aGljaCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIFRraW50ZXIKICBpbml0aWFsaXphdGlvbiB0byBiZSBleGVjdXRlZCBpZiBwcmVzZW50OyBhbHNvIHBhc3MgYW4gZXhwbGljaXQKICBjbGFzc05hbWUgcGFyYW1ldGVyIHRvIHRoZSBUaygpIGNvbnN0cnVjdG9yLgoKCldoYXQncyBuZXcgaW4gMi4wIGJldGEgMT8KPT09PT09PT09PT09PT09PT09PT09PT09PQoKU291cmNlIEluY29tcGF0aWJpbGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKTm9uZS4gIE5vdGUgdGhhdCAxLjYgaW50cm9kdWNlZCBzZXZlcmFsIGluY29tcGF0aWJpbGl0aWVzIHdpdGggMS41LjIsCnN1Y2ggYXMgc2luZ2xlLWFyZ3VtZW50IGFwcGVuZCgpLCBjb25uZWN0KCkgYW5kIGJpbmQoKSwgYW5kIGNoYW5nZXMgdG8Kc3RyKGxvbmcpIGFuZCByZXByKGZsb2F0KS4KCgpCaW5hcnkgSW5jb21wYXRpYmlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIFRoaXJkIHBhcnR5IGV4dGVuc2lvbnMgYnVpbHQgZm9yIFB5dGhvbiAxLjUueCBvciAxLjYgY2Fubm90IGJlIHVzZWQKd2l0aCBQeXRob24gMi4wOyB0aGVzZSBleHRlbnNpb25zIHdpbGwgaGF2ZSB0byBiZSByZWJ1aWx0IGZvciBQeXRob24KMi4wLgoKLSBPbiBXaW5kb3dzLCBhdHRlbXB0aW5nIHRvIGltcG9ydCBhIHRoaXJkIHBhcnR5IGV4dGVuc2lvbiBidWlsdCBmb3IKUHl0aG9uIDEuNS54IG9yIDEuNiByZXN1bHRzIGluIGFuIGltbWVkaWF0ZSBjcmFzaDsgdGhlcmUncyBub3QgbXVjaCB3ZQpjYW4gZG8gYWJvdXQgdGhpcy4gIENoZWNrIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSEKCi0gUHl0aG9uIGJ5dGVjb2RlIGZpbGVzICgqLnB5YyBhbmQgKi5weW8pIGFyZSBub3QgY29tcGF0aWJsZSBiZXR3ZWVuCnJlbGVhc2VzLgoKCk92ZXJ2aWV3IG9mIENoYW5nZXMgU2luY2UgMS42Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGVyZSBhcmUgbWFueSBuZXcgbW9kdWxlcyAoaW5jbHVkaW5nIGJyYW5kIG5ldyBYTUwgc3VwcG9ydCB0aHJvdWdoCnRoZSB4bWwgcGFja2FnZSwgYW5kIGkxOG4gc3VwcG9ydCB0aHJvdWdoIHRoZSBnZXR0ZXh0IG1vZHVsZSk7IGEgbGlzdApvZiBhbGwgbmV3IG1vZHVsZXMgaXMgaW5jbHVkZWQgYmVsb3cuICBMb3RzIG9mIGJ1Z3MgaGF2ZSBiZWVuIGZpeGVkLgoKVGhlIHByb2Nlc3MgZm9yIG1ha2luZyBtYWpvciBuZXcgY2hhbmdlcyB0byB0aGUgbGFuZ3VhZ2UgaGFzIGNoYW5nZWQKc2luY2UgUHl0aG9uIDEuNi4gIEVuaGFuY2VtZW50cyBtdXN0IG5vdyBiZSBkb2N1bWVudGVkIGJ5IGEgUHl0aG9uCkVuaGFuY2VtZW50IFByb3Bvc2FsIChQRVApIGJlZm9yZSB0aGV5IGNhbiBiZSBhY2NlcHRlZC4KClRoZXJlIGFyZSBzZXZlcmFsIGltcG9ydGFudCBzeW50YXggZW5oYW5jZW1lbnRzLCBkZXNjcmliZWQgaW4gbW9yZQpkZXRhaWwgYmVsb3c6CgogIC0gQXVnbWVudGVkIGFzc2lnbm1lbnQsIGUuZy4geCArPSAxCgogIC0gTGlzdCBjb21wcmVoZW5zaW9ucywgZS5nLiBbeCoqMiBmb3IgeCBpbiByYW5nZSgxMCldCgogIC0gRXh0ZW5kZWQgaW1wb3J0IHN0YXRlbWVudCwgZS5nLiBpbXBvcnQgTW9kdWxlIGFzIE5hbWUKCiAgLSBFeHRlbmRlZCBwcmludCBzdGF0ZW1lbnQsIGUuZy4gcHJpbnQgPj4gZmlsZSwgIkhlbGxvIgoKT3RoZXIgaW1wb3J0YW50IGNoYW5nZXM6CgogIC0gT3B0aW9uYWwgY29sbGVjdGlvbiBvZiBjeWNsaWNhbCBnYXJiYWdlCgpQeXRob24gRW5oYW5jZW1lbnQgUHJvcG9zYWwgKFBFUCkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpQRVAgc3RhbmRzIGZvciBQeXRob24gRW5oYW5jZW1lbnQgUHJvcG9zYWwuICBBIFBFUCBpcyBhIGRlc2lnbgpkb2N1bWVudCBwcm92aWRpbmcgaW5mb3JtYXRpb24gdG8gdGhlIFB5dGhvbiBjb21tdW5pdHksIG9yIGRlc2NyaWJpbmcKYSBuZXcgZmVhdHVyZSBmb3IgUHl0aG9uLiAgVGhlIFBFUCBzaG91bGQgcHJvdmlkZSBhIGNvbmNpc2UgdGVjaG5pY2FsCnNwZWNpZmljYXRpb24gb2YgdGhlIGZlYXR1cmUgYW5kIGEgcmF0aW9uYWxlIGZvciB0aGUgZmVhdHVyZS4KCldlIGludGVuZCBQRVBzIHRvIGJlIHRoZSBwcmltYXJ5IG1lY2hhbmlzbXMgZm9yIHByb3Bvc2luZyBuZXcKZmVhdHVyZXMsIGZvciBjb2xsZWN0aW5nIGNvbW11bml0eSBpbnB1dCBvbiBhbiBpc3N1ZSwgYW5kIGZvcgpkb2N1bWVudGluZyB0aGUgZGVzaWduIGRlY2lzaW9ucyB0aGF0IGhhdmUgZ29uZSBpbnRvIFB5dGhvbi4gIFRoZSBQRVAKYXV0aG9yIGlzIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyBjb25zZW5zdXMgd2l0aGluIHRoZSBjb21tdW5pdHkgYW5kCmRvY3VtZW50aW5nIGRpc3NlbnRpbmcgb3BpbmlvbnMuCgpUaGUgUEVQcyBhcmUgYXZhaWxhYmxlIGF0IGh0dHA6Ly9weXRob24uc291cmNlZm9yZ2UubmV0L3BlcHMvLgoKQXVnbWVudGVkIEFzc2lnbm1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoaXMgbXVzdCBoYXZlIGJlZW4gdGhlIG1vc3QtcmVxdWVzdGVkIGZlYXR1cmUgb2YgdGhlIHBhc3QgeWVhcnMhCkVsZXZlbiBuZXcgYXNzaWdubWVudCBvcGVyYXRvcnMgd2VyZSBhZGRlZDoKCiAgICArPSAtPSAqPSAvPSAlPSAqKj0gPDw9ID4+PSAmPSBePSB8PQoKRm9yIGV4YW1wbGUsCgogICAgQSArPSBCCgppcyBzaW1pbGFyIHRvCgogICAgQSA9IEEgKyBCCgpleGNlcHQgdGhhdCBBIGlzIGV2YWx1YXRlZCBvbmx5IG9uY2UgKHJlbGV2YW50IHdoZW4gQSBpcyBzb21ldGhpbmcKbGlrZSBkaWN0W2luZGV4XS5hdHRyKS4KCkhvd2V2ZXIsIGlmIEEgaXMgYSBtdXRhYmxlIG9iamVjdCwgQSBtYXkgYmUgbW9kaWZpZWQgaW4gcGxhY2UuICBUaHVzLAppZiBBIGlzIGEgbnVtYmVyIG9yIGEgc3RyaW5nLCBBICs9IEIgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBBID0gQStCCihleGNlcHQgQSBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlKTsgYnV0IGlmIGEgaXMgYSBsaXN0LCBBICs9IEIgaGFzIHRoZQpzYW1lIGVmZmVjdCBhcyBBLmV4dGVuZChCKSEKCkNsYXNzZXMgYW5kIGJ1aWx0LWluIG9iamVjdCB0eXBlcyBjYW4gb3ZlcnJpZGUgdGhlIG5ldyBvcGVyYXRvcnMgaW4Kb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBpbi1wbGFjZSBiZWhhdmlvcjsgdGhlIG5vdC1pbi1wbGFjZSBiZWhhdmlvciBpcwp1c2VkIGF1dG9tYXRpY2FsbHkgYXMgYSBmYWxsYmFjayB3aGVuIGFuIG9iamVjdCBkb2Vzbid0IGltcGxlbWVudCB0aGUKaW4tcGxhY2UgYmVoYXZpb3IuICBGb3IgY2xhc3NlcywgdGhlIG1ldGhvZCBuYW1lIGlzIGRlcml2ZWQgZnJvbSB0aGUKbWV0aG9kIG5hbWUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG5vdC1pbi1wbGFjZSBvcGVyYXRvciBieSBpbnNlcnRpbmcKYW4gJ2knIGluIGZyb250IG9mIHRoZSBuYW1lLCBlLmcuIF9faWFkZF9fIGltcGxlbWVudHMgaW4tcGxhY2UKX19hZGRfXy4KCkF1Z21lbnRlZCBhc3NpZ25tZW50IHdhcyBpbXBsZW1lbnRlZCBieSBUaG9tYXMgV291dGVycy4KCgpMaXN0IENvbXByZWhlbnNpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0KClRoaXMgaXMgYSBmbGV4aWJsZSBuZXcgbm90YXRpb24gZm9yIGxpc3RzIHdob3NlIGVsZW1lbnRzIGFyZSBjb21wdXRlZApmcm9tIGFub3RoZXIgbGlzdCAob3IgbGlzdHMpLiAgVGhlIHNpbXBsZXN0IGZvcm0gaXM6CgogICAgWzxleHByZXNzaW9uPiBmb3IgPHZhcmlhYmxlPiBpbiA8c2VxdWVuY2U+XQoKRm9yIGV4YW1wbGUsIFtpKioyIGZvciBpIGluIHJhbmdlKDQpXSB5aWVsZHMgdGhlIGxpc3QgWzAsIDEsIDQsIDldLgpUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gYSBmb3IgbG9vcCB3aXRoIGEgbGlzdC5hcHBlbmQoKSBjYWxsLgoKWW91IGNhbiBhbHNvIGFkZCBhIGNvbmRpdGlvbjoKCiAgICBbPGV4cHJlc3Npb24+IGZvciA8dmFyaWFibGU+IGluIDxzZXF1ZW5jZT4gaWYgPGNvbmRpdGlvbj5dCgpGb3IgZXhhbXBsZSwgW3cgZm9yIHcgaW4gd29yZHMgaWYgdyA9PSB3Lmxvd2VyKCldIHdvdWxkIHlpZWxkIHRoZSBsaXN0Cm9mIHdvcmRzIHRoYXQgY29udGFpbiBubyB1cHBlcmNhc2UgY2hhcmFjdGVycy4gIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQKdGhhbiBhIGZvciBsb29wIHdpdGggYW4gaWYgc3RhdGVtZW50IGFuZCBhIGxpc3QuYXBwZW5kKCkgY2FsbC4KCllvdSBjYW4gYWxzbyBoYXZlIG5lc3RlZCBmb3IgbG9vcHMgYW5kIG1vcmUgdGhhbiBvbmUgJ2lmJyBjbGF1c2UuICBGb3IKZXhhbXBsZSwgaGVyZSdzIGEgZnVuY3Rpb24gdGhhdCBmbGF0dGVucyBhIHNlcXVlbmNlIG9mIHNlcXVlbmNlczo6CgogICAgZGVmIGZsYXR0ZW4oc2VxKToKICAgICAgICByZXR1cm4gW3ggZm9yIHN1YnNlcSBpbiBzZXEgZm9yIHggaW4gc3Vic2VxXQoKICAgIGZsYXR0ZW4oW1swXSwgWzEsMiwzXSwgWzQsNV0sIFs2LDcsOCw5XSwgW11dKQoKVGhpcyBwcmludHMKCiAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KCkxpc3QgY29tcHJlaGVuc2lvbnMgb3JpZ2luYXRlZCBhcyBhIHBhdGNoIHNldCBmcm9tIEdyZWcgRXdpbmc7IFNraXAKTW9udGFuYXJvIGFuZCBUaG9tYXMgV291dGVycyBhbHNvIGNvbnRyaWJ1dGVkLiAgRGVzY3JpYmVkIGJ5IFBFUCAyMDIuCgoKRXh0ZW5kZWQgSW1wb3J0IFN0YXRlbWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpNYW55IHBlb3BsZSBoYXZlIGFza2VkIGZvciBhIHdheSB0byBpbXBvcnQgYSBtb2R1bGUgdW5kZXIgYSBkaWZmZXJlbnQKbmFtZS4gIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBsaWtlIHRoaXM6CgogICAgaW1wb3J0IGZvbwogICAgYmFyID0gZm9vCiAgICBkZWwgZm9vCgpidXQgdGhpcyBjb21tb24gaWRpb20gZ2V0cyBvbGQgcXVpY2tseS4gIEEgc2ltcGxlIGV4dGVuc2lvbiBvZiB0aGUKaW1wb3J0IHN0YXRlbWVudCBub3cgYWxsb3dzIHRoaXMgdG8gYmUgd3JpdHRlbiBhcyBmb2xsb3dzOgoKICAgIGltcG9ydCBmb28gYXMgYmFyCgpUaGVyZSdzIGFsc28gYSB2YXJpYW50IGZvciAnZnJvbSAuLi4gaW1wb3J0JzoKCiAgICBmcm9tIGZvbyBpbXBvcnQgYmFyIGFzIHNwYW0KClRoaXMgYWxzbyB3b3JrcyB3aXRoIHBhY2thZ2VzOyBlLmcuIHlvdSBjYW4gd3JpdGUgdGhpczoKCiAgICBpbXBvcnQgdGVzdC5yZWdydGVzdCBhcyByZWdydGVzdAoKTm90ZSB0aGF0ICdhcycgaXMgbm90IGEgbmV3IGtleXdvcmQgLS0gaXQgaXMgcmVjb2duaXplZCBvbmx5IGluIHRoaXMKY29udGV4dCAodGhpcyBpcyBvbmx5IHBvc3NpYmxlIGJlY2F1c2UgdGhlIHN5bnRheCBmb3IgdGhlIGltcG9ydApzdGF0ZW1lbnQgZG9lc24ndCBpbnZvbHZlIGV4cHJlc3Npb25zKS4KCkltcGxlbWVudGVkIGJ5IFRob21hcyBXb3V0ZXJzLiAgRGVzY3JpYmVkIGJ5IFBFUCAyMjEuCgoKRXh0ZW5kZWQgUHJpbnQgU3RhdGVtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRWFzaWx5IHRoZSBtb3N0IGNvbnRyb3ZlcnNpYWwgbmV3IGZlYXR1cmUsIHRoaXMgZXh0ZW5zaW9uIHRvIHRoZSBwcmludApzdGF0ZW1lbnQgYWRkcyBhbiBvcHRpb24gdG8gbWFrZSB0aGUgb3V0cHV0IGdvIHRvIGEgZGlmZmVyZW50IGZpbGUKdGhhbiB0aGUgZGVmYXVsdCBzeXMuc3Rkb3V0LgoKRm9yIGV4YW1wbGUsIHRvIHdyaXRlIGFuIGVycm9yIG1lc3NhZ2UgdG8gc3lzLnN0ZGVyciwgeW91IGNhbiBub3cKd3JpdGU6CgogICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkVycm9yOiBiYWQgZG9nISIKCkFzIGEgc3BlY2lhbCBmZWF0dXJlLCBpZiB0aGUgZXhwcmVzc2lvbiB1c2VkIHRvIGluZGljYXRlIHRoZSBmaWxlCmV2YWx1YXRlcyB0byBOb25lLCB0aGUgY3VycmVudCB2YWx1ZSBvZiBzeXMuc3Rkb3V0IGlzIHVzZWQuICBUaHVzOgoKICAgIHByaW50ID4+IE5vbmUsICJIZWxsbyB3b3JsZCIKCmlzIGVxdWl2YWxlbnQgdG8KCiAgICBwcmludCAiSGVsbG8gd29ybGQiCgpEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5IEJhcnJ5IFdhcnNhdy4gIERlc2NyaWJlZCBieSBQRVAgMjE0LgoKCk9wdGlvbmFsIENvbGxlY3Rpb24gb2YgQ3ljbGljYWwgR2FyYmFnZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClB5dGhvbiBpcyBub3cgZXF1aXBwZWQgd2l0aCBhIGdhcmJhZ2UgY29sbGVjdG9yIHRoYXQgY2FuIGh1bnQgZG93bgpjeWNsaWNhbCByZWZlcmVuY2VzIGJldHdlZW4gUHl0aG9uIG9iamVjdHMuICBJdCdzIG5vIHJlcGxhY2VtZW50IGZvcgpyZWZlcmVuY2UgY291bnRpbmc7IGluIGZhY3QsIGl0IGRlcGVuZHMgb24gdGhlIHJlZmVyZW5jZSBjb3VudHMgYmVpbmcKY29ycmVjdCwgYW5kIGRlY2lkZXMgdGhhdCBhIHNldCBvZiBvYmplY3RzIGJlbG9uZyB0byBhIGN5Y2xlIGlmIGFsbAp0aGVpciByZWZlcmVuY2UgY291bnRzIGNhbiBiZSBhY2NvdW50ZWQgZm9yIGZyb20gdGhlaXIgcmVmZXJlbmNlcyB0bwplYWNoIG90aGVyLiAgVGhpcyBkZXZpb3VzIHNjaGVtZSB3YXMgZmlyc3QgcHJvcG9zZWQgYnkgRXJpYyBUaWVkZW1hbm4sCmFuZCBicm91Z2h0IHRvIGltcGxlbWVudGF0aW9uIGJ5IE5laWwgU2NoZW1lbmF1ZXIuCgpUaGVyZSdzIGEgbW9kdWxlICJnYyIgdGhhdCBsZXRzIHlvdSBjb250cm9sIHNvbWUgcGFyYW1ldGVycyBvZiB0aGUKZ2FyYmFnZSBjb2xsZWN0aW9uLiAgVGhlcmUncyBhbHNvIGFuIG9wdGlvbiB0byB0aGUgY29uZmlndXJlIHNjcmlwdAp0aGF0IGxldHMgeW91IGVuYWJsZSBvciBkaXNhYmxlIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24uICBJbiAyLjBiMSwKaXQncyBvbiBieSBkZWZhdWx0LCBzbyB0aGF0IHdlIChob3BlZnVsbHkpIGNhbiBjb2xsZWN0IGRlY2VudCB1c2VyCmV4cGVyaWVuY2Ugd2l0aCB0aGlzIG5ldyBmZWF0dXJlLiAgVGhlcmUgYXJlIHNvbWUgcXVlc3Rpb25zIGFib3V0IGl0cwpwZXJmb3JtYW5jZS4gIElmIGl0IHByb3ZlcyB0byBiZSB0b28gbXVjaCBvZiBhIHByb2JsZW0sIHdlJ2xsIHR1cm4gaXQKb2ZmIGJ5IGRlZmF1bHQgaW4gdGhlIGZpbmFsIDIuMCByZWxlYXNlLgoKClNtYWxsZXIgQ2hhbmdlcwotLS0tLS0tLS0tLS0tLS0KCkEgbmV3IGZ1bmN0aW9uIHppcCgpIHdhcyBhZGRlZC4gIHppcChzZXExLCBzZXEyLCAuLi4pIGlzIGVxdWl2YWxlbnQgdG8KbWFwKE5vbmUsIHNlcTEsIHNlcTIsIC4uLikgd2hlbiB0aGUgc2VxdWVuY2VzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoOwppLmUuIHppcChbMSwyLDNdLCBbMTAsMjAsMzBdKSByZXR1cm5zIFsoMSwxMCksICgyLDIwKSwgKDMsMzApXS4gIFdoZW4KdGhlIGxpc3RzIGFyZSBub3QgYWxsIHRoZSBzYW1lIGxlbmd0aCwgdGhlIHNob3J0ZXN0IGxpc3Qgd2luczoKemlwKFsxLDIsM10sIFsxMCwyMF0pIHJldHVybnMgWygxLDEwKSwgKDIsMjApXS4gIFNlZSBQRVAgMjAxLgoKc3lzLnZlcnNpb25faW5mbyBpcyBhIHR1cGxlIChtYWpvciwgbWlub3IsIG1pY3JvLCBsZXZlbCwgc2VyaWFsKS4KCkRpY3Rpb25hcmllcyBoYXZlIGFuIG9kZCBuZXcgbWV0aG9kLCBzZXRkZWZhdWx0KGtleSwgZGVmYXVsdCkuCmRpY3Quc2V0ZGVmYXVsdChrZXksIGRlZmF1bHQpIHJldHVybnMgZGljdFtrZXldIGlmIGl0IGV4aXN0czsgaWYgbm90LAppdCBzZXRzIGRpY3Rba2V5XSB0byBkZWZhdWx0IGFuZCByZXR1cm5zIHRoYXQgdmFsdWUuICBUaHVzOgoKICAgIGRpY3Quc2V0ZGVmYXVsdChrZXksIFtdKS5hcHBlbmQoaXRlbSkKCmRvZXMgdGhlIHNhbWUgd29yayBhcyB0aGlzIGNvbW1vbiBpZGlvbToKCiAgICBpZiBub3QgZGljdC5oYXNfa2V5KGtleSk6CiAgICAgICAgZGljdFtrZXldID0gW10KICAgIGRpY3Rba2V5XS5hcHBlbmQoaXRlbSkKClRoZXJlIGFyZSB0d28gbmV3IHZhcmlhbnRzIG9mIFN5bnRheEVycm9yIHRoYXQgYXJlIHJhaXNlZCBmb3IKaW5kZW50YXRpb24tcmVsYXRlZCBlcnJvcnM6IEluZGVudGF0aW9uRXJyb3IgYW5kIFRhYkVycm9yLgoKQ2hhbmdlZCBceCB0byBjb25zdW1lIGV4YWN0bHkgdHdvIGhleCBkaWdpdHM7IHNlZSBQRVAgMjIzLiAgQWRkZWQgXFUKZXNjYXBlIHRoYXQgY29uc3VtZXMgZXhhY3RseSBlaWdodCBoZXggZGlnaXRzLgoKVGhlIGxpbWl0cyBvbiB0aGUgc2l6ZSBvZiBleHByZXNzaW9ucyBhbmQgZmlsZSBpbiBQeXRob24gc291cmNlIGNvZGUKaGF2ZSBiZWVuIHJhaXNlZCBmcm9tIDIqKjE2IHRvIDIqKjMyLiAgUHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uCndlcmUgbGltaXRlZCBiZWNhdXNlIHRoZSBtYXhpbXVtIGFyZ3VtZW50IHNpemUgdGhlIFB5dGhvbiBWTSBhY2NlcHRlZAp3YXMgMioqMTYuICBUaGlzIGxpbWl0ZWQgdGhlIHNpemUgb2Ygb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb25zLAplLmcuIFsxLDIsM10gb3IgeydhJzoxLCAnYic6Mn0sIGFuZCB0aGUgc2l6ZSBvZiBzb3VyY2UgZmlsZXMuICBUaGlzCmxpbWl0IHdhcyByYWlzZWQgdGhhbmtzIHRvIGEgcGF0Y2ggYnkgQ2hhcmxlcyBXYWxkbWFuIHRoYXQgZWZmZWN0aXZlbHkKZml4ZXMgdGhlIHByb2JsZW0uICBJdCBpcyBub3cgbXVjaCBtb3JlIGxpa2VseSB0aGF0IHlvdSB3aWxsIGJlCmxpbWl0ZWQgYnkgYXZhaWxhYmxlIG1lbW9yeSB0aGFuIGJ5IGFuIGFyYml0cmFyeSBsaW1pdCBpbiBQeXRob24uCgpUaGUgaW50ZXJwcmV0ZXIncyBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCBjYW4gYmUgbW9kaWZpZWQgYnkgUHl0aG9uCnByb2dyYW1zIHVzaW5nIHN5cy5nZXRyZWN1cnNpb25saW1pdCBhbmQgc3lzLnNldHJlY3Vyc2lvbmxpbWl0LiAgVGhpcwpsaW1pdCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVjdXJzaXZlIGNhbGxzIHRoYXQgY2FuIGJlIG1hZGUgYnkKUHl0aG9uIGNvZGUuICBUaGUgbGltaXQgZXhpc3RzIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGZyb20Kb3ZlcmZsb3dpbmcgdGhlIEMgc3RhY2sgYW5kIGNhdXNpbmcgYSBjb3JlIGR1bXAuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcwoxMDAwLiAgVGhlIG1heGltdW0gc2FmZSB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIHBsYXRmb3JtIGNhbiBiZSBmb3VuZApieSBydW5uaW5nIE1pc2MvZmluZF9yZWN1cnNpb25saW1pdC5weS4KCk5ldyBNb2R1bGVzIGFuZCBQYWNrYWdlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmF0ZXhpdCAtIGZvciByZWdpc3RlcmluZyBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIHdoZW4gUHl0aG9uIGV4aXRzLgoKaW1wdXRpbCAtIEdyZWcgU3RlaW4ncyBhbHRlcm5hdGl2ZSBBUEkgZm9yIHdyaXRpbmcgY3VzdG9tIGltcG9ydApob29rcy4KCnB5ZXhwYXQgLSBhbiBpbnRlcmZhY2UgdG8gdGhlIEV4cGF0IFhNTCBwYXJzZXIsIGNvbnRyaWJ1dGVkIGJ5IFBhdWwKUHJlc2NvZC4KCnhtbCAtIGEgbmV3IHBhY2thZ2Ugd2l0aCBYTUwgc3VwcG9ydCBjb2RlIG9yZ2FuaXplZCAoc28gZmFyKSBpbiB0aHJlZQpzdWJwYWNrYWdlczogeG1sLmRvbSwgeG1sLnNheCwgYW5kIHhtbC5wYXJzZXJzLiAgRGVzY3JpYmluZyB0aGVzZQp3b3VsZCBmaWxsIGEgdm9sdW1lLiAgVGhlcmUncyBhIHNwZWNpYWwgZmVhdHVyZSB3aGVyZWJ5IGEKdXNlci1pbnN0YWxsZWQgcGFja2FnZSBuYW1lZCBfeG1scGx1cyBvdmVycmlkZXMgdGhlIHN0YW5kYXJkCnhtbHBhY2thZ2U7IHRoaXMgaXMgaW50ZW5kZWQgdG8gZ2l2ZSB0aGUgWE1MIFNJRyBhIGhvb2sgdG8gZGlzdHJpYnV0ZQpiYWNrd2FyZHMtY29tcGF0aWJsZSB1cGRhdGVzIHRvIHRoZSBzdGFuZGFyZCB4bWwgcGFja2FnZS4KCndlYmJyb3dzZXIgLSBhIHBsYXRmb3JtLWluZGVwZW5kZW50IEFQSSB0byBsYXVuY2ggYSB3ZWIgYnJvd3Nlci4KCgpDaGFuZ2VkIE1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tCgphcnJheSAtLSBuZXcgbWV0aG9kcyBmb3IgYXJyYXkgb2JqZWN0czogY291bnQsIGV4dGVuZCwgaW5kZXgsIHBvcCwgYW5kCnJlbW92ZQoKYmluYXNjaWkgLS0gbmV3IGZ1bmN0aW9ucyBiMmFfaGV4IGFuZCBhMmJfaGV4IHRoYXQgY29udmVydCBiZXR3ZWVuCmJpbmFyeSBkYXRhIGFuZCBpdHMgaGV4IHJlcHJlc2VudGF0aW9uCgpjYWxlbmRhciAtLSBNYW55IG5ldyBmdW5jdGlvbnMgdGhhdCBzdXBwb3J0IGZlYXR1cmVzIGluY2x1ZGluZyBjb250cm9sCm92ZXIgd2hpY2ggZGF5IG9mIHRoZSB3ZWVrIGlzIHRoZSBmaXJzdCBkYXksIHJldHVybmluZyBzdHJpbmdzIGluc3RlYWQKb2YgcHJpbnRpbmcgdGhlbS4gIEFsc28gbmV3IHN5bWJvbGljIGNvbnN0YW50cyBmb3IgZGF5cyBvZiB3ZWVrLAplLmcuIE1PTkRBWSwgLi4uLCBTVU5EQVkuCgpjZ2kgLS0gRmllbGRTdG9yYWdlIG9iamVjdHMgaGF2ZSBhIGdldHZhbHVlIG1ldGhvZCB0aGF0IHdvcmtzIGxpa2UgYQpkaWN0aW9uYXJ5J3MgZ2V0IG1ldGhvZCBhbmQgcmV0dXJucyB0aGUgdmFsdWUgYXR0cmlidXRlIG9mIHRoZSBvYmplY3QuCgpDb25maWdQYXJzZXIgLS0gVGhlIHBhcnNlciBvYmplY3QgaGFzIG5ldyBtZXRob2RzIGhhc19vcHRpb24sCnJlbW92ZV9zZWN0aW9uLCByZW1vdmVfb3B0aW9uLCBzZXQsIGFuZCB3cml0ZS4gIFRoZXkgYWxsb3cgdGhlIG1vZHVsZQp0byBiZSB1c2VkIGZvciB3cml0aW5nIGNvbmZpZyBmaWxlcyBhcyB3ZWxsIGFzIHJlYWRpbmcgdGhlbS4KCmZ0cGxpYiAtLSBudHJhbnNmZXJjbWQoKSwgdHJhbnNmZXJjbWQoKSwgYW5kIHJldHJiaW5hcnkoKSBhbGwgbm93Cm9wdGlvbmFsbHkgc3VwcG9ydCB0aGUgUkZDIDk1OSBSRVNUIGNvbW1hbmQuCgpnemlwIC0tIHJlYWRsaW5lIGFuZCByZWFkbGluZXMgbm93IGFjY2VwdCBvcHRpb25hbCBzaXplIGFyZ3VtZW50cwoKaHR0cGxpYiAtLSBOZXcgaW50ZXJmYWNlcyBhbmQgc3VwcG9ydCBmb3IgSFRUUC8xLjEgYnkgR3JlZyBTdGVpbi4gIFNlZQp0aGUgbW9kdWxlIGRvYyBzdHJpbmdzIGZvciBkZXRhaWxzLgoKbG9jYWxlIC0tIGltcGxlbWVudCBnZXRkZWZhdWx0bG9jYWxlIGZvciBXaW4zMiBhbmQgTWFjaW50b3NoCgptYXJzaGFsIC0tIG5vIGxvbmdlciBkdW1wcyBjb3JlIHdoZW4gbWFyc2hhbGluZyBkZWVwbHkgbmVzdGVkIG9yCnJlY3Vyc2l2ZSBkYXRhIHN0cnVjdHVyZXMKCm9zIC0tIG5ldyBmdW5jdGlvbnMgaXNhdHR5LCBzZXRldWlkLCBzZXRlZ2lkLCBzZXRyZXVpZCwgc2V0cmVnaWQKCm9zL3BvcGVuMiAtLSBwb3BlbjIvcG9wZW4zL3BvcGVuNCBzdXBwb3J0IHVuZGVyIFdpbmRvd3MuICBwb3BlbjIvcG9wZW4zCnN1cHBvcnQgdW5kZXIgVW5peC4KCm9zL3B0eSAtLSBzdXBwb3J0IGZvciBvcGVucHR5IGFuZCBmb3JrcHR5Cgpvcy5wYXRoIC0tIGZpeCBzZW1hbnRpY3Mgb2Ygb3MucGF0aC5jb21tb25wcmVmaXgKCnNtdHBsaWIgLS0gc3VwcG9ydCBmb3Igc2VuZGluZyB2ZXJ5IGxvbmcgbWVzc2FnZXMKCnNvY2tldCAtLSBuZXcgZnVuY3Rpb24gZ2V0ZnFkbigpCgpyZWFkbGluZSAtLSBuZXcgZnVuY3Rpb25zIHRvIHJlYWQsIHdyaXRlIGFuZCB0cnVuY2F0ZSBoaXN0b3J5IGZpbGVzLgpUaGUgcmVhZGxpbmUgc2VjdGlvbiBvZiB0aGUgbGlicmFyeSByZWZlcmVuY2UgbWFudWFsIGNvbnRhaW5zIGFuCmV4YW1wbGUuCgpzZWxlY3QgLS0gYWRkIGludGVyZmFjZSB0byBwb2xsIHN5c3RlbSBjYWxsCgpzaHV0aWwgLS0gbmV3IGNvcHlmaWxlb2JqIGZ1bmN0aW9uCgpTaW1wbGVIVFRQU2VydmVyLCBDR0lIVFRQU2VydmVyIC0tIEZpeCBwcm9ibGVtcyB3aXRoIGJ1ZmZlcmluZyBpbiB0aGUKSFRUUCBzZXJ2ZXIuCgpUa2ludGVyIC0tIG9wdGltaXphdGlvbiBvZiBmdW5jdGlvbiBmbGF0dGVuCgp1cmxsaWIgLS0gc2NhbnMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBwcm94eSBjb25maWd1cmF0aW9uLAplLmcuIGh0dHBfcHJveHkuCgp3aGljaGRiIC0tIHJlY29nbml6ZXMgZHVtYmRibSBmb3JtYXQKCgpPYnNvbGV0ZSBNb2R1bGVzCi0tLS0tLS0tLS0tLS0tLS0KCk5vbmUuICBIb3dldmVyIG5vdGUgdGhhdCAxLjYgbWFkZSBhIHdob2xlIHNsZXcgb2YgbW9kdWxlcyBvYnNvbGV0ZToKc3Rkd2luLCBzb3VuZGV4LCBjbWwsIGNtcGNhY2hlLCBkaXJjYWNoZSwgZHVtcCwgZmluZCwgZ3JlcCwgcGFja21haWwsCnBvbHksIHptb2QsIHN0cm9wLCB1dGlsLCB3aGF0c291bmQuCgoKQ2hhbmdlZCwgTmV3LCBPYnNvbGV0ZSBUb29scwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpOb25lLgoKCkMtbGV2ZWwgQ2hhbmdlcwotLS0tLS0tLS0tLS0tLS0KClNldmVyYWwgY2xlYW51cCBqb2JzIHdlcmUgY2FycmllZCBvdXQgdGhyb3VnaG91dCB0aGUgc291cmNlIGNvZGUuCgpBbGwgQyBjb2RlIHdhcyBjb252ZXJ0ZWQgdG8gQU5TSSBDOyB3ZSBnb3QgcmlkIG9mIGFsbCB1c2VzIG9mIHRoZQpQeV9QUk9UTygpIG1hY3JvLCB3aGljaCBtYWtlcyB0aGUgaGVhZGVyIGZpbGVzIGEgbG90IG1vcmUgcmVhZGFibGUuCgpNb3N0IG9mIHRoZSBwb3J0YWJpbGl0eSBoYWNrcyB3ZXJlIG1vdmVkIHRvIGEgbmV3IGhlYWRlciBmaWxlLApweXBvcnQuaDsgc2V2ZXJhbCBvdGhlciBuZXcgaGVhZGVyIGZpbGVzIHdlcmUgYWRkZWQgYW5kIHNvbWUgb2xkCmhlYWRlciBmaWxlcyB3ZXJlIHJlbW92ZWQsIGluIGFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgbW9yZSByYXRpb25hbCBzZXQKb2YgaGVhZGVyIGZpbGVzLiAgKEZldyBvZiB0aGVzZSBldmVyIG5lZWQgdG8gYmUgaW5jbHVkZWQgZXhwbGljaXRseTsKdGhleSBhcmUgYWxsIGluY2x1ZGVkIGJ5IFB5dGhvbi5oLikKClRyZW50IE1pY2sgZW5zdXJlZCBwb3J0YWJpbGl0eSB0byA2NC1iaXQgcGxhdGZvcm1zLCB1bmRlciBib3RoIExpbnV4CmFuZCBXaW42NCwgZXNwZWNpYWxseSBmb3IgdGhlIG5ldyBJbnRlbCBJdGFuaXVtIHByb2Nlc3Nvci4gIE1pY2sgYWxzbwphZGRlZCBsYXJnZSBmaWxlIHN1cHBvcnQgZm9yIExpbnV4NjQgYW5kIFdpbjY0LgoKVGhlIEMgQVBJcyB0byByZXR1cm4gYW4gb2JqZWN0J3Mgc2l6ZSBoYXZlIGJlZW4gdXBkYXRlIHRvIGNvbnNpc3RlbnRseQp1c2UgdGhlIGZvcm0gUHlYWFhfU2l6ZSwgZS5nLiBQeVNlcXVlbmNlX1NpemUgYW5kIFB5RGljdF9TaXplLiAgSW4KcHJldmlvdXMgdmVyc2lvbnMsIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2VzIHVzZWQgUHlYWFhfTGVuZ3RoIGFuZCB0aGUKY29uY3JldGUgaW50ZXJmYWNlcyB1c2VkIFB5WFhYX1NpemUuICBUaGUgb2xkIG5hbWVzLAplLmcuIFB5T2JqZWN0X0xlbmd0aCwgYXJlIHN0aWxsIGF2YWlsYWJsZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKYXQgdGhlIEFQSSBsZXZlbCwgYnV0IGFyZSBkZXByZWNhdGVkLgoKVGhlIFB5T1NfQ2hlY2tTdGFjayBmdW5jdGlvbiBoYXMgYmVlbiBpbXBsZW1lbnRlZCBvbiBXaW5kb3dzIGJ5CkZyZWRyaWsgTHVuZGguICBJdCBwcmV2ZW50cyBQeXRob24gZnJvbSBmYWlsaW5nIHdpdGggYSBzdGFjayBvdmVyZmxvdwpvbiBXaW5kb3dzLgoKVGhlIEdDIGNoYW5nZXMgcmVzdWx0ZWQgaW4gY3JlYXRpb24gb2YgdHdvIG5ldyBzbG90cyBvbiBvYmplY3QsCnRwX3RyYXZlcnNlIGFuZCB0cF9jbGVhci4gIFRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBjaGFuZ2VzIHJlc3VsdCBpbgp0aGUgY3JlYXRpb24gb2YgYSBuZXcgc2xvdCBmb3IgZWFjaCBpbi1wbGFjZSBvcGVyYXRvci4KClRoZSBHQyBBUEkgY3JlYXRlcyBuZXcgcmVxdWlyZW1lbnRzIGZvciBjb250YWluZXIgdHlwZXMgaW1wbGVtZW50ZWQgaW4KQyBleHRlbnNpb24gbW9kdWxlcy4gIFNlZSBJbmNsdWRlL29iamltcGwuaCBmb3IgZGV0YWlscy4KClB5RXJyX0Zvcm1hdCBoYXMgYmVlbiB1cGRhdGVkIHRvIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlIHRoZSBzaXplIG9mCnRoZSBidWZmZXIgbmVlZGVkIHRvIGhvbGQgdGhlIGZvcm1hdHRlZCByZXN1bHQgc3RyaW5nLiAgVGhpcyBjaGFuZ2UKcHJldmVudHMgY3Jhc2hlcyBjYXVzZWQgYnkgcHJvZ3JhbW1lciBlcnJvci4KCk5ldyBDIEFQSSBjYWxsczogUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvciwgUHlFcnJfV3JpdGVVbnJhaXNhYmxlLgoKUHlSdW5fQW55RmlsZUV4LCBQeVJ1bl9TaW1wbGVGaWxlRXgsIFB5UnVuX0ZpbGVFeCAtLSBOZXcgZnVuY3Rpb25zCnRoYXQgYXJlIHRoZSBzYW1lIGFzIHRoZWlyIG5vbi1FeCBjb3VudGVycGFydHMgZXhjZXB0IHRoZXkgdGFrZSBhbgpleHRyYSBmbGFnIGFyZ3VtZW50IHRoYXQgdGVsbHMgdGhlbSB0byBjbG9zZSB0aGUgZmlsZSB3aGVuIGRvbmUuCgpYWFggVGhlcmUgd2VyZSBvdGhlciBBUEkgY2hhbmdlcyB0aGF0IHNob3VsZCBiZSBmbGVzaGVkIG91dCBoZXJlLgoKCldpbmRvd3MgQ2hhbmdlcwotLS0tLS0tLS0tLS0tLS0KCk5ldyBwb3BlbjIvcG9wZW4zL3Blb3BlbjQgaW4gb3MgbW9kdWxlIChzZWUgQ2hhbmdlZCBNb2R1bGVzIGFib3ZlKS4KCm9zLnBvcGVuIGlzIG11Y2ggbW9yZSB1c2FibGUgb24gV2luZG93cyA5NSBhbmQgOTguICBTZWUgTWljcm9zb2Z0Cktub3dsZWRnZSBCYXNlIGFydGljbGUgUTE1MDk1Ni4gIFRoZSBXaW45eCB3b3JrYXJvdW5kIGRlc2NyaWJlZCB0aGVyZQppcyBpbXBsZW1lbnRlZCBieSB0aGUgbmV3IHc5eHBvcGVuLmV4ZSBoZWxwZXIgaW4gdGhlIHJvb3Qgb2YgeW91cgpQeXRob24gaW5zdGFsbGF0aW9uLiAgTm90ZSB0aGF0IFB5dGhvbiB1c2VzIHRoaXMgaW50ZXJuYWxseTsgaXQgaXMgbm90CmEgc3RhbmRhbG9uZSBwcm9ncmFtLgoKQWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQgdG8gaW5zdGFsbCBQeXRob24Kb24gV2luZG93cyBOVCBvciBXaW5kb3dzIDIwMDAuICBJZiB5b3UgaGF2ZSBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMsClB5dGhvbidzIHJlZ2lzdHJ5IGluZm8gd2lsbCBiZSB3cml0dGVuIHVuZGVyIEhLRVlfTE9DQUxfTUFDSElORS4KT3RoZXJ3aXNlIHRoZSBpbnN0YWxsZXIgYmFja3Mgb2ZmIHRvIHdyaXRpbmcgUHl0aG9uJ3MgcmVnaXN0cnkgaW5mbwp1bmRlciBIS0VZX0NVUlJFTlRfVVNFUi4gIFRoZSBsYXR0ZXIgaXMgc3VmZmljaWVudCBmb3IgYWxsICJub3JtYWwiCnVzZXMgb2YgUHl0aG9uLCBidXQgd2lsbCBwcmV2ZW50IHNvbWUgYWR2YW5jZWQgdXNlcyBmcm9tIHdvcmtpbmcKKGZvciBleGFtcGxlLCBydW5uaW5nIGEgUHl0aG9uIHNjcmlwdCBhcyBhbiBOVCBzZXJ2aWNlLCBvciBwb3NzaWJseQpmcm9tIENHSSkuCgpbVGhpcyB3YXMgbmV3IGluIDEuNl0gVGhlIGluc3RhbGxlciBubyBsb25nZXIgcnVucyBhIHNlcGFyYXRlIFRjbC9UawppbnN0YWxsZXI7IGluc3RlYWQsIGl0IGluc3RhbGxzIHRoZSBuZWVkZWQgVGNsL1RrIGZpbGVzIGRpcmVjdGx5IGluIHRoZQpQeXRob24gZGlyZWN0b3J5LiAgSWYgeW91IGFscmVhZHkgaGF2ZSBhIFRjbC9UayBpbnN0YWxsYXRpb24sIHRoaXMKd2FzdGVzIHNvbWUgZGlzayBzcGFjZSAoYWJvdXQgNCBNZWdzKSBidXQgYXZvaWRzIHByb2JsZW1zIHdpdGgKY29uZmxpY3RpbmcgVGNsL1RrIGluc3RhbGxhdGlvbnMsIGFuZCBtYWtlcyBpdCBtdWNoIGVhc2llciBmb3IgUHl0aG9uCnRvIGVuc3VyZSB0aGF0IFRjbC9UayBjYW4gZmluZCBhbGwgaXRzIGZpbGVzLgoKW1RoaXMgd2FzIG5ldyBpbiAxLjZdIFRoZSBXaW5kb3dzIGluc3RhbGxlciBub3cgaW5zdGFsbHMgYnkgZGVmYXVsdCBpbgpcUHl0aG9uMjBcIG9uIHRoZSBkZWZhdWx0IHZvbHVtZSwgaW5zdGVhZCBvZiBcUHJvZ3JhbSBGaWxlc1xQeXRob24tMi4wXC4KCgpVcGRhdGVzIHRvIHRoZSBjaGFuZ2VzIGJldHdlZW4gMS41LjIgYW5kIDEuNgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIDEuNiBORVdTIGZpbGUgY2FuJ3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgcmVsZWFzZSBpcyBkb25lLCBzbyBoZXJlCmlzIHNvbWUgbGF0ZS1icmVha2luZyBuZXdzOgoKTmV3IEFQSXMgaW4gbG9jYWxlLnB5OiBub3JtYWxpemUoKSwgZ2V0ZGVmYXVsdGxvY2FsZSgpLCByZXNldGxvY2FsZSgpLAphbmQgY2hhbmdlcyB0byBnZXRsb2NhbGUoKSBhbmQgc2V0bG9jYWxlKCkuCgpUaGUgbmV3IG1vZHVsZSBpcyBub3cgZW5hYmxlZCBwZXIgZGVmYXVsdC4KCkl0IGlzIG5vdCB0cnVlIHRoYXQgdGhlIGVuY29kaW5ncyBjb2RlY3MgY2Fubm90IGJlIHVzZWQgZm9yIG5vcm1hbApzdHJpbmdzOiB0aGUgc3RyaW5nLmVuY29kZSgpICh3aGljaCBpcyBhbHNvIHByZXNlbnQgb24gOC1iaXQgc3RyaW5ncwohKSBhbGxvd3MgdXNpbmcgdGhlbSBmb3IgOC1iaXQgc3RyaW5ncyB0b28sIGUuZy4gdG8gY29udmVydCBmaWxlcyBmcm9tCmNwMTI1MiAoV2luZG93cykgdG8gbGF0aW4tMSBvciB2aWNlLXZlcnNhLgoKSmFwYW5lc2UgY29kZWNzIGFyZSBhdmFpbGFibGUgZnJvbSBUYW1pdG8gS0FKSVlBTUE6Cmh0dHA6Ly9wc2V1ZG8uZ3JhZC5zY2NzLmNodWt5by11LmFjLmpwL35rYWppeWFtYS9weXRob24vCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo=