CiAgICAgICAgICAgICAgICAgICAgU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkKICAgICAgICAgICAgICAgICAgIApJTlRST0RVQ1RJT04KClRoZSBTY2F0dGVybGlzdCBDcnlwdG8gQVBJIHRha2VzIHBhZ2UgdmVjdG9ycyAoc2NhdHRlcmxpc3RzKSBhcwphcmd1bWVudHMsIGFuZCB3b3JrcyBkaXJlY3RseSBvbiBwYWdlcy4gIEluIHNvbWUgY2FzZXMgKGUuZy4gRUNCCm1vZGUgY2lwaGVycyksIHRoaXMgd2lsbCBhbGxvdyBmb3IgcGFnZXMgdG8gYmUgZW5jcnlwdGVkIGluLXBsYWNlCndpdGggbm8gY29weWluZy4KCk9uZSBvZiB0aGUgaW5pdGlhbCBnb2FscyBvZiB0aGlzIGRlc2lnbiB3YXMgdG8gcmVhZGlseSBzdXBwb3J0IElQc2VjLApzbyB0aGF0IHByb2Nlc3NpbmcgY2FuIGJlIGFwcGxpZWQgdG8gcGFnZWQgc2tiJ3Mgd2l0aG91dCB0aGUgbmVlZApmb3IgbGluZWFyaXphdGlvbi4KCgpERVRBSUxTCgpBdCB0aGUgbG93ZXN0IGxldmVsIGFyZSBhbGdvcml0aG1zLCB3aGljaCByZWdpc3RlciBkeW5hbWljYWxseSB3aXRoIHRoZQpBUEkuCgonVHJhbnNmb3JtcycgYXJlIHVzZXItaW5zdGFudGlhdGVkIG9iamVjdHMsIHdoaWNoIG1haW50YWluIHN0YXRlLCBoYW5kbGUgYWxsCm9mIHRoZSBpbXBsZW1lbnRhdGlvbiBsb2dpYyAoZS5nLiBtYW5pcHVsYXRpbmcgcGFnZSB2ZWN0b3JzKSwgcHJvdmlkZSBhbiAKYWJzdHJhY3Rpb24gdG8gdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtcywgYW5kIGhhbmRsZSBjb21tb24gbG9naWNhbCAKb3BlcmF0aW9ucyAoZS5nLiBjaXBoZXIgbW9kZXMsIEhNQUMgZm9yIGRpZ2VzdHMpLiAgSG93ZXZlciwgYXQgdGhlIHVzZXIgCmxldmVsIHRoZXkgYXJlIHZlcnkgc2ltcGxlLgoKQ29uY2VwdHVhbGx5LCB0aGUgQVBJIGxheWVyaW5nIGxvb2tzIGxpa2UgdGhpczoKCiAgW3RyYW5zZm9ybSBhcGldICAodXNlciBpbnRlcmZhY2UpCiAgW3RyYW5zZm9ybSBvcHNdICAocGVyLXR5cGUgbG9naWMgZ2x1ZSBlLmcuIGNpcGhlci5jLCBkaWdlc3QuYykKICBbYWxnb3JpdGhtIGFwaV0gIChmb3IgcmVnaXN0ZXJpbmcgYWxnb3JpdGhtcykKICAKVGhlIGlkZWEgaXMgdG8gbWFrZSB0aGUgdXNlciBpbnRlcmZhY2UgYW5kIGFsZ29yaXRobSByZWdpc3RyYXRpb24gQVBJCnZlcnkgc2ltcGxlLCB3aGlsZSBoaWRpbmcgdGhlIGNvcmUgbG9naWMgZnJvbSBib3RoLiAgTWFueSBnb29kIGlkZWFzCmZyb20gZXhpc3RpbmcgQVBJcyBzdWNoIGFzIENyeXB0b2FwaSBhbmQgTmV0dGxlIGhhdmUgYmVlbiBhZGFwdGVkIGZvciB0aGlzLgoKVGhlIEFQSSBjdXJyZW50bHkgc3VwcG9ydHMgdGhyZWUgdHlwZXMgb2YgdHJhbnNmb3JtczogQ2lwaGVycywgRGlnZXN0cyBhbmQKQ29tcHJlc3NvcnMuICBUaGUgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBlc3BlY2lhbGx5IHNlZW0gdG8gYmUgcGVyZm9ybWluZwp2ZXJ5IHdlbGwgc28gZmFyLgoKU3VwcG9ydCBmb3IgaGFyZHdhcmUgY3J5cHRvIGRldmljZXMgdmlhIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UgaXMKdW5kZXIgZGV2ZWxvcG1lbnQuCgpIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBBUEk6CgoJI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgoJCglzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CgljaGFyIHJlc3VsdFsxMjhdOwoJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKCQoJdGZtID0gY3J5cHRvX2FsbG9jX3RmbSgibWQ1IiwgMCk7CglpZiAodGZtID09IE5VTEwpCgkJZmFpbCgpOwoJCQoJLyogLi4uIHNldCB1cCB0aGUgc2NhdHRlcmxpc3RzIC4uLiAqLwoJCgljcnlwdG9fZGlnZXN0X2luaXQodGZtKTsKCWNyeXB0b19kaWdlc3RfdXBkYXRlKHRmbSwgJnNnLCAyKTsKCWNyeXB0b19kaWdlc3RfZmluYWwodGZtLCByZXN1bHQpOwoJCgljcnlwdG9fZnJlZV90Zm0odGZtKTsKCiAgICAKTWFueSByZWFsIGV4YW1wbGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIHJlZ3Jlc3Npb24gdGVzdCBtb2R1bGUgKHRjcnlwdC5jKS4KCgpDT05GSUdVUkFUSU9OIE5PVEVTCgpBcyBUcmlwbGUgREVTIGlzIHBhcnQgb2YgdGhlIERFUyBtb2R1bGUsIGZvciB0aG9zZSB1c2luZyBtb2R1bGFyIGJ1aWxkcywKYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byAvZXRjL21vZHByb2JlLmNvbmY6CgogIGFsaWFzIGRlczNfZWRlIGRlcwoKVGhlIE51bGwgYWxnb3JpdGhtcyByZXNpZGUgaW4gdGhlIGNyeXB0b19udWxsIG1vZHVsZSwgc28gdGhlc2UgbGluZXMKc2hvdWxkIGFsc28gYmUgYWRkZWQ6CgogIGFsaWFzIGNpcGhlcl9udWxsIGNyeXB0b19udWxsCiAgYWxpYXMgZGlnZXN0X251bGwgY3J5cHRvX251bGwKICBhbGlhcyBjb21wcmVzc19udWxsIGNyeXB0b19udWxsCgpUaGUgU0hBMzg0IGFsZ29yaXRobSBzaGFyZXMgY29kZSB3aXRoaW4gdGhlIFNIQTUxMiBtb2R1bGUsIHNvIHlvdSdsbAphbHNvIG5lZWQ6CiAgYWxpYXMgc2hhMzg0IHNoYTUxMgoKCkRFVkVMT1BFUiBOT1RFUwoKVHJhbnNmb3JtcyBtYXkgb25seSBiZSBhbGxvY2F0ZWQgaW4gdXNlciBjb250ZXh0LCBhbmQgY3J5cHRvZ3JhcGhpYwptZXRob2RzIG1heSBvbmx5IGJlIGNhbGxlZCBmcm9tIHNvZnRpcnEgYW5kIHVzZXIgY29udGV4dHMuCgpXaGVuIHVzaW5nIHRoZSBBUEkgZm9yIGNpcGhlcnMsIHBlcmZvcm1hbmNlIHdpbGwgYmUgb3B0aW1hbCBpZiBlYWNoCnNjYXR0ZXJsaXN0IGNvbnRhaW5zIGRhdGEgd2hpY2ggaXMgYSBtdWx0aXBsZSBvZiB0aGUgY2lwaGVyJ3MgYmxvY2sKc2l6ZSAodHlwaWNhbGx5IDggYnl0ZXMpLiAgVGhpcyBwcmV2ZW50cyBoYXZpbmcgdG8gZG8gYW55IGNvcHlpbmcKYWNyb3NzIG5vbi1hbGlnbmVkIHBhZ2UgZnJhZ21lbnQgYm91bmRhcmllcy4KCgpBRERJTkcgTkVXIEFMR09SSVRITVMKCldoZW4gc3VibWl0dGluZyBhIG5ldyBhbGdvcml0aG0gZm9yIGluY2x1c2lvbiwgYSBtYW5kYXRvcnkgcmVxdWlyZW1lbnQKaXMgdGhhdCBhdCBsZWFzdCBhIGZldyB0ZXN0IHZlY3RvcnMgZnJvbSBrbm93biBzb3VyY2VzIChwcmVmZXJhYmx5CnN0YW5kYXJkcykgYmUgaW5jbHVkZWQuCgpDb252ZXJ0aW5nIGV4aXN0aW5nIHdlbGwga25vd24gY29kZSBpcyBwcmVmZXJyZWQsIGFzIGl0IGlzIG1vcmUgbGlrZWx5CnRvIGhhdmUgYmVlbiByZXZpZXdlZCBhbmQgd2lkZWx5IHRlc3RlZC4gIElmIHN1Ym1pdHRpbmcgY29kZSBmcm9tIExHUEwKc291cmNlcywgcGxlYXNlIGNvbnNpZGVyIGNoYW5naW5nIHRoZSBsaWNlbnNlIHRvIEdQTCAoc2VlIHNlY3Rpb24gMyBvZgp0aGUgTEdQTCkuCgpBbGdvcml0aG1zIHN1Ym1pdHRlZCBtdXN0IGFsc28gYmUgZ2VuZXJhbGx5IHBhdGVudC1mcmVlIChlLmcuIElERUEKd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG1haW5saW5lIHVudGlsIGFyb3VuZCAyMDExKSwgYW5kIGJlIGJhc2VkCm9uIGEgcmVjb2duaXplZCBzdGFuZGFyZCBhbmQvb3IgaGF2ZSBiZWVuIHN1YmplY3RlZCB0byBhcHByb3ByaWF0ZQpwZWVyIHJldmlldy4KCkFsc28gY2hlY2sgZm9yIGFueSBSRkNzIHdoaWNoIG1heSByZWxhdGUgdG8gdGhlIHVzZSBvZiBzcGVjaWZpYyBhbGdvcml0aG1zLAphcyB3ZWxsIGFzIGdlbmVyYWwgYXBwbGljYXRpb24gbm90ZXMgc3VjaCBhcyBSRkMyNDUxICgiVGhlIEVTUCBDQkMtTW9kZQpDaXBoZXIgQWxnb3JpdGhtcyIpLgoKSXQncyBhIGdvb2QgaWRlYSB0byBhdm9pZCB1c2luZyBsb3RzIG9mIG1hY3JvcyBhbmQgdXNlIGlubGluZWQgZnVuY3Rpb25zCmluc3RlYWQsIGFzIGdjYyBkb2VzIGEgZ29vZCBqb2Igd2l0aCBpbmxpbmluZywgd2hpbGUgZXhjZXNzaXZlIHVzZSBvZgptYWNyb3MgY2FuIGNhdXNlIGNvbXBpbGF0aW9uIHByb2JsZW1zIG9uIHNvbWUgcGxhdGZvcm1zLgoKQWxzbyBjaGVjayB0aGUgVE9ETyBsaXN0IGF0IHRoZSB3ZWIgc2l0ZSBsaXN0ZWQgYmVsb3cgdG8gc2VlIHdoYXQgcGVvcGxlCm1pZ2h0IGFscmVhZHkgYmUgd29ya2luZyBvbi4KCgpCVUdTCgpTZW5kIGJ1ZyByZXBvcnRzIHRvOgpKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4KQ2M6IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AcmVkaGF0LmNvbT4KCgpGVVJUSEVSIElORk9STUFUSU9OCgpGb3IgZnVydGhlciBwYXRjaGVzIGFuZCB2YXJpb3VzIHVwZGF0ZXMsIGluY2x1ZGluZyB0aGUgY3VycmVudCBUT0RPCmxpc3QsIHNlZToKaHR0cDovL3NhbWJhLm9yZy9+amFtZXNtL2NyeXB0by8KCgpBVVRIT1JTCgpKYW1lcyBNb3JyaXMKRGF2aWQgUy4gTWlsbGVyCgoKQ1JFRElUUwoKVGhlIGZvbGxvd2luZyBwZW9wbGUgcHJvdmlkZWQgaW52YWx1YWJsZSBmZWVkYmFjayBkdXJpbmcgdGhlIGRldmVsb3BtZW50Cm9mIHRoZSBBUEk6CgogIEFsZXhleSBLdXpuZXR6b3YKICBSdXN0eSBSdXNzZWxsCiAgSGVyYmVydCBWYWxlcmlvIFJpZWRlbAogIEplZmYgR2FyemlrCiAgTWljaGFlbCBSaWNoYXJkc29uCiAgQW5kcmV3IE1vcnRvbgogIEluZ28gT2VzZXIKICBDaHJpc3RvcGggSGVsbHdpZwoKUG9ydGlvbnMgb2YgdGhpcyBBUEkgd2VyZSBkZXJpdmVkIGZyb20gdGhlIGZvbGxvd2luZyBwcm9qZWN0czoKICAKICBLZXJuZWxpIENyeXB0b2FwaSAoaHR0cDovL3d3dy5rZXJuZWxpLm9yZy8pCiAgICBBbGV4YW5kZXIgS2plbGRhYXMKICAgIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwKICAgIEt5bGUgTWNNYXJ0aW4KICAgIEplYW4tTHVjIENvb2tlCiAgICBEYXZpZCBCcnlzb24KICAgIENsZW1lbnMgRnJ1aHdpcnRoCiAgICBUb2JpYXMgUmluZ3N0cm9tCiAgICBIYXJhbGQgV2VsdGUKCmFuZDsKICAKICBOZXR0bGUgKGh0dHA6Ly93d3cubHlzYXRvci5saXUuc2Uvfm5pc3NlL25ldHRsZS8pCiAgICBOaWVscyBN9mxsZXIKCk9yaWdpbmFsIGRldmVsb3BlcnMgb2YgdGhlIGNyeXB0byBhbGdvcml0aG1zOgoKICBEYW5hIEwuIEhvdyAoREVTKQogIEFuZHJldyBUcmlkZ2VsbCBhbmQgU3RldmUgRnJlbmNoIChNRDQpCiAgQ29saW4gUGx1bWIgKE1ENSkKICBTdGV2ZSBSZWlkIChTSEExKQogIEplYW4tTHVjIENvb2tlIChTSEEyNTYsIFNIQTM4NCwgU0hBNTEyKQogIEthenVub3JpIE1peWF6YXdhIC8gVVNBR0kgKEhNQUMpCiAgTWF0dGhldyBTa2FsYSAoVHdvZmlzaCkKICBEYWcgQXJuZSBPc3ZpayAoU2VycGVudCkKICBCcmlhbiBHbGFkbWFuIChBRVMpCiAgS2FydGlrZXkgTWFoZW5kcmEgQmhhdHQgKENBU1Q2KQogIEpvbiBPYmVyaGVpZGUgKEFSQzQpCiAgSm91bmkgTWFsaW5lbiAoTWljaGFlbCBNSUMpCgpTSEExIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgSmVhbi1GcmFuY29pcyBEaXZlCiAgCkRFUyBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIFJhaW1hciBGYWxrZQogIEdpc2xlIFPmbGVuc21pbmRlCiAgTmllbHMgTfZsbGVyCgpCbG93ZmlzaCBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwKICBLeWxlIE1jTWFydGluCgpUd29maXNoIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgV2VybmVyIEtvY2gKICBNYXJjIE11dHoKClNIQTI1Ni8zODQvNTEyIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgQW5kcmV3IE1jRG9uYWxkCiAgS3lsZSBNY01hcnRpbgogIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwKICAKQUVTIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgQWxleGFuZGVyIEtqZWxkYWFzCiAgSGVyYmVydCBWYWxlcmlvIFJpZWRlbAogIEt5bGUgTWNNYXJ0aW4KICBBZGFtIEouIFJpY2h0ZXIKICBGcnVod2lydGggQ2xlbWVucyAoaTU4NikKICBMaW51cyBUb3J2YWxkcyAoaTU4NikKCkNBU1Q1IGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgS2FydGlrZXkgTWFoZW5kcmEgQmhhdHQgKG9yaWdpbmFsIGRldmVsb3BlcnMgdW5rbm93biwgRlNGIGNvcHlyaWdodCkuCgpURUEvWFRFQSBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEFhcm9uIEdyb3RoZQogIE1pY2hhZWwgUmluZ2UKCktoYXphZCBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEFhcm9uIEdyb3RoZQoKV2hpcmxwb29sIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgQWFyb24gR3JvdGhlCiAgSmVhbi1MdWMgQ29va2UKCkFudWJpcyBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEFhcm9uIEdyb3RoZQoKVGlnZXIgYWxnb3JpdGhtIGNvbnRyaWJ1dG9yczoKICBBYXJvbiBHcm90aGUKCkdlbmVyaWMgc2NhdHRlcndhbGsgY29kZSBieSBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4KClBsZWFzZSBzZW5kIGFueSBjcmVkaXRzIHVwZGF0ZXMgb3IgY29ycmVjdGlvbnMgdG86CkphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgoK