RGFuaWVsICgxNiBEZWNlbWJlciAyMDA1KQotIEplYW4gSmFjcXVlcyBEcm91aW4gcG9pbnRlZCBvdXQgdGhhdCB5b3UgY291bGQgb25seSBoYXZlIGEgdXNlciBuYW1lIG9yCiAgcGFzc3dvcmQgb2YgMTI3IGJ5dGVzIG9yIGxlc3MgZW1iZWRkZWQgaW4gYSBVUkwsIHdoZXJlIGFjdHVhbGx5IHRoZSBjb2RlCiAgdXNlcyBhIDI1NSBieXRlIGJ1ZmZlciBmb3IgaXQhIE1vZGlmaWVkIG5vdyB0byB1c2UgdGhlIGZ1bGwgYnVmZmVyIHNpemUuCgpEYW5pZWwgKDEyIERlY2VtYmVyIDIwMDUpCi0gRG92IE11cmlrIGNvcnJlY3RlZCB0aGUgSFRUUF9PTkxZIGRlZmluZSB0byBkaXNhYmxlIHRoZSBURlRQIHN1cHBvcnQgcHJvcGVybHkKClZlcnNpb24gNy4xNS4xICg3IERlY2VtYmVyIDIwMDUpCgpEYW5pZWwgKDYgRGVjZW1iZXIgMjAwNSkKLSBGdWxsIHRleHQgaGVyZTogaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2Fkdl8yMDA1MTIwNy5odG1sIFBvaW50ZWQgb3V0IGJ5CiAgU3RlZmFuIEVzc2VyLgoKICBWVUxORVJBQklMSVRZCgogIGxpYmN1cmwncyBVUkwgcGFyc2VyIGZ1bmN0aW9uIGNhbiBvdmVyZmxvdyBhIG1hbGxvY2VkIGJ1ZmZlciBpbiB0d28gd2F5cywgaWYKICBnaXZlbiBhIHRvbyBsb25nIFVSTC4KCiAgVGhlc2Ugb3ZlcmZsb3dzIGhhcHBlbiBpZiB5b3UKIAogIDEgLSBwYXNzIGluIGEgVVJMIHdpdGggbm8gcHJvdG9jb2wgKGxpa2UgImh0dHA6Ly8iKSBwcmVmaXgsIHVzaW5nIG5vIHNsYXNoCiAgICAgIGFuZCB0aGUgc3RyaW5nIGlzIDI1NiBieXRlcyBvciBsb25nZXIuIFRoaXMgbGVhZHMgdG8gYSBzaW5nbGUgemVybyBieXRlCiAgICAgIG92ZXJmbG93IG9mIHRoZSBtYWxsb2NlZCBidWZmZXIuCgogIDIgLSBwYXNzIGluIGEgVVJMIHdpdGggb25seSBhIHF1ZXN0aW9uIG1hcmsgYXMgc2VwYXJhdG9yIChubyBzbGFzaCkgYmV0d2VlbgogICAgICB0aGUgaG9zdCBhbmQgdGhlIHF1ZXJ5IHBhcnQgb2YgdGhlIFVSTC4gVGhpcyBsZWFkcyB0byBhIHNpbmdsZSB6ZXJvIGJ5dGUKICAgICAgb3ZlcmZsb3cgb2YgdGhlIG1hbGxvY2VkIGJ1ZmZlci4KCiAgQm90aCBvdmVyZmxvd3MgY2FuIGJlIG1hZGUgd2l0aCB0aGUgc2FtZSBpbnB1dCBzdHJpbmcsIGxlYWRpbmcgdG8gdHdvIHNpbmdsZQogIHplcm8gYnl0ZSBvdmVyd3JpdGVzLgoKICBUaGUgYWZmZWN0ZWQgZmxhdyBjYW5ub3QgYmUgdHJpZ2dlcmVkIGJ5IGEgcmVkaXJlY3QsIGJ1dCB0aGUgbG9uZyBVUkwgbXVzdAogIGJlIHBhc3NlZCBpbiAiZGlyZWN0bHkiIHRvIGxpYmN1cmwuIEl0IG1ha2VzIHRoaXMgYSAibG9jYWwiIHByb2JsZW0uIE9mCiAgY291cnNlLCBsb3RzIG9mIHByb2dyYW1zIG1heSBzdGlsbCBwYXNzIGluIHVzZXItcHJvdmlkZWQgVVJMcyB0byBsaWJjdXJsCiAgd2l0aG91dCBkb2luZyBtdWNoIHN5bnRheCBjaGVja2luZyBvZiB0aGVpciBvd24sIGFsbG93aW5nIGEgdXNlciB0byBleHBsb2l0CiAgdGhpcyB2dWxuZXJhYmlsaXR5LgoKICBUaGVyZSBpcyBubyBrbm93biBleHBsb2l0IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4KCgpEYW5pZWwgKDIgRGVjZW1iZXIgMjAwNSkKLSBKYW1pZSBOZXd0b24gcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsJ3MgZmlsZTovLyBjb2RlIHdvdWxkIGNsb3NlKCkgYSB6ZXJvCiAgZmlsZSBkZXNjcmlwdG9yIGlmIGdpdmVuIGEgbm9uLWV4aXN0aW5nIGZpbGUuCgpEYW5pZWwgKDI0IE5vdmVtYmVyIDIwMDUpCi0gRG91ZyBLYXVmbWFuIHByb3ZpZGVkIGEgc2V0IG9mIHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gREpHUFAKICBhZ2FpbiB1c2luZyBjb25maWd1cmUuCgotIFlhbmcgVHNlIHByb3ZpZGVkIGEgd2hvbGUgc2VyaWVzIG9mIHBhdGNoZXMgdG8gY2xlYXIgdXAgY29tcGlsZXIgd2FybmluZ3Mgb24KICBNU1ZDIDYuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDIwMDUpCi0gSSBleHRlbmRlZCBhIHBhdGNoIGZyb20gRGF2aWQgU2hhdyB0byBtYWtlIGxpYmN1cmwgX2Fsd2F5c18gcHJvdmlkZSBhbiBlcnJvcgogIHN0cmluZyBpbiB0aGUgZ2l2ZW4gZXJyb3IgYnVmZmVyIHRvIGFkZHJlc3MgdGhlIGZsYXcgbWVudGlvbiBvbiAyMSBzZXAgMjAwNS4KCkRhbmllbCAoMTYgTm92ZW1iZXIgMjAwNSkKLSBBcHBsaWVkIEFsYmVydCBDaGluJ3MgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgbGliY3VybC5wYyBwa2djb25maWcgZmlsZSBnZXQKICBpbnN0YWxsZWQgb24gJ21ha2UgaW5zdGFsbCcgdGltZS4KCkRhbmllbCAoMTQgTm92ZW1iZXIgMjAwNSkKLSBRdWFnbWlyZSByZXBvcnRlZCB0aGF0IGhlIG5lZWRlZCB0byByYWlzZSBhIE5UTE0gYnVmZmVyIGZvciBTU1BJIHRvIHdvcmsKICBwcm9wZXJseSBmb3IgYSBjYXNlLCBhbmQgc28gd2UgZGlkLiBXZSByYWlzZWQgaXQgZXZlbiBmb3Igbm9uLVNTUEkgYnVpbGRzCiAgYnV0IGl0IHNob3VsZCBub3QgZG8gYW55IGhhcm0uIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzNTY3MTUKCi0gSmFuIEt1bmRlcidzIGRlYmlhbiBidWcgcmVwb3J0CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMzODY4MCBpZGVudGlmaWVkIGEgd2VpcmQKICBlcnJvciBtZXNzYWdlIGZvciB3aGVuIHlvdSB0cnkgdG8gdXBsb2FkIGEgZmlsZSBhbmQgdGhlIHJlcXVlc3RlZCBkaXJlY3RvcnkKICBkb2Vzbid0IGV4aXN0IG9uIHRoZSB0YXJnZXQgc2VydmVyLgoKLSBZYW5nIFRzZSBmaXhlZCBjb21waWxlciB3YXJuaW5ncyBpbiBsaWIvc3NsdXNlLmMgd2l0aCBPcGVuU1NMIDAuOS44IGFuZCBpbgogIGxpYi9tZW1kZWJ1Zy5oIHRoYXQgc2hvd2VkIHVwIGluIGhpcyBtc3ZjIGJ1aWxkcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwNSkKLSBEZWJpYW4gYnVnIHJlcG9ydCAzMzg2ODEgYnkgSmFuIEt1bmRlcjogbWFrZSBjdXJsIGJldHRlciBkZXRlY3QgYW5kIHJlcG9ydAogIGJhZCBsaW1pdC1yYXRlIHVuaXRzOgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMzg2ODEgTm93IGN1cmwgd2lsbCByZXR1cm4KICBlcnJvciBpZiBhIGJhZCB1bml0IGlzIHVzZWQuCgotIFRoYW5rcyB0byB0aGlzIG5pY2Ugc3VtbWFyeSBvZiBwb2xsKCkgaW1wbGVtZW50YXRpb25zOgogIGh0dHA6Ly93d3cuZ3JlZW5lbmQub3JnLnVrL3Jqay8yMDAxLzA2L3BvbGwuaHRtbCBhbmQgZnVydGhlciB0ZXN0cyBieSBFdWdlbmUKICBLb3RseWFyb3YsIHdlIG5vdyBrbm93IHRoYXQgY3lnd2luJ3MgcG9sbCByZXR1cm5zIG9ubHkgUE9MTEhVUCBvbiByZW1vdGUKICBjb25uZWN0aW4gY2xvc3VyZSBzbyB3ZSBjaGVjayBmb3IgdGhhdCBjYXNlICh0b28pIGFuZCByZS1lbmFibGUgcG9sbCBmb3IKICBjeWd3aW4gYnVpbGRzLgoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDA1KQotIEV1Z2VuZSBLb3RseWFyb3YgZm91bmQgb3V0IHRoYXQgY3lnd2luJ3MgcG9sbCgpIGZ1bmN0aW9uIGlzbid0IGRvaW5nIHRoaW5ncwogIHJpZ2h0OiBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA1LTExLzAwNDUuaHRtbCBzbyB3ZSBub3cgZGlzYWJsZQogIHBvbGwoKSBhbmQgdXNlIHNlbGVjdCgpIG9uIGN5Z3dpbiB0b28gKHdlIGFscmVhZHkgZG8gdGhlIHNhbWUgY2hvaWNlIG9uIE1hYwogIE9TIFgpCgotIERpbWEgQmFyc2t5IHBhdGNoZWQgcHJvYmxlbSAjMTM0ODkzMDogdGhlIEdudVRMUyBjb2RlIGNvbXBsZXRlbHkgaWdub3JlZAogIGNsaWVudCBjZXJ0aWZpY2F0ZXMhIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzQ4OTMwKS4KCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwNSkKLSBEYXZpZCBMYW5nIGZpeGVkIElQdjYgc3VwcG9ydCBmb3IgVEZUUCEKCi0gSW50cm9kdWNpbmcgcmFuZ2Ugc3RlcHBpbmcgdG8gdGhlIGN1cmwgZ2xvYmJpbmcgc3VwcG9ydC4gTm93IHlvdSBjYW4gc3BlY2lmeQogIHN0ZXAgY291bnRlciBieSBhZGRpbmcgOltudW1dIHdpdGhpbiB0aGUgYnJhY2tldHMgd2hlbiBzcGVjaWZ5aW5nIGEgcmFuZ2U6CgogICBbMS0xMDA6MTBdCiAgIFthLXo6Ml0KCiAgSWYgbm8gc3RlcCBjb3VudGVyIGlzIHNldCwgaXQgZGVmYXVsdHMgdG8gMSBhcyBiZWZvcmU6CgogICBbMS0xMDBdCiAgIFtkLWhdCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwNSkKLSBSZW1vdmVkIHRoZSB1c2Ugb2YgQUlfQ0FOT05OQU1FIGluIHRoZSBJUHY2LWVuYWJsZWQgcmVzb2x2ZXIgZnVuY3Rpb25zIHNpbmNlCiAgd2UgcmVhbGx5IGhhdmUgbm8gdXNlIGZvciByZXZlcnNlIGxvb2t1cHMgb2YgdGhlIGFkZHJlc3MuCgogIEkgdHJ1bHkgaG9wZSB0aGVzZSBhcmUgdGhlIGxhc3QgcmV2ZXJzZSBsb29rdXBzIHdlIGhhZCBsaW5nZXJpbmcgaW4gdGhlCiAgY29kZSEKCi0gRG1pdHJ5IEJhcnRzZXZpY2ggZGlzY292ZXJlZCBzb21lIGlzc3VlcyBpbiBjb21wYXRpYmlsdHkgb2YgU1NQSS1lbmFibGVkCiAgdmVyc2lvbiBvZiBsaWJjdXJsIHdpdGggZGlmZmVyZW50IFdpbmRvd3MgdmVyc2lvbnMuIEN1cnJlbnQgdmVyc2lvbiBvZgogIGxpYmN1cmwgaW1wb3J0cyBTU1BJIGZ1bmN0aW9ucyBmcm9tIHNlY3VyMzIuZGxsLiBIb3dldmVyLCB1bmRlciBXaW5kb3dzIE5UCiAgNC4wIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbG9jYXRlZCBpbiBzZWN1cml0eS5kbGwsIHVuZGVyIFdpbmRvd3MgOXggLSBpbgogIHNlY3VyMzIuZGxsIGFuZCBXaW5kb3dzIDIwMDAgYW5kIFhQIGNvbnRhaW5zIGJvdGggdGhlc2UgRExMcyAoc2VjdXJpdHkuZGxsCiAganVzdCBmb3J3YXJkcyBjYWxscyB0byBzZWN1cjMyLmRsbCkuCgogIERtaXRyeSdzIHBhdGNoIGxvYWRzIHByb3BlciBsaWJyYXJ5IGR5bmFtaWNhbGx5IGRlcGVuZGluZyBvbiBXaW5kb3dzCiAgdmVyc2lvbi4gRnVuY3Rpb24gSW5pdFNlY3VyaXR5SW50ZXJmYWNlKCkgaXMgdXNlZCB0byBvYnRhaW4gcG9pbnRlcnMgdG8gYWxsCiAgb2YgU1NQSSBmdW5jdGlvbiBpbiBvbmUgc3RydWN0dXJlLgoKRGFuaWVsICgzMSBPY3RvYmVyIDIwMDUpCi0gVmlsbW9zIE5lYmVoYWogaW1wcm92ZWQgbGliY3VybCdzIExEQVAgYWJpbGl0aWVzOgoKICBUaGUgTERBUCBjb2RlIGluIGxpYmN1cmwgY2FuJ3QgaGFuZGxlIExEQVAgc2VydmVycyBvZiBMREFQdjMgbm9yIGJpbmFyeQogIGF0dHJpYnV0ZXMgaW4gTERBUCBvYmplY3RzLiBTbywgSSBtYWRlIGEgcXVpY2sgcGF0Y2ggdG8gYWRkcmVzcyB0aGVzZQogIHByb2JsZW1zLgoKICBUaGUgc29sdXRpb24gaXMgc2ltcGxlOiBpZiB3ZSBjb25uZWN0IHRvIGFuIExEQVAgc2VydmVyLCBmaXJzdCB0cnkgTERBUHYzCiAgKHdoaWNoIGlzIHRoZSBwcmVmZXJyZWQgcHJvdG9jb2wgYXMgb2Ygbm93KSBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gTERBUHYyLgogIEluIGNhc2Ugb2YgYmluYXJ5IGF0dHJpYnV0ZXMsIHdlIGZpcnN0IGNvbnZlcnQgdGhlbSB0byBiYXNlNjQsIGp1c3QgbGlrZSB0aGUKICBvcGVubGRhcCBjbGllbnQgZG9lcy4gSXQgdXNlcyBsZGFwX2dldF92YWx1ZXNfbGVuKCkgaW5zdGVhZCBvZgogIGxkYXBfZ2V0X3ZhbHVlcygpIHRvIGJlIGFibGUgdG8gcmV0cmlldmUgYmluYXJ5IGF0dHJpYnV0ZXMgY29ycmVjdGx5LiBJCiAgZGVmaW5lZCB0aGUgbmVjZXNzYXJ5IExEQVAgbWFjcm9zIGluIGxpYi9sZGFwLmMgdG8gYmUgYWJsZSB0byBjb21waWxlCiAgbGliY3VybCB3aXRob3V0IHRoZSBwcmVzZW5jZSBvZiBsaWJsZGFwCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwNSkKLSBOaXMgSm9yZ2Vuc2VuIGZpbGVkIGJ1ZyByZXBvcnQgIzEzMzg2NDgKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMzODY0OCkgd2hpY2ggcmVhbGx5IGlzIG1vcmUgb2YgYQogIGZlYXR1cmUgcmVxdWVzdCwgYnV0IGFueXdheS4gSXQgcG9pbnRlZCBvdXQgdGhhdCAtLW1heC1yZWRpcnMgZGlkIG5vdCBhbGxvdwogIGl0IHRvIGJlIHNldCB0byAwLCB3aGljaCB0aGVuIHdvdWxkIHJldHVybiBhbiBlcnJvciBjb2RlIG9uIHRoZSBmaXJzdAogIExvY2F0aW9uOiBmb3VuZC4gQmFzZWQgb24gTmlzJyBwYXRjaCwgbm93IGxpYmN1cmwgc3VwcG9ydHMgQ1VSTE9QVF9NQVhSRURJUlMKICBzZXQgdG8gMCwgb3IgLTEgZm9yIGluZmluaXR5LiBBZGRlZCB0ZXN0IGNhc2UgMjc0IHRvIHZlcmlmeS4KCi0gdG9tbWlua1thdF1wb3N0LnBsIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzEzMzc3MjMKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMzNzcyMykgdGhhdCBjdXJsIGNvdWxkIG5vdCB1cGxvYWQKICBiaW5hcnkgZGF0YSBmcm9tIHN0ZGluIG9uIFdpbmRvd3MgaWYgdGhlIGRhdGEgY29udGFpbmVkIGNvbnRyb2wtWiAoaGV4IDFhKQogIHNpbmNlIHRoYXQgaXMgdHJlYXRlZCBhcyBlbmQtb2YtZmlsZSB3aGVuIHJlYWQgaW4gdGV4dCBtb2RlLiBHaXNsZSBWYW5lbQogIHBvaW50ZWQgb3V0IHRoZSBmaXgsIGFuZCBJIG1hZGUgYm90aCAtVCBhbmQgLS1kYXRhLWJpbmFyeSB0YWtlIGFkdmFudGFnZSBvZgogIGl0LgoKLSBKYXogRnJlc2ggcG9pbnRlZCBvdXQgdGhhdCBpZiB5b3UgdXNlZCAiLXIgW251bWJlcl0iIGFzIHdhcyB3cm9uZ2x5IGRlc2NyaWJlZAogIGluIHRoZSBtYW4gcGFnZSwgY3VybCB3b3VsZCBzZW5kIGFuIGludmFsaWQgSFRUUCBSYW5nZTogaGVhZGVyLiBUaGUgY29ycmVjdAogIHdheSB3b3VsZCBiZSB0byB1c2UgIi1yIFtudW1iZXJdLSIgb3IgZXZlbiAiLXIgLVtudW1iZXJdIi4gU3RhcnRpbmcgbm93LAogIGN1cmwgd2lsbCB3YXJuIGlmIHRoaXMgaXMgZGlzY292ZXJlZCwgYW5kIGF1dG9tYXRpY2FsbHkgYXBwZW5kIGEgZGFzaCB0byB0aGUKICByYW5nZSBiZWZvcmUgcGFzc2luZyBpdCB0byBsaWJjdXJsLgoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDUpCi0gQW1vbCBQYXR0ZWthciByZXBvcnRlZCBhIGJ1ZyB3aXRoIGdyZWF0IGRldGFpbCBhbmQgYSBmaW5lIGV4YW1wbGUgaW4gYnVnCiAgIzEzMjYzMDYgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMjYzMDYpLiBXaGVuIHVzaW5nIHRoZSBtdWx0aQogIGludGVyZmFjZSBhbmQgY29ubmVjdGluZyB0byBhIGhvc3Qgd2l0aCBtdWx0aXBsZSBJUCBhZGRyZXNzZXMsIGFuZCBvbmUgb2YKICB0aGUgYWRkcmVzc2VzIGZhaWxzIHRvIGNvbm5lY3QgKHRoZSBzZXJ2ZXIgbXVzdCBleGlzdCBhbmQgcmVzcG9uZCwganVzdCBub3QKICBhY2NlcHQgY29ubmVjdGlvbnMpIGxpYmN1cmwgbGVha3MgYSBzb2NrZXQgZGVzY3JpcHRvci4gVGhhbmtzIHRvIHRoZSBmaW5lCiAgcmVwb3J0LCBJIGNvdWxkIGZpbmQgYW5kIGZpeCB0aGlzLgoKRGFuaWVsICgyMiBPY3RvYmVyIDIwMDUpCi0gRGltYSBCYXJza3kgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggR251VExTLWVuYWJsZWQgbGliY3VybCBpbiBidWcgcmVwb3J0CiAgIzEzMzQzMzggKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzQzMzgpLiBXaGVuIHJlYWRpbmcgYW4gU1NMCiAgc3RyZWFtIGZyb20gYSBzZXJ2ZXIgYW5kIHRoZSBzZXJ2ZXIgcmVxdWVzdHMgYSAicmVoYW5kc2hha2UiLCB0aGUgY3VycmVudAogIGNvZGUgc2ltcGx5IHJldHVybnMgdGhpcyBhcyBhbiBlcnJvci4gSSBoYXZlIG5vIGdvb2Qgd2F5IHRvIHRlc3QgdGhpcywgYnV0CiAgSSd2ZSBhZGRlZCBhIGNydWRlIGF0dGVtcHQgb2YgZGVhbGluZyB3aXRoIHRoaXMgc2l0dWF0aW9uIHNsaWdodGx5IGJldHRlciAtCiAgaXQgbWFrZXMgYSBibG9ja2luZyBoYW5kc2hha2UgaWYgdGhpcyBoYXBwZW5zLiBEb25lIGxpa2UgdGhpcyBiZWNhdXNlIGZpeGluZwogIHRoaXMgdGhlICJwcm9wZXIiIHdheSAodGhhdCB3b3VsZCBoYW5kc2hha2UgYXN5bmNocm9ub3VzbHkpIHdpbGwgcmVxdWlyZQogIHF1aXRlIHNvbWUgd29yayBhbmQgSSByZWFsbHkgbmVlZCBhIGdvb2Qgd2F5IHRvIHRlc3QgdGhpcyB0byBkbyBzdWNoIGEKICBjaGFuZ2UuCgpEYW5pZWwgKDIxIE9jdG9iZXIgMjAwNSkKLSAiT2ZlciIgcmVwb3J0ZWQgYSBwcm9ibGVtIHdoZW4gbGliY3VybCByZS11c2VkIGEgY29ubmVjdGlvbiBhbmQgZmFpbGVkIHRvIGRvCiAgaXQsIGl0IGNvdWxkIHRoZW4gYWNjaWRlbnRhbGx5IGFjdHVhbGx5IGNyYXNoLiBQcmVzdW1hYmx5LCB0aGlzIGNvbmNlcm5zIEZUUAogIGNvbm5lY3Rpb25zLiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMzMDMxMAoKLSBUZW1wcmltdXMgaW1wcm92ZWQgdGhlIE1TVkMgbWFrZWZpbGUgc28gdGhhdCB0aGUgc3RhdGljIGRlYnVnIFNTTCBsaWJzIGFyZQogIGxpbmtlZCB0byB0aGUgZXhlY3V0YWJsZSBhbmQgbm90IHRvIHRoZSBsaWJjdXJsZC5saWIKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzI2Njc2CgotIEJyYWRmb3JkIEJydWNlIG1hZGUgdGhlIHdpbmRvd3MgcmVzb2x2ZXIgY29kZSBwcm9wZXJseSByZXR1cm4KICBDVVJMRV9DT1VMRE5UX1JFU09MVkVfUFJPWFkgYW5kIENVUkxFX0NPVUxETlRfUkVTT0xWRV9IT1NUIG9uIHJlc29sdmluZwogIGVycm9ycyAoYXMgZG9jdW1lbnRlZCkuCgpEYW5pZWwgKDIwIE9jdG9iZXIgMjAwNSkKLSBEYXZlIERyaWJpbiBtYWRlIGxpYmN1cmwgdW5kZXJzdGFuZCBhbmQgaGFuZGxlIGNhc2VzIHdoZW4gdGhlIHNlcnZlcgogICh3cm9uZ2x5KSBzZW5kcyAqdHdvKiBXV1ctQXV0aGVudGljYXRlIGhlYWRlcnMgZm9yIERpZ2VzdC4gV2hpbGUgdGhpcyBzaG91bGQKICBuZXZlciBoYXBwZW4gaW4gYSBzYW5lIHdvcmxkLCBsaWJjdXJsIHByZXZpb3VzbHkgZ290IGludG8gYW4gaW5maW5pdGUgbG9vcAogIHdoZW4gdGhpcyBvY2N1cnJlZC4gRGF2ZSBhZGRlZCB0ZXN0IDI3MyB0byB2ZXJpZnkgdGhpcy4KCi0gVGVtcHJpbXVzIGltcHJvdmVkIHRoZSBNU1ZDIG1ha2VmaWxlOiAibWFrZXMgYSBidWlsZCBvcHRpb24gYXZhaWxhYmxlIHNvIGlmCiAgeW91IHNldCBydGxpYmNmZz1zdGF0aWMgZm9yIHRoZSBtYWtlLCB0aGVuIGl0IHdvdWxkIGJ1aWxkIHdpdGggL01ULiBUaGUKICBkZWZhdWx0IGJlaGF2aW91ciBpcyAvTUQgKHRoZSBvcmlnaW5hbCkuIgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMjY2NjUKCkRhbmllbCAoMTQgT2N0b2JlciAyMDA1KQotIFJldmVydGVkIHRoZSBMSUJDVVJMX1ZFUlNJT05fTlVNIGNoYW5nZSBmcm9tIE9jdG9iZXIgNi4gQXMgRGF2ZSBEcmliaW4KICByZXBvcnRlZCwgdGhlIGRlZmluZSBpcyB1c2VkIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBpcyBhc3N1bWVkIHRvIHVzZQogIHRoZSAweFlZWFhaWiBmb3JtYXQuIFRoaXMgbWFkZSAiY3VybC1jb25maWcgLS12ZXJudW0iIGZhaWwgaW4gdGhlIDcuMTUuMAogIHJlbGVhc2UgdmVyc2lvbi4KClZlcnNpb24gNy4xNS4wICgxMyBPY3RvYmVyIDIwMDUpCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwNSkKLSBNaWNoYWVsIFN1dHRvbiBvZiBpREVGRU5TRSByZXBvcnRlZCBhbmQgSSBmaXhlZCBhIHNlY3VyaXRmeSBmbGF3IGluIHRoZSBOVExNCiAgY29kZSB0aGF0IHdvdWxkIG92ZXJmbG93IGEgYnVmZmVyIGlmIGdpdmVuIGEgdG9vIGxvbmcgdXNlciBuYW1lIG9yIGRvbWFpbgogIG5hbWUuIFRoaXMgd291bGQgaGFwcGVuIGlmIHlvdSBlbmFibGUgTlRMTSBhdXRoZW50aWNhdGlvbiBhbmQgZWl0aGVyCgogIEEgLSBwYXNzIGluIGEgdXNlciBuYW1lIGFuZCBkb21haW4gbmFtZSB0byBsaWJjdXJsIHRoYXQgdG9nZXRoZXIgYXJlIGxvbmdlcgogICAgICB0aGFuIDE5MiBieXRlcwoKICBCIC0gYWxsb3cgKGxpYiljdXJsIHRvIGZvbGxvdyBIVFRQICJyZWRpcmVjdHMiIChMb2NhdGlvbjogYW5kIHRoZQogICAgICBhcHByb3ByaWF0ZSBIVFRQIDMweCByZXNwb25zZSBjb2RlKSBhbmQgdGhlIG5ldyBVUkwgY29udGFpbnMgYSBVUkwgd2l0aAogICAgICBhIHVzZXIgbmFtZSBhbmQgZG9tYWluIG5hbWUgdGhhdCB0b2dldGhlciBhcmUgbG9uZ2VyIHRoYW4gMTkyIGJ5dGVzCgogIFNlZSBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3Mvc2VjdXJpdHkuaHRtbCBmb3IgZnVydGhlciBkZXRhaWxzIGFuZCB1cGRhdGVzCgpEYW5pZWwgKDUgT2N0b2JlciAyMDA1KQotIERhcnJ5bCBIb3VzZSByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCB1c2luZyAteiB0byBkb3dubG9hZCBmaWxlcyBmcm9tIEZUUC4KICBJdCB0dXJuZWQgb3V0IHRoYXQgaWYgdGhlIGdpdmVuIHRpbWUgc3RhbXAgd2FzIGV4YWN0IHRoZSBzYW1lIGFzIHRoZSByZW1vdGUKICB0aW1lIHN0YW1wLCB0aGUgZmlsZSB3b3VsZCBzdGlsbCB3cm9uZ2x5IGJlIGRvd25sb2FkZWQuIEFkZGVkIHRlc3QgY2FzZSAyNzIKICB0byB2ZXJpZnkuCgpEYW5pZWwgKDQgT2N0b2JlciAyMDA1KQotIERvbWVuaWNvIEFuZHJlb2xpIGZpeGVkIGEgbWFuIHBhZ2UgbWFsZm9ybWF0IGFuZCByZW1vdmVkIG9kZCAoMHhhMCkgYnl0ZXMKICBmcm9tIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKLSBNaWNoYWVsIFdhbGxuZXIgcmVwb3J0ZWQgdGhhdCB0aGUgZGF0ZSBwYXJzZXIgaGFkIHdyb25nIG9mZnNldCBzdG9yZWQgZm9yCiAgdGhlIE1FU1QgYW5kIENFU1QgdGltZSB6b25lcy4KCkRhbmllbCAoMjcgU2VwdGVtYmVyIDIwMDUpCi0gRGF2aWQgWWFuIGZpbGVkIGJ1ZyAjMTI5OTE4MSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTI5OTE4MSkKICB0aGF0IGlkZW50aWZpZWQgYSBzaWxseSBwcm9ibGVtIHdpdGggQ29udGVudC1SYW5nZTogaGVhZGVycyB3aXRoIHRoZSAnYnl0ZXMnCiAga2V5d29yZCB3cml0dGVuIGluIGEgZGlmZmVyZW50IGNhc2UgdGhhbiBhbGwgbG93ZXJjYXNlISBJdCB3b3VsZCBjYXVzZSBhCiAgc2VnZmF1bHQhCgotIFRKIFNhdW5kZXJzIG9mIHRoZSBwcm9mdHBkIHByb2plY3QgaWRlbnRpZmllZCBhbmQgcG9pbnRlZCBvdXQgcHJvYmxlbXMgd2l0aAogIHRoZSBtb2RpZmllZCBGVFBTIG5lZ290aWF0aW9uIGNoYW5nZSBvZiBBdWd1c3QgMTkgMjAwNS4gVGh1cywgd2UgcmV2ZXJ0IHRoZQogIGNoYW5nZSBiYWNrIHRvIHByZS03LjE0LjEgc3RhdHVzLgoKRGFuaWVsICgyMSBTZXB0ZW1iZXIgMjAwNSkKLSBGaXhlZCAiY3V0IG9mZiIgc2VudGVuY2UgaW4gdGhlIGxpYmN1cmwtdHV0b3JpYWwgbWFuIHBhZ2U6CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMyOTMwNQoKLSBDbGFyaWZpZWQgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2Ugd2hhdCB0aGUgZGVmYXVsdAogIENVUkxPUFRfV1JJVEVGVU5DVElPTiBhbmQgQ1VSTE9QVF9XUklURURBVEEgbWVhbjoKICBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzI5MzExCgotIENsYXJpZmllZCBpbiB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSB0aGF0IENVUkxPUFRfRVJST1JCVUZGRVIKICBzb21ldGltZXMgZG9lc24ndCBmaWxsIGluIHRoZSBidWZmZXIgZXZlbiB0aG91Z2ggaXQgaXMgc3VwcG9zZWQgdG86CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMyOTMxMwoKLSBXaGVuIENVUkxFX1VSTF9NQUxGT1JNQVQgaXMgcmV0dXJuZWQgZHVlIHRvIGEgbWlzc2luZyBVUkwsIGl0IG5vdyBoYXMgYW4KICBlcnJvciBzdHJpbmcgc2V0LgoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwNSkKLSBEbWl0cnkgQmFydHNldmljaCBtYWRlIHRoZSBTU1BJIHN1cHBvcnQgd29yayBvbiBXaW5kb3dzIDl4IGFzIHdlbGwuCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDA1KQotIEFkZGVkIGEgVEZUUCBzZXJ2ZXIgdG8gdGhlIHRlc3Qgc3VpdGUgYW5kIG1hZGUgdGhlIHRlc3Qgc3VpdGUgY2FwYWJsZSBvZgogIHVzaW5nIGl0LgoKRGFuaWVsICg3IFNlcHRlbWJlciAyMDA1KQotIEJlbiBNYWRzZW4ncyBkZXRhaWxlZCByZXBvcnRzIHRoYXQgZnVubmlseSBlbm91Z2ggb25seSBvY2N1cnJlZCB3aXRoIGNlcnRhaW4KICBnbGliYyB2ZXJzaW9ucyB0dXJuZWQgb3V0IHRvIGJlIGN1cmwgdXNpbmcgYW4gYWxyZWFkeSBjbG9zZWQgZmlsZSBoYW5kbGUKICBkdXJpbmcgY2VydGFpbiBjb25kaXRpb25zIChsaWtlIHdoZW4gc2F2aW5nIEZUUCBzZXJ2ZXIgImhlYWRlcnMiKS4KCi0gU2NvdHQgRGF2aXMgaGVscGVkIG1lIHRyYWNrIGRvd24gYSBwcm9ibGVtIGluIHRoZSB0ZXN0IEhUVFAgc2VydmVyIHRoYXQgbWFkZQogIHRlc3QgY2FzZSA1NiB3cm9uZ2x5IGZhaWwgYXQgdGltZXMuIEl0IHR1cm5lZCBvdXQgaXQgd2FzIGR1ZSB0byB0aGUgc2VydmVyCiAgZmluZGluZyB0aGUgZW5kIG9mIGEgY2h1bmtlZC1lbmNvZGVkIFBPU1QgdG9vIGVhcmx5LgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDA1KQotIE5vdyBjdXJsIHdhcm5zIGlmIGFuIHVua25vd24gdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgLXcvLS13cml0ZW91dCBhcmd1bWVudC4KCkRhbmllbCAoNCBTZXB0ZW1iZXIgMjAwNSkKLSBJIGFwcGxpZWQgTmljb2xhcyBGcmFu529pcycgbWFuIHBhZ2UgcGF0Y2ggaGUgcG9zdGVkIHRvIHRoZSBEZWJpYW4gYnVnCiAgdHJhY2tlci4gSXQgY29ycmVjdGVkIHR3byBsaW5lcyB0aGF0IHN0YXJ0ZWQgd2l0aCBhcG9zdHJvcGhlcywgd2hpY2ggaXNuJ3QKICBsZWdhbCBucm9mZiBmb3JtYXQuIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjY1MTEKCi0gQWRkZWQgLS1mdHAtc2tpcC1wYXN2LWlwIHRvIHRoZSBjb21tYW5kIGxpbmUgdG9vbCwgdGhhdCBzZXRzIHRoZSBuZXcKICBDVVJMT1BUX0ZUUF9TS0lQX1BBU1ZfSVAgb3B0aW9uLiBJdCBtYWtlcyBsaWJjdXJsIHJlLXVzZSB0aGUgY29udHJvbAogIGNvbm5lY3Rpb24ncyBJUCBhZGRyZXNzIHdoZW4gc2V0dGluZyB1cCB0aGUgZGF0YSBjb25uZWN0aW9uIGluc3RlYWQgb2YKICBleHRyYWN0dGluZyB0aGUgSVAgYWRkcmVzcyBmcm9tIHRoZSBQQVNWIHJlc3BvbnNlLiBJdCBoYXMgdHVybmVkIG91dCB0aGlzCiAgZmVhdHVyZSBpcyBmcmVxdWVudGx5IG5lZWRlZCBieSBwZW9wbGUgdG8gY2lyY3VtdmVudCBzaWxseSBzZXJ2ZXJzIGFuZCBzaWxseQogIGZpcmV3YWxscywgZXNwZWNpYWxseSB3aGVuIEZUUFMgaXMgdXNlZCBhbmQgdGhlIFBBU1YgY29tbWFuZC1yZXNwb25zZSBpcwogIHNlbnQgZW5jcnR5cGVkLgoKICBTcG9uc29yZWQgYnkgQ1UqQW5zd2VycwoKRGFuaWVsICgxIFNlcHRlbWJlciAyMDA1KQotIEpvaG4gS2VsbHkgYWRkZWQgVEZUUCBzdXBwb3J0IHRvIGxpYmN1cmwuIEEgYnVuY2ggb2YgbmV3IGVycm9yIGNvZGVzIHdhcwogIGFkZGVkLiBUT0RPOiBhZGQgdGhlbSB0byBkb2NzLiBhZGQgVEZUUCBzZXJ2ZXIgdG8gdGVzdCBzdWl0ZS4gYWRkIFRGVFAgdG8KICBsaXN0IG9mIHByb3RvY29scyB3aGVyZWV2ZXIgdGhvc2UgYXJlIG1lbnRpb25lZC4KClZlcnNpb24gNy4xNC4xICgxIFNlcHRlbWJlciAyMDA1KQoKRGFuaWVsICgyOSBBdWd1c3QgMjAwNSkKLSBLZXZpbiBMdXNzaWVyIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIGN1cmxsaWIuZHNwIGFuZCBob3cgdG8gZml4IGl0LgoKLSBJZ29yIFBvbHlha292IGZpeGVkIGEgcmF0aGVyIG5hc3R5IHByb2JsZW0gd2l0aCB0aGUgdGhyZWFkZWQgbmFtZSByZXNvbHZlcgogIGZvciBXaW5kb3dzLCB0aGF0IGNvdWxkIGxlYWQgdG8gYW4gQWNjZXNzIFZpb2xhdGlvbiB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2UKICB3YXMgdXNlZCBkdWUgdG8gYW4gaXNzdWUgd2l0aCBob3cgdGhlIHJlc29sdmVyIHRocmVhZCB3YXMgYW5kIHdhcyBub3QKICB0ZXJtaW5hdGVkLgoKLSBTaW1vbiBKb3NlZnNzb24gYnJvdWdodCBhIHBhdGNoIHRoYXQgYWxsb3dzIGN1cmwgdG8gZ2V0IGJ1aWx0IHRvIHVzZSBHTlUgR1NTCiAgaW5zdGVhZCBvZiBNSVQvSGVpbWRhbCBmb3IgR1NTIGNhcGFiaWxpdGllcy4KCkRhbmllbCAoMjQgQXVndXN0IDIwMDUpCi0gVG9ieSBQZXRlcnNvbiBhZGRlZCBDVVJMT1BUX0lHTk9SRV9DT05URU5UX0xFTkdUSCB0byB0aGUgbGlicmFyeSwgYWNjZXNzaWJsZQogIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0b29sIHdpdGggLS1pZ25vcmUtY29udGVudC1sZW5ndGguIFRoaXMgd2lsbCBtYWtlIGl0CiAgZWFzaWVyIHRvIGRvd25sb2FkIGZpbGVzIGZyb20gQXBhY2hlIDEueCAoYW5kIHNpbWlsYXIpIHNlcnZlcnMgdGhhdCBhcmUKICBzdGlsbCBoYXZpbmcgcHJvYmxlbXMgc2VydmluZyBmaWxlcyBsYXJnZXIgdGhhbiAyIG9yIDQgR0IuIFdoZW4gdGhpcyBvcHRpb24KICBpcyBlbmFibGVkLCBjdXJsIHdpbGwgc2ltcGx5IGhhdmUgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciB0byBjbG9zZSB0aGUKICBjb25uZWN0aW9uIHRvIHNpZ25hbCBlbmQgb2YgdHJhbnNmZXIuIEkgd3JvdGUgdGVzdCBjYXNlIDI2OSB0aGF0IHJ1bnMgYQogIHNpbXBsZSB0ZXN0IHRvIHZlcmlmeSB0aGF0IHRoaXMgd29ya3MuCgotIChUcnlpbmcgaGFyZCB0byBleGNsdWRlIGVtb3Rpb25zIG5vdy4pIHZhbGdyaW5kIHZlcnNpb24gMyBzdWRkZW5seSByZW5hbWVkCiAgdGhlIC0tbG9nZmlsZSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIC0tbG9nLWZpbGUsIGFuZCB0aHVzIHRoZSB0ZXN0IHNjcmlwdAogIHZhbGdyaW5kIGF1dG9kZXRlY3Rpb24gbm93IGhhcyB5ZXQgYW5vdGhlciB2ZXJzaW9uIGNoZWNrIHRvIGRvIGFuZCB0aGVuIGl0CiAgYWx0ZXJzIHRoZSB2YWxncmluZCBjb21tYW5kIGxpbmUgYWNjb3JkaW5nbHkuCgotIEZpeGVkIENBIGNlcnQgdmVyaWZpY2F0aW9uIHVzaW5nIEdudVRMUyB3aXRoIHRoZSBkZWZhdWx0IGJ1bmRsZSwgd2hpY2gKICBwcmV2aW91c2x5IGZhaWxlZCBkdWUgdG8gR251VExTIG5vdCBhbGxvd2luZyB4NTA5IHYxIENBIGNlcnRzIGJ5IGRlZmF1bHQuCiAgUmFscGggTWl0Y2hlbGwgcmVwb3J0ZWQuCgpEYW5pZWwgKDE5IEF1Z3VzdCAyMDA1KQotIE5vcmJlcnQgTm92b3RueSBoYWQgcHJvYmxlbXMgd2l0aCBGVFBTIGFuZCBoZSBoZWxwZWQgbWUgd29yayBvdXQgYSBwYXRjaAogIHRoYXQgbWFkZSBjdXJsIHJ1biBmaW5lIGluIGhpcyBlbmQuIFRoZSBrZXkgd2FzIHRvIG1ha2Ugc3VyZSB3ZSBkbyB0aGUKICBTU0wvVExTIG5lZ290aWF0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBUQ1AgY29ubmVjdCBpcyBkb25lIGFuZCBub3QgYWZ0ZXIKICBhIGZldyBvdGhlciBjb21tYW5kcyBoYXZlIGJlZW4gc2VudCBsaWtlIHdlIGRpZCBwcmV2aW91c2x5LiBJIGRvbid0IGNvbnNpZGVyCiAgdGhpcyBjaGFuZ2UgbmVjZXNzYXJ5IHRvIG9iZXkgdGhlIHN0YW5kYXJkcywgSSB0aGluayB0aGlzIHNlcnZlciBpcyBwaWNraWVyCiAgdGhhbiB3aGF0IHRoZSBzcGVjcyBhbGxvdyBpdCB0byBiZSwgYnV0IEkgY2FuJ3Qgc2VlIGhvdyB0aGlzIG1vZGlmaWVkCiAgbGliY3VybCBjb2RlIGNhbiBhZGQgYW55IHByb2JsZW1zIHRvIHRob3NlIHdobyBhcmUgaW50ZXJwcmV0aW5nIHRoZQogIHN0YW5kYXJkcyBtb3JlIGxpYmVyYWxseS4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDUpCi0gSmVmZiBQb2hsbWV5ZXIgZm91bmQgb3V0IHRoYXQgaWYgeW91IGFzayBsaWJjdXJsIHRvIGxvYWQgYSBjb29raWVmaWxlICh3aXRoCiAgQ1VSTE9QVF9DT09LSUVGSUxFKSwgYWRkIGEgY29va2llICh3aXRoIENVUkxPUFRfQ09PS0lFTElTVCksIHRlbGwgaXQgdG8KICB3cml0ZSB0aGUgcmVzdWx0IHRvIGEgZ2l2ZW4gY29va2llIGphciBhbmQgdGhlbiBuZXZlciBhY3R1YWxseSBjYWxsCiAgY3VybF9lYXN5X3BlcmZvcm0oKSAtIHRoZSBnaXZlbiBmaWxlKHMpIHRvIHJlYWQgd2FzIG5ldmVyIHJlYWQgYnV0IHRoZQogIG91dHB1dCBmaWxlIHdhcyB3cml0dGVuIGFuZCB0aHVzIGl0IGNhdXNlZCBhICJmdW5ueSIgcmVzdWx0LgoKLSBXaGlsZSBkb2luZyBzb21lIHRlc3RzIGZvciB0aGUgYnVnIGFib3ZlLCBJIG5vdGljZWQgdGhhdCBGaXJlZm94IGdlbmVyYXRlcwogIGxhcmdlIG51bWJlcnMgKGZvciB0aGUgZXhwaXJlIHRpbWUpIGluIHRoZSBjb29raWVzLnR4dCBmaWxlIGFuZCBsaWJjdXJsCiAgZGlkbid0IHRyZWF0IHRoZW0gcHJvcGVybHkuIE5vdyBpdCBkb2VzLgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwNSkKLSBBZGRlZCBtb3JlIHZlcmJvc2UgIndhcm5pbmciIG1lc3NhZ2VzIHRvIHRoZSBjdXJsIGNsaWVudCBmb3IgY2FzZXMgd2hlcmUgaXQKICBmYWlscyB0byBvcGVuL3JlYWQgZmlsZXMgZXRjIHRvIGhlbHAgdXNlcnMgZGlhZ25vc2Ugd2h5IGl0IGRvZXNuJ3QgZG8gd2hhdAogIHlvdSdkIGV4cGVjdCBpdCB0by4gQ29udmVydGVkIGxvdHMgb2Ygb2xkIG1lc3NhZ2VzIHRvIHVzZSB0aGUgbmV3IGdlbmVyaWMKICBmdW5jdGlvbiBJIHdyb3RlIGZvciB0aGlzIHB1cnBvc2UuCgpEYW5pZWwgKDEzIEF1Z3VzdCAyMDA1KQotIEphbWVzIEJ1cnNhIGlkZW50aWZpZWQgYSBsaWJjdXJsIEhUVFAgYnVnIGFuZCBhIGdvb2Qgd2F5IHRvIHJlcGVhdCBpdC4gSWYgYQogIHNpdGUgcmVzcG9uZHMgd2l0aCBiYWQgSFRUUCByZXNwb25zZSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhbnkgaGVhZGVyIGF0IGFsbCwKICBvbmx5IGEgcmVzcG9uc2UgYm9keSwgYW5kIHRoZSB3cml0ZSBjYWxsYmFjayByZXR1cm5zIDAgdG8gYWJvcnQgdGhlCiAgdHJhbnNmZXIsIGl0IGRpZG4ndCBoYXZlIGFueSByZWFsIGVmZmVjdCBidXQgdGhlIHdyaXRlIGNhbGxiYWNrIHdvdWxkIGJlCiAgY2FsbGVkIG9uY2UgbW9yZSBhbnl3YXkuCgpEYW5pZWwgKDEyIEF1Z3VzdCAyMDA1KQotIEJhc2VkIG9uIFJpY2hhcmQgQ2xheXRvbidzIHJlcG9ydHMsIEkgZm91bmQgb3V0IHRoYXQgdXNpbmcgY3VybCAtZCBAZmlsZW5hbWUKICB3aGVuICdmaWxlbmFtZScgd2FzIG5vdCBwb3NzaWJsZSB0byBhY2Nlc3MgbWFkZSBjdXJsIHVzZSBhIEdFVCByZXF1ZXN0CiAgaW5zdGVhZC4KCi0gVGhlIHRpbWUgY29uZGl0aW9uIGlsbGVnYWwgc3ludGF4IHdhcm5pbmcgaXMgbm93IGluaGliaXRlZCBpZiAtcyBpcyB1c2VkLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwNSkKLSBNYXJpbyBTY2hyb2VkZXIgZm91bmQgb3V0IHRoYXQgb25lIG9mIHRoZSBkZWJ1ZyBjYWxsYmFja3MgY2FsbHMgdGhhdCByZWdhcmRzCiAgU1NMIGRhdGEgd2l0aCB0aGUgQ1VSTElORk9fVEVYVCB0eXBlIGNsYWltZWQgdGhhdCB0aGUgZGF0YSB3YXMgb25lIGJ5dGUKICBsYXJnZXIgdGhhbiBpdCBhY3R1YWxseSBpcywgdGh1cyBmYWxzZWx5IHRlbGxpbmcgdGhlIGFwcGxpY2F0aW9uIHRoYXQgdGhlCiAgdGVybWluYXRpbmcgemVybyB3YXMgcGFydCBvZiB0aGUgZGF0YS4KCkRhbmllbCAoOSBBdWd1c3QgMjAwNSkKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZml4ZWQgdGhlIG9mZnNldHMgdXNlZCBmb3IgZGF0ZSBwYXJzaW5ncyB3aGVuIHRoZSB0aW1lCiAgem9uZSBuYW1lIG9mIGEgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHdhcyB1c2VkLiBGb3IgZXhhbXBsZSwgUERUIHZzIFBEUy4gVGhpcwogIGZsYXcgd2FzIGludHJvZHVjZWQgd2l0aCB0aGUgbmV3IGRhdGUgcGFyc2VyICgxMSBzZXAgMjAwNCAtIDcuMTIuMikuCiAgRm9ydHVuYXRlbHksIG5vIHdlYiBzZXJ2ZXIgb3IgY29va2llIHN0cmluZyBldGMgc2hvdWxkIGJlIHVzaW5nIHN1Y2ggdGltZQogIHpvbmUgbmFtZXMgdGh1cyBsaW1pdGluZyB0aGUgZWZmZWN0IG9mIHRoaXMgYnVnLgoKRGFuaWVsICg4IEF1Z3VzdCAyMDA1KQotIEpvbiBHcnViYnMgZmlsZWQgYnVnIHJlcG9ydCAjMTI0OTk2MgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjQ5OTYyKSB3aGljaCBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggTlRMTSBvbiBhIEhUVFAgcHJveHkgaWYgYW4gRlRQIFVSTCB3YXMgZ2l2ZW4uIGxpYmN1cmwgbm93IHByb3Blcmx5CiAgc3dpdGNoZXMgdG8gcHVyZSBIVFRQIGludGVybmFsbHkgd2hlbiBhbiBIVFRQIHByb3h5IGlzIHVzZWQsIGV2ZW4gZm9yIEZUUAogIFVSTHMuIFRoZSBwcm9ibGVtIHdvdWxkIGFsc28gb2NjdXIgd2l0aCBvdGhlciBtdWx0aS1wYXNzIGF1dGggbWV0aG9kcy4KCkRhbmllbCAoNyBBdWd1c3QgMjAwNSkKLSBXaGVuIGN1cmwgaXMgYnVpbHQgd2l0aCBHbnVUTFMsIGN1cmwtY29uZmlnIGRpZG4ndCBpbmNsdWRlICJTU0wiIHdoZW4KICAtLWZlYXR1cmVzIHdhcyB1c2VkLgoKRGFuaWVsICgyOCBKdWx5IDIwMDUpCi0gSWYgYW55IG9mIHRoZSBvcHRpb25zIENVUkxPUFRfSFRUUEdFVCwgQ1VSTE9QVF9QT1NUIGFuZCBDVVJMT1BUX0hUVFBQT1NUIGlzCiAgc2V0IHRvIDEsIENVUkxPUFRfTk9CT0RZIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgYmUgc2V0IHRvIDAuCgpEYW5pZWwgKDI3IEp1bHkgMjAwNSkKLSBEYW4gRmFuZHJpY2ggY2hhbmdlcyBvdmVyIHRoZSBsYXN0IHdlZWs6IGZpeGVkIG51bWVyb3VzIG1pbm9yIGNvbmZpZ3VyZQogIG9wdGlvbiBwYXJzaW5nIGZsYXdzOiAtLXdpdGhvdXQtZ251dGxzLCAtLXdpdGhvdXQtc3BuZWdvIC0td2l0aG91dC1nc3NhcGkKICBhbmQgLS13aXRob3V0LWtyYjQuIFNwZWxsZml4ZWQgc2V2ZXJhbCBlcnJvciBtZXNzYWdlcy4KCi0gUGV0ZXJpcyBLcnVtaW5zIGFkZGVkIENVUkxPUFRfQ09PS0lFTElTVCBhbmQgQ1VSTElORk9fQ09PS0lFTElTVCwgd2hpY2ggaXMgYQogIHNpbXBsZSBpbnRlcmZhY2UgdG8gZXh0cmFjdGluZyBhbmQgc2V0dGluZyBjb29raWVzIGluIGxpYmN1cmwncyBpbnRlcm5hbAogICJjb29raWUgamFyIi4gU2VlIHRoZSBuZXcgY29va2llX2ludGVyZmFjZS5jIGV4YW1wbGUgY29kZS4KCkRhbmllbCAoMTMgSnVseSAyMDA1KQotIERpZWdvIENhc29ycmFuIHByb3ZpZGVkIHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gQW1pZ2EgYWdhaW4uCgpEYW5pZWwgKDEyIEp1bHkgMjAwNSkKLSBBZHJpYW4gU2NodXVyIGFkZGVkIHRyYWlsZXIgc3VwcG9ydCBpbiB0aGUgY2h1bmtlZCBlbmNvZGluZyBzdHJlYW0uIFRoZQogIHRyYWlsZXIgaXMgdGhlbiBzZW50IHRvIHRoZSBub3JtYWwgaGVhZGVyIGNhbGxiYWNrL3N0cmVhbS4gSSB3cm90ZSB1cCB0ZXN0CiAgY2FzZSAyNjYgdG8gdmVyaWZ5IHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5LiBEbyBub3RlIHRoYXQgdGVzdCBjYXNlIDM0CiAgY29udGFpbnMgYSBmbGF3ZWQgY2h1bmtlZCBlbmNvZGluZyBzdHJlYW0gdGhhdCBzdGlsbCB3b3JrcyB0aGUgc2FtZS4KCkRhbmllbCAoNSBKdWx5IDIwMDUpCi0gR2lzbGUgVmFuZW0gY2FtZSB1cCB3aXRoIGEgbmljZSBsaXR0bGUgd29yay1hcm91bmQgZm9yIGJ1ZyAjMTIzMDExOAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjMwMTE4KS4gSXQgc2VlbXMgdGhlIFdpbmRvd3MgKE1TVkMpCiAgbGliYyB0aW1lIGZ1bmN0aW9ucyBtYXkgcmV0dXJuIGRhdGEgb25lIGhvdXIgb2ZmIGlmIFRaIGlzIG5vdCBzZXQgYW5kCiAgYXV0b21hdGljIERTVCBhZGp1c3RtZW50IGlzIGVuYWJsZWQuIFRoaXMgbWFkZSBjdXJsX2dldGRhdGUoKSByZXR1cm4gd3JvbmcKICB2YWx1ZSwgYW5kIGl0IGFsc28gY29uY2VybmVkIGludGVybmFsIGNvb2tpZSBleHBpcmF0aW9ucyBldGMuCgpEYW5pZWwgKDQgSnVseSAyMDA1KQotIEFuZHJldyBCdXNobmVsbCBwcm92aWRlZCBlbm91Z2ggaW5mbyBmb3IgbWUgdG8gdGVsbCB0aGF0IHdlIGJhZGx5IG5lZWRlZCB0bwogIGZpeCB0aGUgQ09OTkVDVCBhdXRoZW50aWNhdGlvbiBjb2RlIHdpdGggbXVsdGktcGFzcyBhdXRoIG1ldGhvZHMgKHN1Y2ggYXMKICBOVExNKSBhcyBpdCBkaWRuJ3QgcHJldmlvdXNseSBwcm9wZXJseSBpZ25vcmUgcmVzcG9uc2UtYm9kaWVzIC0gaW4gZmFjdCBpdAogIHN0b3BwZWQgcmVhZGluZyBhZnRlciBhbGwgcmVzcG9uc2UgaGVhZGVycyBoYWQgYmVlbiByZWNlaXZlZC4gVGhpcyBjb3VsZAogIGxlYWQgdG8gbGliY3VybCBzZW5kaW5nIHRoZSBuZXh0IHJlcXVlc3QgYW5kIHJlYWRpbmcgdGhlIGJvZHkgZnJvbSB0aGUgZmlyc3QKICByZXF1ZXN0IGFzIHJlc3BvbnNlIHRvIHRoZSBzZWNvbmQgcmVxdWVzdC4gKEkgYWxzbyByZW5hbWVkIHRoZSBmdW5jdGlvbiwKICB3aGljaCB3YXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGJ1dC4uLikKCiAgVGhlIGJlc3QgZml4IHdvdWxkIHRvIG9uY2UgYW5kIGZvciBhbGwgbWFrZSB0aGUgQ09OTkVDVCBjb2RlIHVzZSB0aGUKICBvcmRpbmFyeSByZXF1ZXN0IHNlbmRpbmcvcmVjZWl2aW5nIGNvZGUsIHRyZWF0aW5nIGl0IGFzIGFueSBvcmRpbmFyeSByZXF1ZXN0CiAgaW5zdGVhZCBvZiB0aGUgc3BlY2lhbC1wdXJwb3NlIGZ1bmN0aW9uIHdlIGhhdmUgbm93LiBJdCBzaG91bGQgbWFrZSBpdAogIGJldHRlciBmb3IgbXVsdGktaW50ZXJmYWNlIHRvby4gQW5kIHBvc3NpYmx5IGxlYWQgdG8gbGVzcyBjb2RlLi4uCgogIEFkZGVkIHRlc3QgY2FzZSAyNjUgZm9yIHRoaXMuIEl0IGRvZXNuJ3Qgd29yayBhcyBhIF9yZWFsbHlfIGdvb2QgdGVzdCBjYXNlCiAgc2luY2UgdGhlIHRlc3QgcHJveHkgaXMgdG9vIHN0dXBpZCwgYnV0IHRoZSB0ZXN0IGNhc2UgaGVscHMgd2hlbiBydW5uaW5nIHRoZQogIGRlYnVnZ2VyIHRvIHZlcmlmeS4KCkRhbmllbCAoMzAgSnVuZSAyMDA1KQotIERhbiBGYW5kcmljaCBpbXByb3ZlZCB0aGUgY29uZmlndXJlIHNjcmlwdCdzIGFiaWxpdHkgdG8gZmlndXJlIG91dCB3aGF0IGtpbmQKICBvZiBzdHJlcnJvcl9yKCkgQVBJIHRoYXQgaXMgdXNlZCB3aGVuIGNyb3NzLWNvbXBpbGluZy4gSWYgX19HTElCX18gaXMKICBkZWZpbmVkLCBpdCBhc3N1bWVzIHRoZSBnbGliYyBBUEkuIElmIG5vdCwgaXQgaXNzdWVzIGEgbm90aWNlIGFzIGJlZm9yZSB0aGF0CiAgdGhlIHVzZXIgbmVlZHMgdG8gbWFudWFsbHkgZWRpdCBsaWIvY29uZmlnLmggZm9yIHRoaXMuCgpEYW5pZWwgKDIzIEp1bmUgMjAwNSkKLSBEYXZpZCBTaGF3J3MgZml4IHRoYXQgdW5pZmllcyBwcm94eSBzdHJpbmcgdHJlYXRtZW50IHNvIHRoYXQgYSBwcm94eSBnaXZlbgogIHdpdGggQ1VSTE9QVF9QUk9YWSBjYW4gdXNlIGEgaHR0cDovLyBwcmVmaXggYW5kIHVzZXIgKyBwYXNzd29yZC4gVGhlIHVzZXIKICBhbmQgcGFzc3dvcmQgZmllbGRzIGFyZSBub3cgYWxzbyBVUkwgZGVjb2RlZCBwcm9wZXJseS4gVGVzdCBjYXNlIDI2NCBhZGRlZAogIHRvIHZlcmlmeS4KCkRhbmllbCAoMjIgSnVuZSAyMDA1KQotIERhdmlkIFNoYXcgdXBkYXRlZCBsaWJjdXJsLm00CgpEYW5pZWwgKDE0IEp1bmUgMjAwNSkKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIHBvdGVudGlhbCB0aHJlYWQgaGFuZGxlIGxlYWsuIEJ1ZyByZXBvcnQgIzEyMTY1MDAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIxNjUwMCkuICBDb21tZW50IGluCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA1LTA2LzAwNTkuaHRtbAoKRGFuaWVsICgxMyBKdW5lIDIwMDUpCi0gTWFkZSBidWlsZGNvbmYgcnVuIGxpYnRvb2xpemUgaW4gdGhlIGFyZXMgZGlyIHRvbyAoaW5zcGlyZWQgYnkgVHVwb25lJ3MKICByZXZlcnRlZCBwYXRjaCkuCgpEYW5pZWwgKDkgSnVuZSAyMDA1KQotIEluY29ycG9yYXRlZCBUdXBvbmUncyBmaW5kdG9vbCBmaXggaW4gYnVpbGRjb25mIChzbGlnaHRseSBlZGl0ZWQpCgotIEluY29ycG9yYXRlZCBUdXBvbmUncyBoZWFkIC1uIGZpeCBpbiBidWlsZGNvbmYuCgpEYW5pZWwgKDggSnVuZSAyMDA1KQotIFJldmVydGVkIFR1cG9uZSdzIHBhdGNoIGFnYWluLCBpdCBicm9rZSBudW1lcm91cyBhdXRvYnVpbGRzLiBMZXQncyBhcHBseSBpdAogIGluIHBpZWNlcywgb25lIGJ5IG9uZSBhbmQgc2VlIHdoYXQgd2UgbmVlZCB0byBhZGp1c3QgdG8gd29yayBhbGwgb3Zlci4KCkRhbmllbCAoNiBKdW5lIDIwMDUpCi0gVHVwb25lIEFsZnJlZG8gZml4ZWQgdGhyZWUgcHJvYmxlbXMgaW4gYnVpbGRjb25mOgoKICAxKSBmaW5kdG9vbCBkb2VzIGxvb2sgcGVyIHRvb2wgaW4gUEFUSCBhbmQgdGhpbmsgLi9wZXJsIGlzIHRoZSBwZXJsCiAgZXhlY3V0YWJsZSwgd2hpbGUgaXMganVzdCBhIGxvY2FsIGRpcmVjdG9yeSAoSSBoYXZlIC4gaW4gdGhlIFBBVEgpCgogIDIpIEkgZ290IHNldmVyYWwgd2FybmluZyBmb3IgaGVhZCAtMSBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBoZWFkIC1uIDEKIAogIDMpIGFyZXMgZGlyZWN0b3J5IGlzIG1pc3Npbmcgc29tZSBmaWxlIChtaXNzaW5nIGlzIG1pc3NpbmcgOi0pICkgYmVjYXVzZQogIGF1dG9tYWtlIGFuZCBmcmllbmRzIGlzIG5vdCBydW4uCgpEYW5pZWwgKDMgSnVuZSAyMDA1KQotIEFkZGVkIGRvY3MvbGliY3VybC9nZXRpbmZvLXRpbWVzLCBiYXNlZCBvbiBmZWVkYmFjayBmcm9tICdFZGknOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvZmVlZGJhY2svZGlzcGxheS5jZ2k/aWQ9MTExNzgzMjU3OTgyOTkmc3VwcG9ydD15ZXMKCi0gQW5kcmVzIEdhcmNpYSBwcm92aWRlZCB5ZXQgYW5vdGhlciB0ZXh0IG1vZGUgcGF0Y2ggZm9yIHNldmVyYWwgdGVzdCBjYXNlcyBzbwogIHRoYXQgdGhleSBkbyB0ZXh0IGNvbXBhcmlzaW9ucyBiZXR0ZXIgb24gV2luZG93cyAobmV3bGluZS13aXNlKS4KCkRhbmllbCAoMSBKdW5lIDIwMDUpCi0gVGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgYy1hcmVzIG5vdyBhZGRzIHRoZSBjYXJlcyBsaWIgYmVmb3JlIHRoZSBvdGhlciBsaWJzLAogIHRvIG1ha2UgaXQgYnVpbGQgZmluZSB3aXRoIG1pbmd3LiBJbnNwaXJlZCBieSBUdXBvbmUgQWxmcmVkbydzIGJ1ZyByZXBvcnQKICBhbmQgcGF0Y2g6IGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMTI5NDAKCkRhbmllbCAoMzEgTWF5IDIwMDUpCi0gVG9kZCBLdWxlc3phIHJlcG9ydGVkIGEgZmxhdyBpbiB0aGUgcHJveHkgb3B0aW9uLCBzaW5jZSBhIG51bWVyaWNhbCBJUHY2CiAgYWRkcmVzcyB3YXMgbm90IHBvc3NpYmxlIHRvIHVzZS4gSXQgaXMgbm93LCBidXQgcmVxdWlyZXMgaXQgd3JpdHRlbgogIFJGQzI3MzItc3R5bGUsIHdpdGhpbiBicmFja2V0cyAtIHdoaWNoIGluY2lkZW50bHkgaXMgaG93IHlvdSBlbnRlciBudW1lcmljYWwKICBJUHY2IGFkZHJlc3NlcyBpbiBVUkxzLiBUZXN0IGNhc2UgMjYzIGFkZGVkIHRvIHZlcmlmeS4KCkRhbmllbCAoMzAgTWF5IDIwMDUpCi0gRXJpYyBDb29wZXIgcmVwb3J0ZWQgYWJvdXQgYSBwcm9ibGVtIHdpdGggSFRUUCBzZXJ2ZXJzIHRoYXQgcmVzcG9uZHMgd2l0aAogIGJpbmFyeSB6ZXJvZXMgd2l0aGluIHRoZSBoZWFkZXJzLiBUaGV5IGNvbmZ1c2VkIGxpYmN1cmwgdG8gZG8gd3Jvbmcgc28gdGhlCiAgZG93bmxvYWRlZCBoZWFkZXJzIGJlY29tZSBpbmNvbXBsZXRlLiBUaGUgZml4IGlzIG5vdyB2ZXJpZmllZCB3aXRoIHRlc3QgY2FzZQogIDI2Mi4gaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMxMDk0OAoKRGFuaWVsICgyNSBNYXkgMjAwNSkKLSBGaXhlZCBwcm9ibGVtcyB3aXRoIHRoZSB0ZXN0IHN1aXRlLCBhbmQgaW4gcGFydGljdWxhciB0aGUgRlRQIHRlc3QgY2FzZXMKICBzaW5jZSBpdCBwcmV2aW91c2x5IHdhcyBmYWlsaW5nIGV2ZXJ5IG5vdyBhbmQgdGhlbiBpbiBhIG5vbnNlbnNlIG1hbm5lci4KCi0gLS10cmFjZS10aW1lIG5vdyBvdXRwdXRzIHRoZSBmdWxsIG1pY3Jvc2Vjb25kLCBhbGwgNiBkaWdpdHMuCgpEYW5pZWwgKDI0IE1heSAyMDA1KQotIEFuZHJlcyBHYXJjaWEgcHJvdmlkZWQgYSB0ZXh0IG1vZGUgcGF0Y2ggZm9yIHNldmVyYWwgdGVzdCBjYXNlcyBzbyB0aGF0IHRoZXkKICBkbyB0ZXh0IGNvbXBhcmlzaW9ucyBiZXR0ZXIgb24gV2luZG93cyAobmV3bGluZS13aXNlKS4KCi0gQW55IDJ4eCByZXNwb25zZSAoYW5kIG5vdCBqdXN0IDIwMCkgaXMgbm93IGNvbnNpZGVyZWQgYSBmaW5lIHJlc3BvbnNlIHRvCiAgVFlQRSwgYXMgc29tZSBzZXJ2ZXJzIG9idmlvdXNseSBzZW5kcyBhIDIyNiB0aGVyZS4gQWRkZWQgdGVzdCBjYXNlIDI2MSB0bwogIHZlcmlmeS4gQmFzZWQgb24gYSBxdWVzdGlvbi9yZXBvcnQgYnkgR2VvcmcgV2ljaGVyc2tpLgoKRGFuaWVsICgyMCBNYXkgMjAwNSkKLSBJbXByb3ZlZCBydW50ZXN0cy5wbCB0byBhbGxvdyBzdGRvdXQgdGVzdHMgdG8gYmUgbW9kZT10ZXh0IGFzIHdlbGwsIGp1c3QKICBhcyBmaWxlIGNvbXBhcmlzb25zIGFscmVhZHkgc3VwcG9ydHMuIEFkZGVkIHRoaXMgaW5mbyB0byB0aGUgRklMRUZPUk1BVAogIGRvY3MuCgpEYW5pZWwgKDE4IE1heSAyMDA1KQotIEpvaG4gTWNHb3dhbiBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiBidWcgcmVwb3J0ICMxMjA0NDM1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMDQ0MzUpIHdpdGggbWFsZm9ybWVkIFVSTHMgbGlrZQogICJodHRwOi8vc29tZWhvc3Q/ZGF0YSIgYXMgaXQgYWRkZWQgYSBzbGFzaCB0b28gbXVjaCBpbiB0aGUgcmVxdWVzdCAoIkdFVAogIC8/ZGF0YS8iLi4uKS4gQWRkZWQgdGVzdCBjYXNlIDI2MCB0byB2ZXJpZnkuCgotIFRoZSBjb25maWd1cmUgY2hlY2sgZm9yIHN0cmVycm9yX3IoKSBmYWlsZWQgdG8gZGV0ZWN0IHRoZSBwcm9wZXIgQVBJIGF0CiAgdGltZXMsIGxpa2Ugb24gSFAtVVggMTAuMjAuIFRoZW4gbGliL3N0cmVycm9yLmMgYmFkbHkgYXNzdW1lZCB0aGUgZ2xpYmMKICB2ZXJzaW9uIGlmIHRoZSBwb3NpeCBkZWZpbmUgd2Fzbid0IHNldCAoc2luY2UgaXQgX2hhZF8gZm91bmQgYSBzdHJlcnJvcl9yKS4KCkRhbmllbCAoMTYgTWF5IDIwMDUpCi0gVGhlIGdtdGltZV9yKCkgZnVuY3Rpb24gaW4gSFAtVVggMTAuMjAgaXMgYnJva2VuLiBBYm91dCAxMyB0ZXN0IGNhc2VzIGZhaWwKICBkdWUgdG8gdGhpcy4gVGhlcmUncyBub3cgYSBjb25maWd1cmUgY2hlY2sgdGhhdCBhdHRlbXB0cyB0byBkZXRlY3QgdGhlIGJhZAogIGZ1bmN0aW9uIGFuZCBub3QgdXNlIGl0IG9uIHN1Y2ggc3lzdGVtcy4KClZlcnNpb24gNy4xNC4wICgxNiBNYXkgMjAwNSkKCkRhbmllbCAoMTMgTWF5IDIwMDUpCi0gR3JpZ29yeSBFbnRpbiByZXBvcnRlZCB0aGF0IGN1cmwncyBjb25maWd1cmUgZGV0ZWN0cyBhIGZpbmUgcG9sbCgpIGZvciBNYWMKICBPUyBYIDEwLjQgKHdoaWxlIDEwLjMgb3IgbGF0ZXIgZGV0ZWN0ZWQgYSAiYmFkIiBvbmUpLCBidXQgdGhlIGV4ZWN1dGFibGUKICBkb2Vzbid0IHdvcmsgYXMgZ29vZCBhcyBpZiBidWlsdCB3aXRob3V0IHBvbGwoKS4gSSd2ZSBhZGp1c3RlZCB0aGUgY29uZmlndXJlCiAgdG8gYWx3YXlzIHNraXAgdGhlIGZpbmUtcG9sbCgpIHRlc3Qgb24gTWFjIE9TIFggKGRhcndpbikuCgpEYW5pZWwgKDEyIE1heSAyMDA1KQotIFdoZW4gZG9pbmcgYSBzZWNvbmQgcmVxdWVzdCAoYWZ0ZXIgYSBkaXNjb25uZWN0KSB1c2luZyB0aGUgc2FtZSBlYXN5IGhhbmRsZSwKICBvdmVyIGEgcHJveHkgdGhhdCB1c2VzIE5UTE0gYXV0aGVudGljYXRpb24sIGxpYmN1cmwgZmFpbGVkIHRvIHVzZSBOVExNIGFnYWluCiAgcHJvcGVybHkgKHRoZSBhdXRoIG1ldGhvZCB3YXMgYWNjaWRlbnRhbGx5IHJlc2V0IHRvIHRoZSBzYW1lIGFzIGhhZCBiZWVuIHNldAogIGZvciBob3N0IGF1dGgsIHdoaWNoIGRlZmF1bHRzIHRvIEJhc2ljKS4gQnVnIHJlcG9ydCAjMTIwMDY2MQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjAwNjYxKSBpZGVudGlmaWVkIHRoZSB0aGUgcHJvYmxlbSBhbmQKICB0aGUgZml4LgoKLSBJZiAtei8tLXRpbWUtY29uZCBpcyB1c2VkIHdpdGggYW4gaW52YWxpZCBkYXRlIHN5bnRheCwgdGhpcyBpcyBubyBsb25nZXIKICBzaWxlbnRseSBkaXNjYXJkZWQuIEluc3RlYWQgYSBwcm9wZXIgd2FybmluZyBtZXNzYWdlIGlzIGRpcGxheWVkIHRoYXQKICBpbmZvcm1zIGFib3V0IGl0LiBCdXQgaXQgc3RpbGwgY29udGludWVzIHdpdGhvdXQgdGhlIGNvbmRpdGlvbi4KClZlcnNpb24gNy4xNC4wLXByZTIgKDExIE1heSAyMDA1KQoKRGFuaWVsICgxMSBNYXkgMjAwNSkKLSBTdGFydGluZyBub3csIGxpYmN1cmwgc2VuZHMgYSBsaXR0bGUgZGlmZmVyZW50IHNldCBvZiBoZWFkZXJzIGluIGl0cyBkZWZhdWx0CiAgSFRUUCByZXF1ZXN0czoKICAKICBBKSBOb3JtYWwgbm9uLXByb3h5IEhUVFA6CiAgICAtIG5vIG1vcmUgIlByYWdtYTogbm8tY2FjaGUiICh0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgdG8gcHJveGllcykKCiAgQikgTm9uLUNPTk5FQ1QgSFRUUCByZXF1ZXN0IG92ZXIgcHJveHk6CiAgICAtICJQcmFnbWE6IG5vLWNhY2hlIiBpcyB1c2VkIChsaWtlIGJlZm9yZSkKICAgIC0gIlByb3h5LUNvbm5lY3Rpb246IEtlZXAtYWxpdmUiIChmb3Igb2xkZXIgc3R5bGUgMS4wLXByb3hpZXMpCgogIEMpIENPTk5FQ1QgSFRUUCByZXF1ZXN0IG92ZXIgcHJveHk6CiAgICAtICJIb3N0OiBbbmFtZV06W3BvcnRdIgogICAgLSAiUHJveHktQ29ubmVjdGlvbjogS2VlcC1hbGl2ZSIKCiAgVGhlIEEpIGNhc2UgaXMgbW9zdGx5IHRvIHJlZHVjZSB0aGUgZGVmYXVsdCBoZWFkZXIgc2l6ZSBhbmQgcmVtb3ZlIGEKICBwb2ludGxlc3MgaGVhZGVyLgoKICBUaGUgQikgaXMgdG8gYWRkcmVzcyAocmFyZSkgcHJvYmxlbXMgd2l0aCBIVFRQIDEuMCBwcm94aWVzCgogIFRoZSBDKSBoZWFkZXJzIGFyZSBib3RoIHRvIGFkZHJlc3MgKHJhcmUpIHByb2JsZW1zIHdpdGggc29tZSBwcm94aWVzLiBUaGUKICBjb2RlIGluIGxpYmN1cmwgdGhhdCBkZWFscyB3aXRoIENPTk5FQ1QgcmVxdWVzdHMgbmVlZCBhIHJld3JpdGUsIGJ1dCBpdAogIGZlZWxzIGxpa2UgYSB0b28gYmlnIGEgam9iIGZvciBtZSB0byBkbyBub3cuIERldGFpbHMgYXJlIGFkZGVkIGluIHRoZSBjb2RlCiAgY29tbWVudHMgZm9yIG5vdy4KCiAgVXBkYXRlZCBhIGxhcmdlIGFtb3VudCBvZiB0ZXN0IGNhc2VzIHRvIHJlZmxlY3QgdGhlIG5ld3MuCgpEYW5pZWwgKDEwIE1heSAyMDA1KQotIEhhbGYtYmFrZWQgYXR0ZW1wdCB0byBiYWlsIG91dCBpZiBzZWxlY3QoKSByZXR1cm5zIF9vbmx5XyBlcnJvcmZkcyB3aGVuIHRoZQogIHRyYW5zZmVyIGlzIGluIHByb2dyZXNzLiBBbiBhdHRlbXB0IHRvIGZpeCBBbGxhbidzIHByb2JsZW0uIFNlZQogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNS0wNS8wMDczLmh0bWwgYW5kIHRoZSByZXN0IG9mIHRoYXQgdGhyZWFkCiAgZm9yIGRldGFpbHMuCgogIEknbSBzdGlsbCBub3Qgc3VyZSB0aGlzIGlzIHRoZSByaWdodCBmaXgsIGJ1dC4uLgoKVmVyc2lvbiA3LjE0LjAtcHJlMSAoOSBNYXkgMjAwNSkKCkRhbmllbCAoMiBNYXkgMjAwNSkKLSBTb3J0IG9mICJmaXhlZCIgS05PV05fQlVHUyAjNDogY3VybCBub3cgYnVpbGRzIElQdjYgZW5hYmxlZCBvbiBBSVggNC4zLiBBdAogIGxlYXN0IGl0IHNob3VsZCBubyBsb25nZXIgY2F1c2UgYSBjb21waWxlciBlcnJvci4gSG93ZXZlciwgaXQgZG9lcyBub3QgaGF2ZQogIEFJX05VTUVSSUNIT1NUIHNvIHdlIGNhbm5vdCBnZXRhZGRyaW5mbygpIGFueSBudW1lcmljYWwgYWRkcmVzc2VzIHdpdGggaXQKICAod2UgdXNlIHRoYXQgZm9yIEZUUCBQT1JUL0VQUlQpISBTbywgSSBtb2RpZmllZCB0aGUgY29uZmlndXJlIGNoZWNrIHRoYXQKICBjaGVja3MgaWYgdGhlIGdldGFkZHJpbmZvKCkgaXMgd29ya2luZywgdG8gdXNlIEFJX05VTUVSSUNIT1NUIHNpbmNlIHRoZW4KICBpdCdsbCBmYWlsIG9uIEFJWCA0LjMgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBidWlsZCB3aXRoIElQdjYgc3VwcG9ydAogIGRpc2FibGVkLgoKLSBBZGRlZCAtLXRyYWNlLXRpbWUgdGhhdCB3aGVuIHVzZWQgYWRkcyBhIHRpbWUgc3RhbXAgdG8gZWFjaCB0cmFjZSBsaW5lIHRoYXQKICAtLXRyYWNlLCAtLXRyYWNlLWFzY2lpIGFuZCAtLXZlcmJvc2Ugb3V0cHV0LiBJIGFsc28gbWFkZSB0aGUgJz4nIGRpc3BsYXkKICBzZXBhcmF0ZSBlYWNoIGxpbmUgb24gdGhlIGxpbmVmZWVkIHNvIHRoYXQgSFRUUCByZXF1ZXN0cyBldGMgbG9vayBuaWNlciBpbgogIHRoZSAtdiBvdXRwdXQuCgotIE1hZGUgY3VybCByZWNvZ25pemUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBMeW54IChhbmQgb3RoZXJzPykgc3VwcG9ydCBmb3IKICBwb2ludGluZyBvdXQgdGhlIENBIGNlcnQgcGF0aC9maWxlOiBTU0xfQ0VSVF9ESVIgYW5kIFNTTF9DRVJUX0ZJTEUuIElmCiAgQ1VSTF9DQV9CVU5ETEUgaXMgbm90IHNldCwgdGhleSBhcmUgY2hlY2tlZCBhZnRlcndhcmRzLgoKICBMaWtlIGJlZm9yZTogb24gd2luZG93cyBpZiBub25lIG9mIHRoZXNlIGFyZSBzZXQsIGl0IGNoZWNrcyBmb3IgdGhlIGNhIGNlcnQKICBmaWxlIGxpa2UgdGhpczoKCiAgMS4gYXBwbGljYXRpb24ncyBkaXJlY3RvcnkKICAyLiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CiAgMy4gV2luZG93cyBTeXN0ZW0gZGlyZWN0b3J5IChlLmcuIEM6XHdpbmRvd3Ncc3lzdGVtMzIpCiAgNC4gV2luZG93cyBEaXJlY3RvcnkgKGUuZy4gQzpcd2luZG93cykKICA1LiBhbGwgZGlyZWN0b3JpZXMgYWxvbmcgJVBBVEglCgpEYW5pZWwgKDEgTWF5IDIwMDUpCi0gVGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCBub3cgc3RhcnRzIHRlc3Qgc2VydmVycyBieSBkb2luZyBmb3JrKCkgYW5kIGV4ZWMoKQogIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIGFwcHJvYWNoLiBUaGlzIGlzIGxlc3MgY29tcGxpY2F0ZWQgYW5kIHNob3VsZAogIGhvcGVmdWxseSBsZWFkIHRvIGxlc3MgImxlYWtlZCIgc2VydmVycyAoc2VydmVycyB0aGF0IGFyZW4ndCBzdG9wcGVkCiAgcHJvcGVybHkgd2hlbiB0aGUgdGVzdHMgYXJlIHN0b3BwZWQpLgoKLSBBbGV4YW5kZXIgWmh1cmF2bGV2IGZvdW5kIGEgY2FzZSB3aGVuIHlvdSBkaWQgImN1cmwgLUkgW1VSTF0iIGFuZCBpdAogIGNvbXBsYWluZWQgb24gdGhlIGNodW5rZWQgZW5jb2RpbmcsIGV2ZW4gdGhvdWdoIGEgSEVBRCBzaG91bGQgbmV2ZXIgcmV0dXJuIGEKICBib2R5IGFuZCB0aHVzIGl0IGNhbm5vdCBiZSBhIGNodW5rZWQtZW5jb2RpbmcgcHJvYmxlbSEKCkRhbmllbCAoMzAgQXByaWwgMjAwNSkKLSBBbGV4YW5kZXIgWmh1cmF2bGV2IGZvdW5kIG91dCB0aGF0IChsaWIpY3VybCBTSUdTRUdWZWQgd2hlbiB1c2luZwogIC0taW50ZXJmYWNlIG9uIGFuIGFkZHJlc3MgdGhhdCBjYW4ndCBiZSBib3VuZC4KCkRhbmllbCAoMjggQXByaWwgMjAwNSkKLSBXb3JraW5nIG9uIGZpeGluZyB1cCB0ZXN0IGNhc2VzIHRvIG1hcmsgc2VjdGlvbnMgYXMgJ21vZGU9dGV4dCcgZm9yIHRoaW5ncwogIHRoYXQgY3VybCB3cml0ZXMgYXMgdGV4dCBmaWxlcywgc2luY2UgdGhlbiB0aGV5IGNhbiBnZXQgZGlmZmVyZW50IGxpbmUKICBlbmRpbmdzIGRlcGVuZGluZyBvbiBPUy4gQW5kculzIEdhcmPtYSBoZWxwcyBtZSB3b3JrIHRoaXMgb3V0LgoKICBEaWQgbG90cyBvZiBvdGhlciBtaW5vciB0d2Vha3Mgb24gdGhlIHRlc3Qgc2NyaXB0cyB0byB3b3JrIGJldHRlciBhbmQgbW9yZQogIHJlbGlhYmx5IGZpbmQgdGVzdCBzZXJ2ZXJzIGFuZCBhbHNvIGtpbGwgdGVzdCBzZXJ2ZXJzLgoKLSBEYW4gRmFuZHJpY2ggcG9pbnRlZCBvdXQgaG93IHRoZSBydW50ZXN0cy5wbCBzY3JpcHQga2lsbGVkIHRoZSBIVFRQIHNlcnZlcgogIGluc3RlYWQgb2YgdGhlIEhUVFBTIHNlcnZlciB3aGVuIGNsb3NpbmcgaXQgZG93bi4KCkRhbmllbCAoMjcgQXByaWwgMjAwNSkKLSBQYXVsIE1vb3JlIG1hZGUgY3VybCBjaGVjayBmb3IgdGhlIC5jdXJscmMgZmlsZSAoX2N1cmxyYyBvbiB3aW5kb3dzKSBvbiB0d28KICBtb3JlIHBsYWNlcy4gRmlyc3QsIENVUkxfSE9NRSBpcyBhIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGF0IGlzIHVzZWQKICBpbnN0ZWFkIG9mIEhPTUUgaWYgaXQgaXMgc2V0LCB0byBwb2ludCBvdXQgd2hlcmUgdGhlIGRlZmF1bHQgY29uZmlnIGZpbGUKICBsaXZlcy4gSWYgdGhlcmUncyBubyBjb25maWcgZmlsZSBpbiB0aGUgZGlyIHBvaW50ZWQgb3V0IGJ5IG9uZSBvZiB0aGUKICBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRoZSBXaW5kb3dzIHZlcnNpb24gd2lsbCBpbnN0ZWFkIGNoZWNrIHRoZSBzYW1lCiAgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGN1cmwgaXMgbG9jYXRlZCBpbi4KCkRhbmllbCAoMjYgQXByaWwgMjAwNSkKLSBDb3J5IE5lbHNvbidzIHdvcmsgb24gbnVraW5nIGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgb24geDY0IHdpdGgKICBWUzIwMDUuCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDUpCi0gRnJlZCBOZXcgcmVwb3J0ZWQgYSBidWcgd2hlcmUgd2UgdXNlZCBCYXNpYyBhdXRoIGFuZCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkCiAgaW4gLm5ldHJjLCBhbmQgd2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjogdGhlIHN1YnNlcXVlbnQgcmVxdWVzdHMgZGlkbid0CiAgcHJvcGVybHkgdXNlIHRoZSBhdXRoIGFzIGZvdW5kIGluIHRoZSBuZXRyYyBmaWxlLiBBZGRlZCB0ZXN0IGNhc2UgMjU3IHRvCiAgdmVyaWZ5IG15IGZpeC4KCi0gQmFzZWQgb24gZmVlZGJhY2sgZnJvbSBDb3J5IE5lbHNvbiwgSSBhZGRlZCBzb21lIHByZXByb2Nlc3NvciBtYWdpYyBpbgogICovc2V0dXAuaCBhbmQgKi9jb25maWctd2luMzIuaCB0byBidWlsZCBmaW5lIHdpdGggVlMyMDA1IG9uIHg2NC4KCkRhbmllbCAoMjMgQXByaWwgMjAwNSkKLSBBbGV4IFN1eWtvdiBtYWRlIHRoZSBjdXJsIHRvb2wgbm93IGFzc3VtZSB0aGF0IHVwbG9hZHMgdXNpbmcgSFRUUDovLyBvcgogIEhUVFBTOi8vIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgc2hvdyBvdXRwdXQgYW5kIHRodXMgbW90aXZhdGVzIGEgc3dpdGNoZWQKICBvZmYgcHJvZ3Jlc3MgbWV0ZXIgaWYgdGhlIG91dHB1dCBpcyBzZW50IHRvIHRoZSB0ZXJtaW5hbC4gVGhpcyBtYWtlcyBGVFAKICB1cGxvYWRzIHdpdGhvdXQgJz4nLCAtbyBvciAtTyBzaG93IHRoZSBwcm9ncmVzcyBtZXRlci4KCkRhbmllbCAoMjIgQXByaWwgMjAwNSkKLSBEYXZlIERyaWJpbidzIE1TVkMgbWFrZWZpbGUgZml4OiBzZXQgQ1VSTF9TVEFUSUNMSUIgd2hlbiBpdCBidWlsZHMgc3RhdGljCiAgbGlicmFyeSB2YXJpYW50cy4KCi0gQW5kcmVzIEdhcmNpYSBmaXhlZCBjb25maWd1cmUgdG8gc2V0IHRoZSBwcm9wZXIgZGVmaW5lIHdoZW4gYnVpbGRpbmcgc3RhdGljCiAgbGliY3VybCBvbiB3aW5kb3dzLgoKLSAtLXJldHJ5LWRlbGF5IGRpZG4ndCB3b3JrLgoKRGFuaWVsICgxOCBBcHJpbCAyMDA1KQotIE9saXZpZXIgcmVwb3J0ZWQgdGhhdCBldmVuIHRob3VnaCBoZSB1c2VkIENVUkxPUFRfUE9SVCwgbGliY3VybCBjbGVhcmx5CiAgc3RpbGwgdXNlZCB0aGUgZGVmYXVsdCBwb3J0LiBIZSB3YXMgcmlnaHQuIEkgZml4ZWQgdGhlIHByb2JsZW0gYW5kIGFkZGVkIHRoZQogIHRlc3QgY2FzZXMgNTIxLCA1MjIgYW5kIDUyMyB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gVG9zaGl5dWtpIE1hZXphd2EgcmVwb3J0ZWQgdGhhdCB3aGVuIGRvaW5nIGEgUE9TVCB3aXRoIGEgcmVhZCBjYWxsYmFjaywKICBsaWJjdXJsIGRpZG4ndCBwcm9wZXJseSBzZW5kIGFuIEV4cGVjdDogMTAwLWNvbnRpbnVlIGhlYWRlci4gSXQgZG9lcyBub3cuCgotIEkgY29tbWl0dGVkIGJ5IG1pZyBjaGFuZ2UgaW4gdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRoYXQgbW92ZXMgb3V0IGFsbAogIHNvY2tldC9UQ1AgY29kZSB0byBhIHNlcGFyYXRlIEMgcHJvZ3JhbSBuYW1lZCBzb2NrZmlsdC4gQW5kIGFkZGVkIDQgbmV3CiAgdGVzdCBjYXNlcyBmb3IgRlRQIG92ZXIgSVB2Ni4KCkRhbmllbCAoOCBBcHJpbCAyMDA1KQotIENvcnkgTmVsc29uIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIGEgSFRUUCBzZXJ2ZXIgdGhhdCByZXNwb25kZWQgd2l0aCBhIDMwNAogIHJlc3BvbnNlIGNvbnRhaW5pbmcgYW4gImlsbGVnYWwiIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXIsIHdoaWNoIHdhcyBub3QKICBwcm9wZXJseSBpZ25vcmVkIGJ5IGxpYmN1cmwuIE5vdyBpdCBpcy4gVGVzdCBjYXNlIDI0OSB2ZXJpZmllcy4KCkRhbmllbCAoNyBBcHJpbCAyMDA1KQotIEFkZGVkIGFiaWxpdHkgdG8gYnVpbGQgYW5kIHJ1biB3aXRoIEdudVRMUyBhcyBhbiBhbHRlcm5hdGl2ZSB0byBPcGVuU1NMIGZvcgogIHRoZSBzZWN1cmUgbGF5ZXIuIGNvbmZpZ3VyZSAtLXdpdGgtZ251dGxzIGVuYWJsZXMgd2l0aC4gTm90ZSB0aGF0IHRoZQogIHByZXZpb3VzIE9wZW5TU0wgY2hlY2sgc3RpbGwgaGFzIHByZWZlcmVuY2UgYW5kIGlmIGl0IGZpcnN0IGRldGVjdHMgT3BlblNTTCwKICBpdCB3aWxsIG5vdCBjaGVjayBmb3IgR251VExTLiBZb3UgbWF5IG5lZWQgdG8gZXhwbGljdGx5IGRpYWJsZSBPcGVuU1NMIHdpdGgKICAtLXdpdGhvdXQtc3NsLgoKICBUaGlzIHdvcmsgaGFzIGJlZW4gc3BvbnNvcmVkIGJ5IFRoZSBXcml0dGVuIFdvcmQuCgpEYW5pZWwgKDUgQXByaWwgMjAwNSkKLSBDaHJpc3RvcGhlIExlZ3J5IGZpeGVkIHRoZSBwb3N0LXVwbG9hZCBjaGVjayBmb3IgRlRQIHRvIG5vdCBjb21wbGFpbiBpZiB0aGUKICB1cGxvYWQgd2FzIHNraXBwZWQgZHVlIHRvIGEgdGltZS1jb25kaXRpb24gYXMgc2V0IHdpdGgKICBDVVJMT1BUX1RJTUVDT05ESVRJT04uIEkgYWRkZWQgdGVzdCBjYXNlIDI0NyBhbmQgMjQ4IHRvIHZlcmlmeS4KClZlcnNpb24gNy4xMy4yICg1IEFwcmlsIDIwMDUpCgpEYW5pZWwgKDQgQXByaWwgMjAwNSkKLSBNYXJjZWxvIEp1Y2hlbSBmaXhlZCB0aGUgTVNWQyBtYWtlZmlsZSBmb3IgbGliY3VybAoKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIGNyYXNoIGluIGxpYmN1cmwsIHRoYXQgY291bGQgaGFwcGVuIGlmIHRoZSBlYXN5IGhhbmRsZQogIHdhcyBraWxsZWQgYmVmb3JlIHRoZSB0aHJlYWRpbmcgcmVzb2x2ZXIgKHdpbmRvd3Mgb25seSkgc3RpbGwgaGFkbid0CiAgY29tcGxldGVkLgoKLSBIYXJkZWVwIFNpbmdoIHJlcG9ydGVkIGEgcHJvYmxlbSBkb2luZyBIVFRQIFBPU1Qgd2l0aCBEaWdlc3QuIChJdCB3YXMKICBhY3R1YWxseSBhbHNvIGFmZmVjdGluZyBOVExNIGFuZCBOZWdvdGlhdGUuKSBJdCB0dXJuZWQgb3V0IHRoYXQgaWYgdGhlCiAgc2VydmVyIHJlc3BvbmRlZCB3aXRoIDEwMCBDb250aW51ZSBiZWZvcmUgdGhlIGluaXRpYWwgNDAxIHJlc3BvbnNlLCBsaWJjdXJsCiAgZGlkbid0IHRha2UgY2FyZSBvZiB0aGUgcmVzcG9uc2UgcHJvcGVybHkuIFRlc3QgY2FzZSAyNDUgYW5kIDI0NiBhZGRlZCB0bwogIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgzMCBNYXJjaCAyMDA1KQotIEFuZHJlcyBHYXJjaWEgbW9kaWZpZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIGxpYmdkaTMyIGJlZm9yZQogIGxpYmNyeXB0bywgdG8gbWFrZSB0aGUgU1NMIGNoZWNrIHdvcmsgZmluZSBvbiBtc3lzL21pbmd3LgoKRGFuaWVsICgyOSBNYXJjaCAyMDA1KQotIFRvbSBNb2VycyBpZGVudGlmaWVkIGEgZmxhdyB3aGVuIHlvdSBzZW50IGEgUE9TVCB3aXRoIERpZ2VzdCBhdXRoZW50aWNhdGlvbiwKICBhcyBpbiB0aGUgZmlyc3QgcmVxdWVzdCB3aGVuIGN1cmwgc2VuZHMgYSBQT1NUIHdpdGggQ29udGVudC1MZW5ndGg6IDAsIGl0CiAgc3RpbGwgZm9yY2libHkgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGJlZm9yZSBkb2luZyB0aGUgbmV4dCBzdGVwIGluIHRoZSBhdXRoCiAgbmVnb3RpYXRpb24uCgotIEplc3BlciBKZW5zZW4gZm91bmQgb3V0IHRoYXQgRlRQLVNTTCBkaWRuJ3Qgd29yayBzaW5jZSBteSBGVFAKICByZXdyaXRlLiBGaXhpbmcgdGhhdCB3YXMgZWFzeSwgYnV0IGl0IGFsc28gcmV2ZWFsZWQgYSBtdWNoIHdvcnNlIHByb2JsZW06CiAgdGhlIEZUUCBzZXJ2ZXIgcmVzcG9uc2UgcmVhZGVyIGZ1bmN0aW9uIGRpZG4ndCBwcm9wZXJseSBkZWFsIHdpdGggcmVhZGluZwogIHJlc3BvbnNlcyBpbiBtdWx0aXBsZSB0aW55IGNodW5rcyBwcm9wZXJseSEgSSBtb2RpZmllZCB0aGUgRlRQIHNlcnZlciB0bwogIGFsbG93IGl0IHRvIHByb2R1Y2Ugc3VjaCBzcGxpdC11cCByZXNwb25zZXMgdG8gbWFrZSBzdXJlIGN1cmwgZGVhbHMgd2l0aAogIHRoZW0gYXMgaXQgc2hvdWxkLgoKLSBCYXNlZCBvbiBBdWd1c3R1cyBTYXVuZGVycycgY29tbWVudHMgYW5kIGZpbmRpbmdzLCB0aGUgSFRUUCBvdXRwdXQgYXV0aAogIGZ1bmN0aW9uIHdhcyBmaXhlZCB0byB1c2UgdGhlIHByb3BlciBwcm94eSBhdXRoZW50aWNhdGlvbiB3aGVuIG11bHRpcGxlIG9uZXMKICBhcmUgYWNjZXB0ZWQuIHRlc3QgMjM5IGFuZCB0ZXN0IDI0MyB3ZXJlIGFkZGVkIHRvIHJlcGVhdCB0aGUgcHJvYmxlbXMgYW5kCiAgdmVyaWZ5IHRoZSBmaXhlcy4KCiAgLS1wcm94eS1hbnlhdXRoIHdhcyBhZGRlZCB0byB0aGUgY3VybCB0b29sCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDUpCi0gVHJ1NjQgYW5kIHNvbWUgSVJJWCBib3hlcyBzZWVtIHRvIG5vdCBsaWtlIHRlc3QgMjM3IGFzIGl0IGlzLiBUaGVpcgogIGluZXRfYWRkcigpIGZ1bmN0aW9ucyBzZWVtcyB0byB1c2UgJjI1NSBvbiBhbGwgbnVtZXJpY2FscyBpbiBhIGlwdjQgZG90dGVkCiAgYWRkcmVzcyB3aGljaCBtYWtlcyBhIGRpZmZlcmVudCBmYWlsdXJlLi4uIE5vdyBJJ3ZlIG1vZGlmaWVkIHRoZSBpcHY0CiAgcmVzb2x2ZSBjb2RlIHRvIHVzZSBpbmV0X3B0b24oKSBpbnN0ZWFkIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGVzZSBzeXN0ZW1zCiAgYmV0dGVyIGRldGVjdCB0aGlzIGFzIGEgYmFkIElQIGFkZHJlc3MgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSB0b2FsbHkgYm9ndXMKICBhZGRyZXNzIHRoYXQgaXMgdGhlbiBwYXNzZWQgb24gYW5kIHVzZWQuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDUpCi0gRGFuIEZhbmRyaWNoIG1hZGUgdGhlIGNvZGUgcHJvcGVybHkgdXNlIHRoZSB1Q2xpYmMncyB2ZXJzaW9uIG9mCiAgaW5ldF9udG9hX3IoKSB3aGVuIGJ1aWx0IHdpdGggaXQuCgotIEFkZGVkIHRlc3QgMjM3IGFuZCAyMzg6IHRlc3QgRVBTViBhbmQgUEFTViByZXNwb25zZSBoYW5kbGluZyB3aGVuIHRoZXkgZ2V0CiAgd2VsbC0gZm9ybWF0ZWQgZGF0YSBiYWNrIGJ1dCB1c2luZyBpbGxlZ2FsIHZhbHVlcy4gSW4gMjM3IFBBU1YgZ2V0cyBhbiBJUAogIGFkZHJlc3MgdGhhdCBpcyB3YXkgYmFkLiBJbiAyMzggRVBTViBnZXRzIGEgcG9ydCB0aGF0IGlzIHdheSBvdXQgb2YgcmFuZ2UuCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDUpCi0gQWRkZWQgYSBmZXcgbWlzc2luZyBmZWF0dXJlcyB0byB0aGUgY3VybC1jb25maWcgLS1mZWF0dXJlcyBsaXN0CgotIE1vZGlmaWVkIHRlc3RjdXJsLnBsIHRvIG5vdyBvZmZlcgogIDEgLSBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgYWxsIGluZm8gaXQgcHJldmlvdXNseSBvbmx5IHJlYWQgZnJvbQogICAgICBmaWxlOiAtLW5hbWUsIC0tZW1haWwsIC0tZGVzYyBhbmQgLS1jb25maWd1cmUKICAyIC0gLS1ub2N2c3VwIG1ha2VzIGl0IG5vdCBhdHRlbXB0IHRvIGRvIGN2cyB1cGRhdGUKICAzIC0gLS1jcm9zc2NvbXBpbGUgaW5mb3JtcyBpdCBhbmQgbWFrZXMgaXQgbm90IGF0dGVtcHQgdGhpbmdzIGl0IGNhbid0IGRvCgotIEZpeGVkIG51bWVyb3VzIHdpbjMyIGNvbXBpbGVyIHdhcm5pbmdzLgoKLSBSZW1vdmVkIHRoZSBsaWIvc2VjdXJpdHkuaCBmaWxlIHNpbmNlIGl0IHNoYWRvd2VkIHRoZSBtaW5ndy93aW4zMiBoZWFkZXIKICB3aXRoIHRoZSBzYW1lIG5hbWUgd2hpY2ggaXMgbmVlZGVkIGZvciBTU1BJIGJ1aWxkcy4gVGhlIGNvbnRlbnRzIG9mIHRoZQogIGZvcm1lciBzZWN1cml0eS5oIGlzIG5vdyBpIGtyYjQuaAoKLSBjb25maWd1cmUgLS1lbmFibGUtc3NwaSBub3cgZW5hYmxlcyBTU1BJIGluIHRoZSBidWlsZC4gSXQgb25seSB3b3JrcyBmb3IKICB3aW5kb3dzIGJ1aWxkcyAoaW5jbHVkaW5nIGNyb3NzLWNvbXBpbGVzIGZvciB3aW5kb3dzKS4KCkRhbmllbCAoMTIgTWFyY2ggMjAwNSkKLSBEYXZpZCBIb3VsZGVyIGFkZGVkIC0tZm9ybS1zdHJpbmcgdGhhdCBhZGRzIHRoYXQgc3RyaW5nIHRvIGEgbXVsdGlwYXJ0CiAgZm9ybXBvc3QgcGFydCwgd2l0aG91dCBzcGVjaWFsIGNoYXJhY3RlcnMgaGF2aW5nIHNwZWNpYWwgbWVhbmluZ3MgZXRjIGxpa2UKICAtLWZvcm0gZmVhdHVyZXMuCgpEYW5pZWwgKDExIE1hcmNoIDIwMDUpCi0gY3VybF92ZXJzaW9uX2luZm8oKSByZXR1cm5zIHRoZSBmZWF0dXJlIGJpdCBDVVJMX1ZFUlNJT05fU1NQSSBpZiBpdCB3YXMKICBidWlsdCB3aXRoIFNTUEkgc3VwcG9ydC4KCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIG1hZGUgaXQgcG9zc2libGUgdG8gYnVpbGQgbGliY3VybCB3aXRoIHRoZQogIFVTRV9XSU5ET1dTX1NTUEkgb24gV2luZG93cywgYW5kIHRoZW4gbGliY3VybCB3aWxsIGJlIGJ1aWx0IHRvIHVzZSB0aGUKICBuYXRpdmUgd2F5IHRvIGRvIE5UTE0uIFNTUEkgYWxzbyBhbGxvd3MgbGliY3VybCB0byBwYXNzIG9uIHRoZSBjdXJyZW50IHVzZXIKICBhbmQgaXRzIHBhc3N3b3JkIGluIHRoZSByZXF1ZXN0LgoKRGFuaWVsICg5IE1hcmNoIDIwMDUpCi0gRGFuIEYgaW1wcm92ZWQgdGhlIFNTTCBsaWIgc2V0dXAgaW4gY29uZmlndXJlLgoKLSBOb2RhayBTb2RhayByZXBvcnRlZCBhIGNyYXNoIHdoZW4gdXNpbmcgYSBTT0NLUzQgcHJveHkuCgotIEplYW4tTWFyYyBSYW5nZXIgcG9pbnRlZCBvdXQgYW4gZW1iYXJhc3NpbmcgZGVidWcgcHJpbnRmKCkgbGVmdG92ZXIgaW4gdGhlCiAgbXVsdGkgaW50ZXJmYWNlIGNvZGUuCgotIEFkanVzdGVkIHRoZSBtYW4gcGFnZSBmb3IgdGhlIGN1cmxfZ2V0ZGF0ZSgpIHJldHVybiB2YWx1ZSBmb3IgZGF0ZXMgYWZ0ZXIKICB5ZWFyIDIwMzguIEZvciAzMiBiaXQgdGltZV90IGl0IHJldHVybnMgMHg3ZmZmZmZmZiBidXQgZm9yIDY0Yml0IHRpbWVfdCBpdAogIHJldHVybnMgZWl0aGVyIHRoZSBjb3JyZWN0IHZhbHVlIG9yIGV2ZW4gLTEgb24gc29tZSBzeXN0ZW1zIHRoYXQgc3RpbGwgc2VlbQogIHRvIG5vdCBkZWFsIHdpdGggdGhpcyBwcm9wZXJseS4gVG9yIEFybnRzZW4gZm91bmQgYSA2NGJpdCBBSVggc3lzdGVtIGZvciB1cwogIHRoYXQgZGlkIHRoZSBsYXR0ZXIuIEd3ZW5vbGUgQmVhdWNoZXNuZSdzIE1hbmRyYWtlIHBhdGNoIHB1dCB0aGUgbGlnaHRzIG9uCiAgdGhpcyBwcm9ibGVtIGluIHRoZSBmaXJzdCBwbGFjZS4KCkRhbmllbCAoOCBNYXJjaCAyMDA1KQotIERvbWluaWNrIE1lZ2xpbyByZXBvcnRlZCB0aGF0IHVzaW5nIENVUkxPUFRfRklMRVRJTUUgd2hlbiB0cmFuc2ZlcnJpbmcgYSBGVFAKICBmaWxlIGdvdCBhIExhc3QtTW9kaWZpZWQ6IGhlYWRlciB3cml0dGVuIHRvIHRoZSBkYXRhIHN0cmVhbSwgY29ycnVwdGluZyB0aGUKICBhY3R1YWwgZGF0YS4gVGhpcyB3YXMgYmVjYXVzZSBzb21lIGNvbmRpdGlvbnMgZnJvbSB0aGUgcHJldmlvdXMgRlRQIGNvZGUgd2FzCiAgbm90IHByb3Blcmx5IGJyb3VnaHQgaW50byB0aGUgbmV3IEZUUCBjb2RlLiBJIGZpeGVkIGFuZCBJIGFkZGVkIHRlc3QgY2FzZQogIDUyMCB0byB2ZXJpZnkuIChUaGlzIGJ1ZyB3YXMgaW50cm9kdWNlZCBpbiA3LjEzLjEpCgotIERhbiBGYW5kcmljaCBmaXhlZCB0aGUgY29uZmlndXJlIC0td2l0aC16bGliIG9wdGlvbiB0byBhbHdheXMgY29uc2lkZXIgdGhlCiAgZ2l2ZW4gcGF0aCBiZWZvcmUgYW55IHN0YW5kYXJkIHBhdGhzLgoKRGFuaWVsICg2IE1hcmNoIDIwMDUpCi0gUmFuZHkgTWNNdXJjaHkgd2FzIHRoZSBmaXJzdCB0byByZXBvcnQgdGhhdCB2YWxncmluZC5wbSB3YXMgbWlzc2luZyBmcm9tIHRoZQogIHJlbGVhc2UgYXJjaGl2ZSBhbmQgdGh1cyAnbWFrZSB0ZXN0JyBmYWlscy4KCkRhbmllbCAoNSBNYXJjaCAyMDA1KQotIERhbiBGYW5kcmljaCBhZGRlZCBIQVZFX0ZUUlVOQ0FURSB0byBzZXZlcmFsIGNvbmZpZy0qLmggZmlsZXMuCgotIEFkZGVkIHRlc3QgY2FzZSAyMzUgdGhhdCBtYWtlcyBhIHJlc3VtZWQgdXBsb2FkIG9mIGEgZmlsZSB0aGF0IGlzbid0IHByZXNlbnQKICBvbiB0aGUgcmVtb3RlIHNpZGUuIFRoaXMgdGhlbiBjb252ZXJ0cyB0aGUgb3BlcmF0aW9uIHRvIGFuIG9yZGluYXJ5IFNUT1IKICB1cGxvYWQuIFRoaXMgd2FzIHJlcXVlc3RlZC9wb2ludGVkIG91dCBieSBJZ25hY2lvIFZhenF1ZXotQWJyYW1zLgoKICBJdCBhbHNvIHByb3ZlZCAoYW5kIEkgZml4ZWQpIGEgYnVnIGluIHRoZSBuZXdseSByZXdyaXR0ZW4gZnRwIGNvZGUgKGFuZAogIHByZXNlbnQgaW4gdGhlIDcuMTMuMSByZWxlYXNlKSB3aGVuIHRyeWluZyB0byByZXN1bWUgYW4gdXBsb2FkIGFuZCB0aGUKICBzZXJ2ZXJzIHJldHVybnMgYW4gZXJyb3IgdG8gdGhlIFNJWkUgY29tbWFuZC4gbGliY3VybCB0aGVuIGxvb3BzIGFuZCBzZW5kcwogIFNJWkUgY29tbWFuZHMgaW5maW5pdGVseS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIGEgU1NMIHByb2JsZW0gaW50cm9kdWNlZCBvbiBGZWJydWFyeSA5dGggdGhhdCBtYWRlCiAgbGliY3VybCBhdHRlbXB0IHRvIGxvYWQgdGhlIHdob2xlIHJhbmRvbSBmaWxlIHRvIHNlZWQgdGhlIFBSTkcuIFRoaXMgaXMKICByZWFsbHkgYmFkIHNpbmNlIHRoaXMgdHVybnMgb3V0IHRvIGJlIHVzaW5nIC9kZXYvdXJhbmRvbSBhdCB0aW1lcy4uLgoKVmVyc2lvbiA3LjEzLjEgKDQgTWFyY2ggMjAwNSkKCkRhbmllbCAoNCBNYXJjaCAyMDA1KQotIERhdmUgRHJpYmluIG1hZGUgaXQgcG9zc2libGUgdG8gc2V0IENVUkxPUFRfQ09PS0lFRklMRSB0byAiIiB0byBhY3RpdmF0ZQogIHRoZSBjb29raWUgImVuZ2luZSIgd2l0aG91dCBoYXZpbmcgdG8gcHJvdmlkZSBhbiBlbXB0eSBvciBub24tZXhpc3RpbmcgZmlsZS4KCi0gUmVuZSBSZWJlIGZpeGVkIGEgLSMgY3Jhc2ggd2hlbiBtb3JlIGRhdGEgdGhhbiBleHBlY3RlZCB3YXMgcmV0cmlldmVkLgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA1KQotIE5UTE0gYW5kIGZ0cC1rcmI0IGJ1ZmZlciBvdmVyZmxvdyBmaXhlZCwgYXMgcmVwb3J0ZWQgaGVyZToKICBodHRwOi8vd3d3LnNlY3VyaXR5Zm9jdXMuY29tL2FyY2hpdmUvMS8zOTEwNDIgYW5kIHRoZSBDQU4gcmVwb3J0IGhlcmU6CiAgaHR0cDovL2N2ZS5taXRyZS5vcmcvY2dpLWJpbi9jdmVuYW1lLmNnaT9uYW1lPUNBTi0yMDA1LTA0OTAKCiAgSWYgdGhlc2Ugc2VjdXJpdHkgZ3V5cyB3ZXJlIHNlcmlvdXMsIHdlJ2QgYmVlbiBub3RpZmllZCBpbiBhZHZhbmNlIGFuZCB3ZQogIGNvdWxkJ3ZlIHNhdmVkIGEgZmV3IG9mIHlvdSBhIGxpdHRsZSBzdXJwcmlzZSwgYnV0IG5vdyB3ZSB3ZXJlbid0LgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA1KQotIFJhbHBoIE1pdGNoZWxsIHJlcG9ydGVkIGEgZmxhdyB3aGVuIHlvdSB1c2VkIGEgcHJveHkgd2l0aCBhdXRoLCBhbmQgeW91CiAgcmVxdWVzdGVkIGRhdGEgZnJvbSBhIGhvc3QgYW5kIHRoZW4gZm9sbG93ZWQgYSByZWRpcmVjdCB0byBhbm90aGVyCiAgaG9zdC4gbGliY3VybCB0aGVuIGRpZG4ndCB1c2UgdGhlIHByb3h5LWF1dGggcHJvcGVybHkgaW4gdGhlIHNlY29uZCByZXF1ZXN0LAogIGR1ZSB0byB0aGUgaG9zdC1vbmx5IGNoZWNrIGZvciBvcmlnaW5hbCBob3N0IG5hbWUgd3JvbmdseSBiZWluZyBleHRlbmRlZCB0bwogIHRoZSBwcm94eSBhdXRoIGFzIHdlbGwuIEFkZGVkIHRlc3QgY2FzZSAyMzMgdG8gdmVyaWZ5IHRoZSBmbGF3IGFuZCB0aGF0IHRoZQogIGZpeCByZW1vdmVkIHRoZSBwcm9ibGVtLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA1KQotIE1pa2UgRG9iYnMgcmVwb3J0ZWQgYSBtaW5ndyBidWlsZCBmYWlsdXJlIGR1ZSB0byB0aGUgbGFjayBvZgogIEJVSUxESU5HX0xJQkNVUkwgYmVpbmcgZGVmaW5lZCB3aGVuIGxpYmN1cmwgaXMgYnVpbHQuIE5vdyB0aGlzIGlzIGRlZmluZWQgYnkKICBjb25maWd1cmUgd2hlbiBtaW5ndyBpcyB1c2VkLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA1KQotIERhdmlkIGluIGJ1ZyByZXBvcnQgIzExMjQ1ODggZm91bmQgYW5kIGZpeGVkIGEgc29ja2V0IGxlYWsgd2hlbiBsaWJjdXJsCiAgZGlkbid0IGNsb3NlIHRoZSBzb2NrZXQgcHJvcGVybHkgd2hlbiByZXR1cm5pbmcgZXJyb3IgZHVlIHRvIGZhaWxpbmcKICBsb2NhbGJpbmQKCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNSkKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggSFRUUC1QT1NUaW5nIHVzaW5nICJhbnlhdXRoIgogIHRoYXQgcGlja3MgTlRMTS4gVGhhbmtzIHRvIERhdmlkIEJ5cm9uIGxldHRpbmcgbWUgdGVzdCBOVExNIGFnYWluc3QgaGlzCiAgc2VydmVycywgSSBjb3VsZCBxdWlja2x5IHJlcGVhdCBhbmQgZml4IHRoZSBwcm9ibGVtLiBJdCB0dXJuZWQgb3V0IHRvIGJlOgoKICBXaGVuIGxpYmN1cmwgUE9TVHMgd2l0aG91dCBrbm93aW5nL3VzaW5nIGFuIGF1dGhlbnRpY2F0aW9uIGFuZCBpdCBnZXRzIGJhY2sKICBhIGxpc3Qgb2YgdHlwZXMgZnJvbSB3aGljaCBpdCBwaWNrcyBOVExNLCBpdCBuZWVkcyB0byBlaXRoZXIgY29udGludWUKICBzZW5kaW5nIGl0cyBkYXRhIGlmIGl0IGtlZXBzIHRoZSBjb25uZWN0aW9uIGFsaXZlLCBvciBub3Qgc2VuZCB0aGUgZGF0YSBidXQKICBjbG9zZSB0aGUgY29ubmVjdGlvbi4gVGhlbiBkbyB0aGUgZmlyc3Qgc3RlcCBpbiB0aGUgTlRMTSBhdXRoLiBsaWJjdXJsCiAgZGlkbid0IHNlbmQgdGhlIGRhdGEgbm9yIGNsb3NlIHRoZSBjb25uZWN0aW9uIGJ1dCBzaW1wbHkgcmVhZCB0aGUKICByZXNwb25zZS1ib2R5IGFuZCB0aGVuIHNlbnQgdGhlIGZpcnN0IG5lZ290aWF0aW9uIHN0ZXAuIFdoaWNoIHRoZW4gZmFpbGVkCiAgbWlzZXJhYmx5IG9mIGNvdXJzZS4gVGhlIGZpeGVkIHZlcnNpb24gZm9yY2VzIGEgY29ubmVjdGlvbiBpZiB0aGVyZSBpcyBtb3JlCiAgdGhhbiAyMDAwIGJ5dGVzIGxlZnQgdG8gc2VuZC4KCkRhbmllbCAoMTQgRmVicnVhcnkgMjAwNSkKLSBUaGUgY29uZmlndXJlIHNjcmlwdCBkaWRuJ3QgY2hlY2sgZm9yIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpIHNvIGl0CiAgd2FzIG5ldmVyIHVzZWQuCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDUpCi0gUmVtb3ZlZCBhbGwgdXNlcyBvZiBzdHJmdGltZSgpIHNpbmNlIGl0IHVzZXMgdGhlIGxvY2FsaXNlZCB2ZXJzaW9uIG9mIHRoZQogIHdlZWsgZGF5IG5hbWVzIGFuZCBtb250aCBuYW1lcyBhbmQgc2VydmVycyBkb24ndCBsaWtlIHRoYXQuCgpEYW5pZWwgKDEwIEZlYnJ1YXJ5IDIwMDUpCi0gTm93IHRoZSB0ZXN0IHNjcmlwdCBkaXNhYmxlcyB2YWxncmluZC10ZXN0aW5nIHdoZW4gdGhlIHRlc3Qgc3VpdGUgcnVucyBpZgogIGxpYmN1cmwgaXMgYnVpbHQgc2hhcmVkLiBPdGhlcndpc2UgdmFsZ3JpbmQgb25seSB0ZXN0cyB0aGUgc2hlbGwgdGhhdCBydW5zCiAgdGhlIHdyYXBwZXItc2NyaXB0IG5hbWVkICdjdXJsJyB0aGF0IGlzIGEgZnJvbnQtZW5kIHRvIGN1cmwgaW4gdGhpcyBjYXNlLgogIFRoaXMgc2hvdWxkIGFsc28gZml4IHRoZSBodWdlIGFtb3VudCBvZiByZXBvcnRzIG9mIGZhbHNlIHBvc2l0aXZlcyB3aGVuCiAgdmFsZ3JpbmQgaGFzIGlkZW50aWZpZWQgbGVha3MgaW4gKGJhKXNoIGFuZCBub3QgaW4gY3VybCBhbmQgcGVvcGxlIHJlcG9ydAogIHRoYXQgYXMgY3VybCBidWdzLiBCdWcgcmVwb3J0ICMxMTE2NjcyIGlzIG9uZSBleGFtcGxlLgoKICBBbHNvLCB0aGUgdmFsZ3JpbmQgcmVwb3J0IHBhcnNlciBoYXMgYmVlbiBhZGFwdGVkIHRvIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lCiAgb2YgdGhlIHNvdXJjZXMgaW4gYSBzdGFjayBzdHJhY2UgaXMgb25lIG9mIChsaWIpY3VybCdzIHNvdXJjZSBmaWxlcyBvcgogIG90aGVyd2lzZSBpdCB3aWxsIG5vdCBjb25zaWRlciB0aGUgcHJvYmxlbSB0byBjb25jZXJuIChsaWIpY3VybC4KCi0gTWFydHkgS3VocnQgc3RyZWFtbGluZWQgdGhlIFZNUyBidWlsZC4KCkRhbmllbCAoOSBGZWJydWFyeSAyMDA1KQotIERhdmlkIEJ5cm9uIGZpeGVkIGhpcyBTU0wgcHJvYmxlbXMsIGluaXRpYWxseSBtZW50aW9uZWQgaGVyZToKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDUtMDEvMDI0MC5odG1sLiBJdCB0dXJuZWQgb3V0IHdlIGRpZG4ndCB1c2UKICBTU0xfcGVuZGluZygpIGFzIHdlIHNob3VsZC4KCi0gQ29udmVydGVkIGxvdHMgb2YgRlRQIGNvZGUgdG8gYSBzdGF0ZW1hY2hpbmUsIHNvIHRoYXQgdGhlIG11bHRpIGludGVyZmFjZQogIGRvZXNuJ3QgYmxvY2sgd2hpbGUgY29tbXVuaWNhdGluZyBjb21tYW5kcy1yZXNwb25zZXMgd2l0aCBhbiBGVFAgc2VydmVyLgoKICBJJ3ZlIGFkZGVkIGEgY29tbWVudCBsaWtlIEJMT0NLSU5HIGluIHRoZSBjb2RlIG9uIGFsbCBzcG90cyBJIGNvdWxkIGZpbmQKICB3aGVyZSB3ZSBzdGlsbCBoYXZlIGJsb2NraW5nIG9wZXJhdGlvbnMuIFdoZW4gd2UgY2hhbmdlIGN1cmxfZWFzeV9wZXJmb3JtKCkKICB0byB1c2UgdGhlIG11bHRpIGludGVyZmFjZSwgd2UnbGwgYWxzbyBiZSBhYmxlIHRvIHNpbXBsaWZ5IHRoZSBjb2RlIHNpbmNlCiAgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSAiaW50ZXJuYWwgaW50ZXJmYWNlIi4KCiAgV2hpbGUgZG9pbmcgdGhpcywgSSd2ZSBub3cgbWFkZSBDVVJMRV9GVFBfQUNDRVNTX0RFTklFRCBzZXBhcmF0ZSBmcm9tIHRoZQogIG5ldyBDVVJMRV9MT0dJTl9ERU5JRUQuIFRoZSBmaXJzdCBvbmUgaXMgbm93IGFjY2VzcyBkZW5pZWQgdG8gYSBmdW5jdGlvbiwKICBsaWtlIGNoYW5naW5nIGRpcmVjdG9yeSBvciByZXRyaWV2aW5nIGEgZmlsZSwgd2hpbGUgdGhlIHNlY29uZCBtZWFucyB0aGF0IHdlCiAgd2VyZSBkZW5pZWQgbG9naW4uCgogIFRoZSBDVlMgdGFnICdiZWZvcmVfZnRwX3N0YXRlbWFjaGluZScgd2FzIHNldCBqdXN0IGJlZm9yZSB0aGlzIHdlbnQgaW4sIGluCiAgY2FzZSBvZiBmdXR1cmUgbmVlZC4KCi0gR2lzbGUgbWFkZSB0aGUgRElDVCBjb2RlIHNlbmQgQ1JMRiBhbmQgbm90IGp1c3QgTEYgYXMgdGhlIHNwZWMgc2F5cyBzby4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDA1KQotIEdpc2xlIGZpeGVkIHByb2JsZW1zIHdoZW4gbGliY3VybCBydW5zIG91dCBvZiBtZW1vcnksIGFuZCB3b3JrZWQgb24gbWFraW5nCiAgc3VyZSB0aGUgcHJvcGVyIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQgZm9yIHRob3NlIG9jY2F0aW9ucy4KCkRhbmllbCAoNyBGZWJydWFyeSAyMDA1KQotIE1hcnVrbyBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBpbmZsYXRlIGRlY29tcHJlc3NpbmcgZXhhY3RseSA2NEsKICBjb250ZW50cy4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDA1KQotIEVyaWMgVmVyZ25hdWQgZm91bmQgYSB1c2Ugb2YgYW4gdW5pbml0aWFsaXNlZCB2YXJpYWJsZSBpbiB0aGUgZnRwIHdoZW4gZG9pbmcKICBQT1JUIG9uIGlwdjYtZW5hYmxlZCBob3N0cy4KCi0gRGF2aWQgQnlyb24gcG9pbnRlZCBvdXQgd2UgY291bGQgdXNlIEJVRlNJWkUgdG8gcmVhZCBkYXRhIChpbgogIGxpYi90cmFuc2Zlci5jKSBpbnN0ZWFkIG9mIHVzaW5nIEJVRlNJWkUgLTEuCgpWZXJzaW9uIDcuMTMuMCAoMSBGZWJydWFyeSAyMDA1KQoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDUpCi0gQWRkZWQgTGFycyBOaWxzc29uJ3MgaHRtbHRpdGxlLmNjIGV4YW1wbGUKCkRhbmllbCAoMzAgSmFudWFyeSAyMDA1KQotIEZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCB0aGUgRE8gb3BlcmF0aW9uCiAgZmFpbGVkIChhcyBpbiB0ZXN0IGNhc2UgMjA1KS4KCi0gRml4ZWQgYSB2YWxncmluZCB3YXJuaW5nIGZvciBmaWxlOi8vIG9wZXJhdGlvbnMuCgotIEZpeGVkIGEgdmFsZ3JpbmQgcmVwb3J0IGluIHRoZSB1cmwgZ2xvYmJpbmcgY29kZSBmb3IgdGhlIGN1cmwgY29tbWFuZCBsaW5lCiAgdG9vbC4KCi0gQnVnZml4ZWQgdGhlIHBhcnNlciB0aGF0IHNjYW5zIHRoZSB2YWxncmluZCByZXBvcnQgb3V0cHV0cyAoaW4gcnVudGVzdHMucGwpLgogIEkgbm90aWNlZCB0aGF0IGl0IHByZXZpb3VzbHkgZGlkbid0IGRldGVjdCBhbmQgcmVwb3J0IHRoZSAiQ29uZGl0aW9uYWwganVtcAogIG9yIG1vdmUgZGVwZW5kcyBvbiB1bmluaXRpYWxpc2VkIHZhbHVlKHMpIiBlcnJvci4gV2hlbiBJIGZpeGVkIHRoaXMsIEkKICBjYXVnaHQgYSBmZXcgY3VybCBidWdzIHdpdGggaXQuIEFuZCB0aGVuIEkgaGFkIHRvIHNwZW5kIHRpbWUgdG8gbWFrZSB0aGUKICB0ZXN0IHN1aXRlIElHTk9SRSB0aGVzZSBlcnJvcnMgd2hlbiBPcGVuU1NMIGlzIHVzZWQgc2luY2UgaXQgcHJvZHVjZSBtYXNzaXZlCiAgYW1vdW50cyBvZiB2YWxncmluZCB3YXJuaW5ncyAoYnV0IG9ubHkgb2YgdGhlICJDb25kaXRpb25hbC4uLiIga2luZCBpdAogIHNlZW1zKS4gU28sIGlmIGEgdGVzdCB0aGF0IHJlcXVpcmVzIFNTTCBpcyBydW4sIGl0IGlnbm9yZXMgdGhlCiAgIkNvbmRpdGlvbmFsLi4uIiBlcnJvcnMsIGFuZCB5b3UnbGwgZ2V0IGEgInZhbGdyaW5kIFBBUlRJQUwiIG91dHB1dCBpbnN0ZWFkCiAgb2YgInZhbGdyaW5kIE9LIi4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDA1KQotIFVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UsIGFuZCBkb2luZyBhIHJlcXVzdGVkIGEgcmUtdXNlZCBjb25uZWN0aW9uIHRoYXQKICBnZXRzIGNsb3NlZCBqdXN0IGFmdGVyIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQgZmFpbGVkIGFuZCBkaWQgbm90IHJlLWlzc3VlCiAgYSByZXF1ZXN0IG9uIGEgZnJlc2ggcmVjb25uZWN0IGxpa2UgdGhlIGVhc3kgaW50ZXJmYWNlIGRpZC4gTm93IGl0IGRvZXMhCgotIERlZmluZSBDVVJMX01VTFRJRUFTWSB3aGVuIGJ1aWxkaW5nIGxpYmN1cmwgKGxpYi9lYXN5LmMgdG8gYmUgZXhhY3QpLCB0byB1c2UKICBteSBuZXcgY3VybF9lYXN5X3BlcmZvcm0oKSB0aGF0IHVzZXMgdGhlIG11bHRpIGludGVyZmFjZSB0byBydW4gdGhlCiAgcmVxdWVzdC4gSXQgaXMgYSBncmVhdCB0ZXN0YmVkIGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBJIGJlbGlldmUgd2UKICBzaGFsbCBkbyBpdCB0aGlzIHdheSBmb3IgcmVhbCBpbiB0aGUgZnV0dXJlIHdoZW4gd2UgaGF2ZSBhIHN1Y2Nlc3NvciB0bwogIGN1cmxfbXVsdGlfZmRzZXQoKS4gSSd2ZSB1c2VkIHRoaXMgYXBwcm9hY2ggdG8gZGV0ZWN0IGFuZCBmaXggc2V2ZXJhbCBvZiB0aGUKICByZWNlbnQgbXVsdGktaW50ZXJmYWNlcyBpc3N1ZXMuCgotIEFkanVzdGVkIHRoZSBLTk9XTl9CVUdTICMxNyBmaXggYSBiaXQgbW9yZSBzaW5jZSB0aGUgRlRQIGNvZGUgYWxzbyBkaWQgc29tZQogIGJhZCBhc3N1bXB0aW9ucy4KCi0gbXVsdGkgaW50ZXJmYWNlOiB3aGVuIGEgcmVxdWVzdCBpcyBkZW5pZWQgZHVlIHRvICJNYXhpbXVtIHJlZGlyZWN0cwogIGZvbGxvd2VkIiBsaWJjdXJsIGxlYWtlZCB0aGUgbGFzdCBMb2NhdGlvbjogVVJMLgoKLSBDb25uZWN0IGZhaWx1cmVzIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSB3YXMgb2Z0ZW4gcmV0dXJuZWQgYXMgImNvbm5lY3QoKQogIHRpbWVkIG91dCIgZXZlbiB0aG91Z2ggdGhlIHJlYXNvbiB3YXMgZGlmZmVyZW50LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDUpCi0gS05PV05fQlVHUyAjMTcgZml4ZWQuIEEgRE5TIGNhY2hlIGVudHJ5IG1heSBub3QgcmVtYWluIGxvY2tlZCBiZXR3ZWVuIHR3bwogIGN1cmxfZWFzeV9wZXJmb3JtKCkgaW52b2tlcy4gSXQgd2FzIHByZXZpb3VzbHkgdW5sb2NrZWQgYXQgZGlzY29ubmVjdCwgd2hpY2gKICBjb3VsZCBtZWFuIHRoYXQgaXQgcmVtYWluZWQgbG9ja2VkIGJldHdlZW4gbXVsdGlwbGUgdHJhbnNmZXJzLiBUaGUgRE5TIGNhY2hlCiAgbWF5IG5vdCBsaXZlIGFzIGxvbmcgYXMgdGhlIGNvbm5lY3Rpb24gY2FjaGUgZG9lcywgYXMgdGhleSBhcmUgc2VwYXJhdGUuCgogIFRvIGRlYWwgd2l0aCB0aGUgbGFjayBvZiBETlMgKGhvc3QgYWRkcmVzcykgZGF0YSBhdmFpbGFiaWxpdHkgaW4gcmUtdXNlZAogIGNvbm5lY3Rpb25zLCBsaWJjdXJsIG5vdyBrZWVwcyBhIGNvcHkgb2YgdGhlIElQIGFkcmVzcyBhcyBhIHN0cmluZywgdG8gYmUKICBhYmxlIHRvIHNob3cgaXQgZXZlbiBvbiBzdWJzZXF1ZW50IHJlcXVlc3RzIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24uCgogIFRoZSBwcm9ibGVtIGNvdWxkIGJlIG1hZGUgdG8gYXBwZWFyIHdpdGggdGhpcyBzdHVudDoKCiAgMS4gY3JlYXRlIGEgbXVsdGkgaGFuZGxlCiAgMi4gYWRkIGFuIGVhc3kgaGFuZGxlCiAgMy4gZmV0Y2ggYSBVUkwgdGhhdCBpcyBwZXJzaXN0ZW50IChsZWF2ZXMgdGhlIGNvbm5lY3Rpb24gYWxpdmUpCiAgNC4gcmVtb3ZlIHRoZSBlYXN5IGhhbmRsZSBmcm9tIHRoZSBtdWx0aQogIDUuIGtpbGwgdGhlIG11bHRpIGhhbmRsZQogIDYuIGNyZWF0ZSBhIG11bHRpIGhhbmRsZQogIDcuIGFkZCB0aGUgc2FtZSBlYXN5IGhhbmRsZSB0byB0aGUgbmV3IG11bHRpIGhhbmRsZQogIDguIGZldGNoIGEgVVJMIGZyb20gdGhlIHNhbWUgc2VydmVyIGFzIGJlZm9yZSAocmUtdXNpbmcgdGhlIGNvbm5lY3Rpb24pCgotIFN0ZXBoZW4gTW9yZSBwb2ludGVkIG91dCB0aGF0IENVUkxPUFRfRlRQUE9SVCBhbmQgdGhlIC1QIG9wdGlvbiBkaWRuJ3Qgd29yawogIHdoZW4gYnVpbHQgaXB2Ni1lbmFibGVkLiBJJ3ZlIG5vdyBtYWRlIGEgZml4IGZvciBpdC4gV3JpdGluZyB0ZXN0IGNhc2VzIGZvcgogIGN1c3RvbSBwb3J0IGhvc3RzIHR1cm5lZCB0b28gdHJpY2t5IHNvIHVuZm9ydHVuYXRlbHkgdGhlcmUncyBub25lLgoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDUpCi0gSWFuIEZvcmQgYXNrZWQgYWJvdXQgc3VwcG9ydCBmb3IgdGhlIEZUUCBjb21tYW5kIEFDQ1QsIGFuZCBJIGRpc2NvdmVyZWQgaXQKICBpcyBwcmVzZW50IGluIFJGQzk1OS4uLiBzbyBub3cgKGxpYiljdXJsIHN1cHBvcnRzIGl0IGFzIHdlbGwuIC0tZnRwLWFjY291bnQKICBhbmQgQ1VSTE9QVF9GVFBfQUNDT1VOVCBzZXQgdGhlIGFjY291bnQgc3RyaW5nLiAoVGhlIHNlcnZlciBtYXkgYXNrIGZvciBhbgogIGFjY291bnQgc3RyaW5nIGFmdGVyIFBBU1MgaGF2ZSBiZWVuIHNlbnQgYXdheS4gVGhlIGNsaWVudCByZXNwb25kcwogIHdpdGggIkFDQ1QgW2FjY291bnQgc3RyaW5nXSIuKSBBZGRlZCB0ZXN0IGNhc2UgMjI4IGFuZCAyMjkgdG8gdmVyaWZ5IHRoZQogIGZ1bmN0aW9uYWxpdHkuIFVwZGF0ZWQgdGhlIHRlc3QgRlRQIHNlcnZlciB0byBzdXBwb3J0IEFDQ1Qgc29tZXdoYXQuCgotIERhdmlkIFNoYXcgY29udHJpYnV0ZWQgYSBmYWlybHkgY29tcGxldGUgYW5kIGRldGFpbGVkIGF1dG9jb25mIHRlc3QgeW91IGNhbgogIHVzZSB0byBkZXRlY3QgbGliY3VybCBhbmQgc2V0dXAgdmFyaWFibGVzIGZvciB0aGUgcHJvdG9jb2xzIHRoZSBpbnN0YWxsZWQKICBsaWJjdXJsIHN1cHBvcnRzOiBkb2NzL2xpYmN1cmwvbGliY3VybC5tNAoKRGFuaWVsICgyMSBKYW51YXJ5IDIwMDUpCi0gTWFqb3IgRlRQIHRoaXJkIHBhcnR5IHRyYW5zZmVyIG92ZXJoYXVsLgoKICBUaGVzZSBmb3VyIG9wdGlvbnMgYXJlIG5vdyBvYnNvbGV0ZTogQ1VSTE9QVF9TT1VSQ0VfSE9TVCwKICBDVVJMT1BUX1NPVVJDRV9QQVRILCBDVVJMT1BUX1NPVVJDRV9QT1JUICh0aGlzIG9wdGlvbiBkaWRuJ3Qgd29yayBiZWZvcmUpCiAgYW5kIENVUkxPUFRfUEFTVl9IT1NULgoKICBUaGVzZSB0d28gb3B0aW9ucyBhcmUgYWRkZWQ6IENVUkxPUFRfU09VUkNFX1VSTCBhbmQgQ1VSTE9QVF9TT1VSQ0VfUVVPVEUuCgogIFRoZSB0YXJnZXQtc2lkZSBkaWRuJ3QgdXNlIHRoZSBwcm9wZXIgcGF0aCB3aXRoIFJFVFIsIGFuZCB0aHVzIHRoaXMgb25seQogIHdvcmtlZCBjb3JyZWN0bHkgaW4gdGhlIGxvZ2luIHBhdGggKGkuZSB3aXRob3V0IGRvaW5nIGFueSBDV0QpLiBUaGUgc291cmNlLQogIHNpZGUgc3RpbGwgdXNlcyBhIHdyb25nIHBhdGgsIGJ1dCB0aGUgZml4IGZvciB0aGlzIHdpbGwgbmVlZCB0byB3YWl0LiBWZXJpZnkKICB0aGUgZmxhdyBieSB1c2luZyBhIHNvdXJjZSBVUkwgd2l0aCBpbmNsdWRlZCAlWFgtY29kZXMuCgogIE1hZGUgQ1VSTE9QVF9GVFBQT1JUIGNvbnRyb2wgd2VhdGhlciB0aGUgdGFyZ2V0IG9wZXJhdGlvbiBzaG91bGQgdXNlIFBPUlQKICAob3Igbm90KS4gVGhlIG90aGVyIHNpZGUgdGh1cyB1c2VzIHBhc3NpdmUgKFBBU1YpIG1vZGUuCgogIFVwZGF0ZWQgdGhlIGZ0cDNyZHBhcnR5LmMgZXhhbXBsZSBzb3VyY2UgdG8gdXNlIHRoZSB1cGRhdGVkIG9wdGlvbnMuCgogIEFkZGVkIHN1cHBvcnQgZm9yIGEgc2Vjb25kIEZUUCBzZXJ2ZXIgaW4gdGhlIHRlc3Qgc3VpdGUuIE5hbWVkLi4uIGZ0cDIuCiAgQWRkZWQgdGVzdCBjYXNlcyAyMzAsIDIzMSBhbmQgMjMyIGFzIGEgZmV3IGZpcnN0IGJhc2ljIHRlc3RzIG9mIHZlcnkgc2ltcGxlCiAgM3JkIHBhcnR5IHRyYW5zZmVycy4KCiAgQ2hhbmdlZCB0aGUgZGVidWcgb3V0cHV0IHRvIGluY2x1ZGUgJ3RhcmdldCcgYW5kICdzb3VyY2UnIHdoZW4gYSAzcmQgcGFydHkKICBpcyBiZWluZyBtYWRlLCB0byBtYWtlIGl0IGNsZWFyZXIgd2hhdCBjb21tYW5kcy9yZXNwb25zZXMgY2FtZSBvbiB3aGF0CiAgY29ubmVjdGlvbi4KCiAgQWRkZWQgdGhyZWUgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zOiAtLTNwLXVybCwgLS0zcC11c2VyIGFuZCAtLTNwLXF1b3RlLgoKICBEb2N1bWVudGVkIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgdGhlIGN1cmxfZWFzeV9zZXRvcHQgb3B0aW9ucyByZWxhdGVkCiAgdG8gdGhpcmQgcGFydHkgdHJhbnNmZXJzLgoKICAoVGVtcG9yYXJpbHkpIGRpc2FibGVkIHRoZSBhYmlsaXR5IHRvIHJlLXVzZSBhbiBleGlzdGluZyBjb25uZWN0aW9uIGZvciB0aGUKICBzb3VyY2UgY29ubmVjdGlvbi4gVGhpcyBpcyBiZWNhdXNlIGl0IG5lZWRzIHRvIGZvcmNlIGEgbmV3IGluIGNhc2UgdGhlCiAgc291cmNlIGFuZCB0YXJnZXQgaXMgdGhlIHNhbWUgaG9zdCwgYW5kIHRoZSBob3N0IG5hbWUgY2hlY2sgaXMgdHJpY2tpZXIgbm93CiAgd2hlbiB0aGUgc291cmNlIGlzIGlkZW50aWZpZWQgd2l0aCBhIGZ1bGwgVVJMIGluc3RlYWQgb2YgYSBwbGFpbiBob3N0IG5hbWUKICBsaWtlIGJlZm9yZS4KCiAgVE9ETyAoc2hvcnQtdGVybSkgZm9yIDNyZCBwYXJ0eSB0cmFuc2ZlcnM6IHF1b3RlIHN1cHBvcnQuIFRoZSBvcHRpb25zIGFyZQogIHRoZXJlLCB3ZSBuZWVkIHRvIGFkZCB0ZXN0IGNhc2VzIHRvIHZlcmlmeSB0aGVpciBmdW5jdGlvbmFsaXR5LgoKICBUT0RPIChsb25nLXRlcm0pIGZvciAzcmQgcGFydHkgdHJhbnNmZXJzOiBJUHY2IHN1cHBvcnQgKEVQUlQgYW5kIEVQU1YgZXRjKQogIGFuZCBTU0wvVFNMIHN1cHBvcnQuCgpEYW5pZWwgKDIwIEphbnVhcnkgMjAwNSkKLSBQaGlsaXBwZSBIYW1lYXUgZm91bmQgb3V0IHRoYXQgLVEgIitbY29tbWFuZF0iIGRpZG4ndCB3b3JrLCBhbHRob3VnaCBzb21lCiAgY29kZSB3YXMgd3JpdHRlbiBmb3IgaXQuIEkgZml4ZWQgYW5kIGFkZGVkIHRlc3QgY2FzZSAyMjcgdG8gdmVyaWZ5IGl0LgogIFRoZSBjdXJsLjEgbWFuIHBhZ2UgZGlkbid0IG1lbnRpb24gdGhlICcrJyBzbyBJIGFkZGVkIGl0LgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDUpCi0gU3RlcGhhbiBCZXJnbWFubiBtYWRlIGxpYmN1cmwgcmV0dXJuIENVUkxFX1VSTF9NQUxGT1JNQVQgaWYgYW4gRlRQIFVSTAogIGNvbnRhaW5zICUwYSBvciAlMGQgaW4gdGhlIHVzZXIsIHBhc3N3b3JkIG9yIENXRCBwYXJ0cy4gKEEgZnV0dXJlIGZpeCB3b3VsZAogIGluY2x1ZGUgZG9pbmcgaXQgZm9yICUwMCBhcyB3ZWxsIC0gc2VlIEtOT1dOX0JVR1MgZm9yIGRldGFpbHMuKSBUZXN0IGNhc2UKICAyMjUgYW5kIDIyNiB3ZXJlIGFkZGVkIHRvIHZlcmlmeSB0aGlzCgotIFN0ZXBoYW4gQmVyZ21hbm4gcG9pbnRlZCBvdXQgdHdvIGZsYXdzIGluIGxpYmN1cmwgYnVpbHQgd2l0aCBIVFRQIGRpc2FibGVkOgoKICAxKSB0aGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzdGlsbCByZWFkIGFuZCB1c2VkIHRvIHNldCBIVFRQIHByb3h5CgogIDIpIHlvdSBjb3VsZG4ndCBkaXNhYmxlIGh0dHAgcHJveHkgd2l0aCBDVVJMT1BUX1BST1hZIChzaW5jZSB0aGUgb3B0aW9uIHdhcwogICAgIGRpc2FibGVkKS4gVGhpcyBpcyBpbXBvcnRhbnQgc2luY2UgYXBwcyBtYXkgd2FudCB0byBkaXNhYmxlIEhUVFAgcHJveHkKICAgICB3aXRob3V0IGFjdHVhbGx5IGtub3dpbmcgaWYgbGliY3VybCB3YXMgYnVpbHQgdG8gZGlzYWJsZSBIVFRQIG9yIG5vdC4KCiAgQmFzZWQgb24gU3RlcGhhbidzIHBhdGNoLCBib3RoIHRoZXNlIGlzc3VlcyBzaG91bGQgbm93IGJlIGZpeGVkLgoKRGFuaWVsICgxOCBKYW51YXJ5IDIwMDUpCi0gQ29keSBKb25lcycgZW5oYW5jZWQgdmVyc2lvbiBvZiBTYW11ZWwgRO1heiBHYXJj7WEncyBNU1ZDIG1ha2VmaWxlIHBhdGNoIHdhcwogIGFwcGxpZWQuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNSkKLSBBbGV4IGFrYSBXaW5kRWFnbGUgcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGRvaW5nICJjdXJsIC12IGRpY3Rpb25hcnkuY29tIiwgY3VybAogIGFzc3VtZWQgdGhpcyB1c2VkIHRoZSBESUNUIHByb3RvY29sLiBXaGlsZSBndWVzc2luZyBwcm90b2NvbHMgd2lsbCByZW1haW4KICBmdXp6eSwgSSd2ZSBub3cgbWFkZSBzdXJlIHRoYXQgdGhlIGhvc3QgbmFtZXMgbXVzdCBzdGFydCB3aXRoICJbcHJvdG9jb2xdLiIKICBmb3IgdGhlbSB0byBiZSBhIHZhbGlkIGd1ZXNzYWJsZSBuYW1lLiBJIGFsc28gcmVtb3ZlZCAiaHR0cHMiIGFzIGEgcHJlZml4CiAgdGhhdCBpbmRpY2F0ZXMgSFRUUFMsIHNpbmNlIHdlIGhhcmRseSBldmVyIHNlZSBhbnkgaG9zdCBuYW1lcyB1c2luZyB0aGF0LgoKRGFuaWVsICgxMyBKYW51YXJ5IDIwMDUpCi0gSW5zcGlyZWQgYnkgTWFydGlqbiBLb3N0ZXIncyBwYXRjaCBhbmQgZXhhbXBsZSBzb3VyY2UgYXQKICBodHRwOi8vd3d3LmdyZWVuaGlsbHMuY28udWsvbWFrL2dlbnRvby9jdXJsLWVpbnRyLWJ1Zy5jLCBJIG5vdyBtYWRlIHRoZQogIHNlbGVjdCgpIGFuZCBwb2xsKCkgY2FsbHMgcHJvcGVybHkgbG9vcCBpZiB0aGV5IHJldHVybiAtMSBhbmQgZXJybm8gaXMKICBFSU5UUi4gZ2xpYmMgZG9jcyBmb3IgdGhpcyBpcyBmb3VuZCBoZXJlOgogIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJjL21hbnVhbC9odG1sX25vZGUvSW50ZXJydXB0ZWQtUHJpbWl0aXZlcy5odG1sCgogIFRoaXMgbGFzdCBsaW5rIHNheXMgQlNEIGRvZXNuJ3QgaGF2ZSB0aGlzICJlZmZlY3QiLiBXaWxsIHRoZXJlIGJlIGEgcHJvYmxlbQogIGlmIHdlIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5PwoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDUpCi0gRGFuIFRvcm9wIGNsZWFuZWQgdXAgYSBmZXcgbm8gbG9uZ2VyIHVzZWQgdmFyaWFibGVzIGZyb20gRGF2aWQgUGhpbGxpcHMnCiAgc2VsZWN0KCkgb3ZlcmhhdWwgZml4LgoKLSBDeXJpbGwgT3N0ZXJ3YWxkZXIgcG9zdGVkIGEgZGV0YWlsZWQgYW5hbHlzaXMgYWJvdXQgYSBidWcgdGhhdCBvY2N1cnMgd2hlbgogIHVzaW5nIGEgY3VzdG9tIEhvc3Q6IGhlYWRlciBhbmQgY3VybCBmYWlscyB0byBzZW5kIGEgcmVxdWVzdCBvbiBhIHJlLXVzZWQKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gYW5kIHRodXMgY3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGFuZCByZXNlbmRzIGl0LiBJdAogIHRoZW4gc2VudCB0d28gSG9zdDogaGVhZGVycy4gQ3lyaWxsJ3MgYW5hbHlzaXMgd2FzIHBvc3RlZCBoZXJlOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9hcmNoaXZlLTIwMDUtMDEvMDAyMi5odG1sCgotIEJydWNlIE1pdGNoZW5lciBpZGVudGlmaWVkIChidWcgcmVwb3J0ICMxMDk5NjQwKSB0aGUgbmV2ZXItZW5kaW5nIFNPQ0tTNQogIHByb2JsZW0gd2l0aCB0aGUgdmVyc2lvbiBieXRlIGFuZCB0aGUgY2hlY2sgZm9yIGJhZCB2ZXJzaW9ucy4gQnJ1Y2UgaGFzIGxvdHMKICBvZiBjbHVlcyBvbiB0aGlzLCBhbmQgYmFzZWQgb24gaGlzIHN1Z2dlc3Rpb24gSSd2ZSBub3cgcmVtb3ZlZCB0aGUgY2hlY2sgb2YKICB0aGF0IGJ5dGUgc2luY2UgaXQgc2VlbXMgdG8gYmUgYWJsZSB0byBjb250YWluIDEgb3IgNS4KCkRhbmllbCAoMTAgSmFudWFyeSAyMDA1KQotIFBhdmVsIE9yZWhvdiByZXBvcnRlZCBtZW1vcnkgcHJvYmxlbXMgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGluIGJ1ZyByZXBvcnQKICAjMTA5ODg0My4gSW4gc2hvcnQsIGEgc2hhcmVkIEROUyBjYWNoZSB3YXMgc2V0dXAgZm9yIGEgbXVsdGkgaGFuZGxlIGFuZCB3aGVuCiAgdGhlIHNoYXJlZCBjYWNoZSB3YXMgZGVsZXRlZCBiZWZvcmUgdGhlIGluZGl2aWR1YWwgZWFzeSBoYW5kbGVzLCB0aGUgbGF0dGVyCiAgY2xlYW51cHMgY2F1c2VkIHJlYWQvd3JpdGVzIHRvIGFscmVhZHkgZnJlZWQgbWVtb3J5LgoKLSBIemhpanVuIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIFNTTCBjZXJ0aWZpY2F0ZSBjb2RlLCB0aGF0IGxlYWtlZCB0aGUKICByZW1vdGUgY2VydGlmaWNhdGUgbmFtZSB3aGVuIGl0IGRpZG4ndCBtYXRjaCB0aGUgdXNlZCBob3N0IG5hbWUuCgpHaXNsZSAoOCBKYW51YXJ5IDIwMDUpCi0gQWRkZWQgTWFrZWZpbGUuV2F0Y29tIGZpbGVzIChzcmMvbGliKS4gVXBkYXRlZCBNYWtlZmlsZS5kaXN0LgoKRGFuaWVsICg3IEphbnVhcnkgMjAwNSkKLSBJbXByb3ZlZCB0aGUgdGVzdCBzY3JpcHQncyB2YWxncmluZCBsb2cgcGFyc2VyIHRvIGFjdHVhbGx5IHdvcmshIEFsc28gYWRkZWQKICB0aGUgYWJpbGl0eSB0byBkaXNhYmxlIHRoZSBsb2cgc2Nhbm5lciBmb3Igc3BlY2lmaWMgdGVzdCBjYXNlcy4gVGVzdCBjYXNlCiAgNTA5IHJlc3VsdHMgaW4gbnVtZXJvdXMgcHJvYmxlbXMgYW5kIGxlYWtzIGluIE9wZW5TU0wgYW5kIGhhcyB0byBnZXQgaXQKICBkaXNhYmxlZC4KCkRhbmllbCAoNiBKYW51YXJ5IDIwMDUpCi0gRml4ZWQgYSBzaW5nbGUtYnl0ZSByZWFkIG91dCBvZiBib3VuZHMgaW4gdGVzdCBjYXNlIDM5IGluIHRoZSBjdXJsIHRvb2wgY29kZQogIChpLmUgbm90IGluIHRoZSBsaWJyYXJ5KS4KCi0gQnVnIHJlcG9ydCAjMTA5NzAxOSBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aGVuIGRvaW5nIC1kICJkYXRhIiB3aXRoIC1HIGFuZAogIHNlbmRpbmcgaXQgdG8gdHdvIFVSTHMgd2l0aCB7fS4gQWRkZWQgdGVzdCAxOTkgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA1KQotIE1hcnR5IEt1aHJ0IGFkanVzdGVkIGEgVk1TIGJ1aWxkIHNjcmlwdCBzbGlnaHRseQoKLSBLYWkgU29tbWVyZmVsZCBhbmQgR2lzbGUgVmFuZW0gZml4ZWQgbGliY3VybCB0byBidWlsZCB3aXRoIElQdjYgc3VwcG9ydCBvbgogIFdpbjIwMDAuCgpEYW5pZWwgKDIgSmFudWFyeSAyMDA1KQotIEFsZXggTmVibGV0dCB1cGRhdGVkIHRoZSBNU1ZDIG1ha2VmaWxlcyBzbGlnaHRseS4K