ZGlmZiAtLWdpdCBhL01pc2MvdW5pY29kZS50eHQgYi9NaXNjL3VuaWNvZGUudHh0CmluZGV4IGI3MWU0Y2EuLmEyNTJlYmUgMTAwNjQ0Ci0tLSBhL01pc2MvdW5pY29kZS50eHQKKysrIGIvTWlzYy91bmljb2RlLnR4dApAQCAtMSwxMTE1ICsxLDUgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gUHl0aG9uIFVuaWNvZGUgSW50ZWdyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcG9zYWwgVmVyc2lvbjogMS43Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBkb2N1bWVudCBoYXMgYmVlbiBQRVAtaWZpZWQuICBQbGVhc2Ugc2VlIFBFUCAxMDAgYXQ6CiAKKyAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcGVwcy9wZXAtMDEwMC5odG1sCiAKLUludHJvZHVjdGlvbjoKLS0tLS0tLS0tLS0tLS0KLQotVGhlIGlkZWEgb2YgdGhpcyBwcm9wb3NhbCBpcyB0byBhZGQgbmF0aXZlIFVuaWNvZGUgMy4wIHN1cHBvcnQgdG8KLVB5dGhvbiBpbiBhIHdheSB0aGF0IG1ha2VzIHVzZSBvZiBVbmljb2RlIHN0cmluZ3MgYXMgc2ltcGxlIGFzCi1wb3NzaWJsZSB3aXRob3V0IGludHJvZHVjaW5nIHRvbyBtYW55IHBpdGZhbGxzIGFsb25nIHRoZSB3YXkuCi0KLVNpbmNlIHRoaXMgZ29hbCBpcyBub3QgZWFzeSB0byBhY2hpZXZlIC0tIHN0cmluZ3MgYmVpbmcgb25lIG9mIHRoZQotbW9zdCBmdW5kYW1lbnRhbCBvYmplY3RzIGluIFB5dGhvbiAtLSwgd2UgZXhwZWN0IHRoaXMgcHJvcG9zYWwgdG8KLXVuZGVyZ28gc29tZSBzaWduaWZpY2FudCByZWZpbmVtZW50cy4KLQotTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhpcyBwcm9wb3NhbCBpcyBzdGlsbCBhIGJpdCB1bnNvcnRlZAotZHVlIHRvIHRoZSBtYW55IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSBVbmljb2RlLVB5dGhvbiBpbnRlZ3JhdGlvbi4KLQotVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgaXMgYWx3YXlzIGF2YWlsYWJsZSBhdDoKLQotICAgICAgICBodHRwOi8vc3RhcnNoaXAucHl0aG9uLm5ldC9+bGVtYnVyZy91bmljb2RlLXByb3Bvc2FsLnR4dAotCi1PbGRlciB2ZXJzaW9ucyBhcmUgYXZhaWxhYmxlIGFzOgotCi0gICAgICAgIGh0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0L35sZW1idXJnL3VuaWNvZGUtcHJvcG9zYWwtWC5YLnR4dAotCi0KLUNvbnZlbnRpb25zOgotLS0tLS0tLS0tLS0tCi0KLbcgSW4gZXhhbXBsZXMgd2UgdXNlIHUgPSBVbmljb2RlIG9iamVjdCBhbmQgcyA9IFB5dGhvbiBzdHJpbmcKLQottyAnWFhYJyBtYXJraW5ncyBpbmRpY2F0ZSBwb2ludHMgb2YgZGlzY3Vzc2lvbiAoUE9EcykKLQotCi1HZW5lcmFsIFJlbWFya3M6Ci0tLS0tLS0tLS0tLS0tLS0tCi0KLbcgVW5pY29kZSBlbmNvZGluZyBuYW1lcyBzaG91bGQgYmUgbG93ZXIgY2FzZSBvbiBvdXRwdXQgYW5kCi0gIGNhc2UtaW5zZW5zaXRpdmUgb24gaW5wdXQgKHRoZXkgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZQotICBieSBhbGwgQVBJcyB0YWtpbmcgYW4gZW5jb2RpbmcgbmFtZSBhcyBpbnB1dCkuCi0KLbcgRW5jb2RpbmcgbmFtZXMgc2hvdWxkIGZvbGxvdyB0aGUgbmFtZSBjb252ZW50aW9ucyBhcyB1c2VkIGJ5IHRoZQotICBVbmljb2RlIENvbnNvcnRpdW06IHNwYWNlcyBhcmUgY29udmVydGVkIHRvIGh5cGhlbnMsIGUuZy4gJ3V0ZiAxNicgaXMKLSAgd3JpdHRlbiBhcyAndXRmLTE2Jy4KLQottyBDb2RlYyBtb2R1bGVzIHNob3VsZCB1c2UgdGhlIHNhbWUgbmFtZXMsIGJ1dCB3aXRoIGh5cGhlbnMgY29udmVydGVkCi0gIHRvIHVuZGVyc2NvcmVzLCBlLmcuIHV0Zl84LCB1dGZfMTYsIGlzb184ODU5XzEuCi0KLQotVW5pY29kZSBEZWZhdWx0IEVuY29kaW5nOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbiBoYXMgdG8gbWFrZSBzb21lIGFzc3VtcHRpb24gYWJvdXQgdGhlCi1lbmNvZGluZyBvZiA4LWJpdCBzdHJpbmdzIHBhc3NlZCB0byBpdCBmb3IgY29lcmNpb24gYW5kIGFib3V0IHRoZQotZW5jb2RpbmcgdG8gYXMgZGVmYXVsdCBmb3IgY29udmVyc2lvbiBvZiBVbmljb2RlIHRvIHN0cmluZ3Mgd2hlbiBubwotc3BlY2lmaWMgZW5jb2RpbmcgaXMgZ2l2ZW4uIFRoaXMgZW5jb2RpbmcgaXMgY2FsbGVkIDxkZWZhdWx0IGVuY29kaW5nPgotdGhyb3VnaG91dCB0aGlzIHRleHQuCi0KLUZvciB0aGlzLCB0aGUgaW1wbGVtZW50YXRpb24gbWFpbnRhaW5zIGEgZ2xvYmFsIHdoaWNoIGNhbiBiZSBzZXQgaW4KLXRoZSBzaXRlLnB5IFB5dGhvbiBzdGFydHVwIHNjcmlwdC4gU3Vic2VxdWVudCBjaGFuZ2VzIGFyZSBub3QKLXBvc3NpYmxlLiBUaGUgPGRlZmF1bHQgZW5jb2Rpbmc+IGNhbiBiZSBzZXQgYW5kIHF1ZXJpZWQgdXNpbmcgdGhlCi10d28gc3lzIG1vZHVsZSBBUElzOgotCi0gIHN5cy5zZXRkZWZhdWx0ZW5jb2RpbmcoZW5jb2RpbmcpCi0gICAgIC0tPiBTZXRzIHRoZSA8ZGVmYXVsdCBlbmNvZGluZz4gdXNlZCBieSB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbi4KLQkgZW5jb2RpbmcgaGFzIHRvIGJlIGFuIGVuY29kaW5nIHdoaWNoIGlzIHN1cHBvcnRlZCBieSB0aGUgUHl0aG9uCi0JIGluc3RhbGxhdGlvbiwgb3RoZXJ3aXNlLCBhIExvb2t1cEVycm9yIGlzIHJhaXNlZC4KLQotCSBOb3RlOiBUaGlzIEFQSSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBzaXRlLnB5ICEgSXQgaXMgcmVtb3ZlZAotCSBmcm9tIHRoZSBzeXMgbW9kdWxlIGJ5IHNpdGUucHkgYWZ0ZXIgdXNhZ2UuCi0KLSAgc3lzLmdldGRlZmF1bHRlbmNvZGluZygpCi0gICAgIC0tPiBSZXR1cm5zIHRoZSBjdXJyZW50IDxkZWZhdWx0IGVuY29kaW5nPi4KLQotSWYgbm90IG90aGVyd2lzZSBkZWZpbmVkIG9yIHNldCwgdGhlIDxkZWZhdWx0IGVuY29kaW5nPiBkZWZhdWx0cyB0bwotJ2FzY2lpJy4gVGhpcyBlbmNvZGluZyBpcyBhbHNvIHRoZSBzdGFydHVwIGRlZmF1bHQgb2YgUHl0aG9uIChhbmQgaW4KLWVmZmVjdCBiZWZvcmUgc2l0ZS5weSBpcyBleGVjdXRlZCkuCi0KLU5vdGUgdGhhdCB0aGUgZGVmYXVsdCBzaXRlLnB5IHN0YXJ0dXAgbW9kdWxlIGNvbnRhaW5zIGRpc2FibGVkCi1vcHRpb25hbCBjb2RlIHdoaWNoIGNhbiBzZXQgdGhlIDxkZWZhdWx0IGVuY29kaW5nPiBhY2NvcmRpbmcgdG8gdGhlCi1lbmNvZGluZyBkZWZpbmVkIGJ5IHRoZSBjdXJyZW50IGxvY2FsZS4gVGhlIGxvY2FsZSBtb2R1bGUgaXMgdXNlZCB0bwotZXh0cmFjdCB0aGUgZW5jb2RpbmcgZnJvbSB0aGUgbG9jYWxlIGRlZmF1bHQgc2V0dGluZ3MgZGVmaW5lZCBieSB0aGUKLU9TIGVudmlyb25tZW50IChzZWUgbG9jYWxlLnB5KS4gSWYgdGhlIGVuY29kaW5nIGNhbm5vdCBiZSBkZXRlcm1pbmVkLAotaXMgdW5rb3duIG9yIHVuc3VwcG9ydGVkLCB0aGUgY29kZSBkZWZhdWx0cyB0byBzZXR0aW5nIHRoZSA8ZGVmYXVsdAotZW5jb2Rpbmc+IHRvICdhc2NpaScuIFRvIGVuYWJsZSB0aGlzIGNvZGUsIGVkaXQgdGhlIHNpdGUucHkgZmlsZSBvcgotcGxhY2UgdGhlIGFwcHJvcHJpYXRlIGNvZGUgaW50byB0aGUgc2l0ZWN1c3RvbWl6ZS5weSBtb2R1bGUgb2YgeW91cgotUHl0aG9uIGluc3RhbGxhdGlvbi4KLQotCi1Vbmljb2RlIENvbnN0cnVjdG9yczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1QeXRob24gc2hvdWxkIHByb3ZpZGUgYSBidWlsdC1pbiBjb25zdHJ1Y3RvciBmb3IgVW5pY29kZSBzdHJpbmdzIHdoaWNoCi1pcyBhdmFpbGFibGUgdGhyb3VnaCBfX2J1aWx0aW5zX186Ci0KLSAgdSA9IHVuaWNvZGUoZW5jb2RlZF9zdHJpbmdbLGVuY29kaW5nPTxkZWZhdWx0IGVuY29kaW5nPl1bLGVycm9ycz0ic3RyaWN0Il0pCi0KLSAgdSA9IHUnPHVuaWNvZGUtZXNjYXBlIGVuY29kZWQgUHl0aG9uIHN0cmluZz4nCi0KLSAgdSA9IHVyJzxyYXctdW5pY29kZS1lc2NhcGUgZW5jb2RlZCBQeXRob24gc3RyaW5nPicKLQotV2l0aCB0aGUgJ3VuaWNvZGUtZXNjYXBlJyBlbmNvZGluZyBiZWluZyBkZWZpbmVkIGFzOgotCi23IGFsbCBub24tZXNjYXBlIGNoYXJhY3RlcnMgcmVwcmVzZW50IHRoZW1zZWx2ZXMgYXMgVW5pY29kZSBvcmRpbmFsCi0gIChlLmcuICdhJyAtPiBVKzAwNjEpLgotCi23IGFsbCBleGlzdGluZyBkZWZpbmVkIFB5dGhvbiBlc2NhcGUgc2VxdWVuY2VzIGFyZSBpbnRlcnByZXRlZCBhcwotICBVbmljb2RlIG9yZGluYWxzOyBub3RlIHRoYXQgXHhYWFhYIGNhbiByZXByZXNlbnQgYWxsIFVuaWNvZGUKLSAgb3JkaW5hbHMsIGFuZCBcT09PIChvY3RhbCkgY2FuIHJlcHJlc2VudCBVbmljb2RlIG9yZGluYWxzIHVwIHRvIFUrMDFGRi4KLQottyBhIG5ldyBlc2NhcGUgc2VxdWVuY2UsIFx1WFhYWCwgcmVwcmVzZW50cyBVK1hYWFg7IGl0IGlzIGEgc3ludGF4Ci0gIGVycm9yIHRvIGhhdmUgZmV3ZXIgdGhhbiA0IGRpZ2l0cyBhZnRlciBcdS4KLQotRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHBvc3NpYmxlIHZhbHVlcyBmb3IgZXJyb3JzIHNlZSB0aGUgQ29kZWMgc2VjdGlvbgotYmVsb3cuCi0KLUV4YW1wbGVzOgotCi11J2FiYycgICAgICAgICAgLT4gVSswMDYxIFUrMDA2MiBVKzAwNjMKLXUnXHUxMjM0JyAgICAgICAtPiBVKzEyMzQKLXUnYWJjXHUxMjM0XG4nICAtPiBVKzAwNjEgVSswMDYyIFUrMDA2MyBVKzEyMzQgVSswMDVjCi0KLVRoZSAncmF3LXVuaWNvZGUtZXNjYXBlJyBlbmNvZGluZyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0KLbcgXHVYWFhYIHNlcXVlbmNlIHJlcHJlc2VudCB0aGUgVStYWFhYIFVuaWNvZGUgY2hhcmFjdGVyIGlmIGFuZAotICBvbmx5IGlmIHRoZSBudW1iZXIgb2YgbGVhZGluZyBiYWNrc2xhc2hlcyBpcyBvZGQKLQottyBhbGwgb3RoZXIgY2hhcmFjdGVycyByZXByZXNlbnQgdGhlbXNlbHZlcyBhcyBVbmljb2RlIG9yZGluYWwKLSAgKGUuZy4gJ2InIC0+IFUrMDA2MikKLQotCi1Ob3RlIHRoYXQgeW91IHNob3VsZCBwcm92aWRlIHNvbWUgaGludCB0byB0aGUgZW5jb2RpbmcgeW91IHVzZWQgdG8KLXdyaXRlIHlvdXIgcHJvZ3JhbXMgYXMgcHJhZ21hIGxpbmUgaW4gb25lIHRoZSBmaXJzdCBmZXcgY29tbWVudCBsaW5lcwotb2YgdGhlIHNvdXJjZSBmaWxlIChlLmcuICcjIHNvdXJjZSBmaWxlIGVuY29kaW5nOiBsYXRpbi0xJykuIElmIHlvdQotb25seSB1c2UgNy1iaXQgQVNDSUkgdGhlbiBldmVyeXRoaW5nIGlzIGZpbmUgYW5kIG5vIHN1Y2ggbm90aWNlIGlzCi1uZWVkZWQsIGJ1dCBpZiB5b3UgaW5jbHVkZSBMYXRpbi0xIGNoYXJhY3RlcnMgbm90IGRlZmluZWQgaW4gQVNDSUksIGl0Ci1tYXkgd2VsbCBiZSB3b3J0aHdoaWxlIGluY2x1ZGluZyBhIGhpbnQgc2luY2UgcGVvcGxlIGluIG90aGVyCi1jb3VudHJpZXMgd2lsbCB3YW50IHRvIGJlIGFibGUgdG8gcmVhZCB5b3VyIHNvdXJjZSBzdHJpbmdzIHRvby4KLQotCi1Vbmljb2RlIFR5cGUgT2JqZWN0OgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVW5pY29kZSBvYmplY3RzIHNob3VsZCBoYXZlIHRoZSB0eXBlIFVuaWNvZGVUeXBlIHdpdGggdHlwZSBuYW1lCi0ndW5pY29kZScsIG1hZGUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHN0YW5kYXJkIHR5cGVzIG1vZHVsZS4KLQotCi1Vbmljb2RlIE91dHB1dDoKLS0tLS0tLS0tLS0tLS0tLQotCi1Vbmljb2RlIG9iamVjdHMgaGF2ZSBhIG1ldGhvZCAuZW5jb2RlKFtlbmNvZGluZz08ZGVmYXVsdCBlbmNvZGluZz5dKQotd2hpY2ggcmV0dXJucyBhIFB5dGhvbiBzdHJpbmcgZW5jb2RpbmcgdGhlIFVuaWNvZGUgc3RyaW5nIHVzaW5nIHRoZQotZ2l2ZW4gc2NoZW1lIChzZWUgQ29kZWNzKS4KLQotICBwcmludCB1IDo9IHByaW50IHUuZW5jb2RlKCkgICAjIHVzaW5nIHRoZSA8ZGVmYXVsdCBlbmNvZGluZz4KLSAKLSAgc3RyKHUpICA6PSB1LmVuY29kZSgpICAgICAgICAgIyB1c2luZyB0aGUgPGRlZmF1bHQgZW5jb2Rpbmc+Ci0KLSAgcmVwcih1KSA6PSAidSVzIiAlIHJlcHIodS5lbmNvZGUoJ3VuaWNvZGUtZXNjYXBlJykpCi0KLUFsc28gc2VlIEludGVybmFsIEFyZ3VtZW50IFBhcnNpbmcgYW5kIEJ1ZmZlciBJbnRlcmZhY2UgZm9yIGRldGFpbHMgb24KLWhvdyBvdGhlciBBUElzIHdyaXR0ZW4gaW4gQyB3aWxsIHRyZWF0IFVuaWNvZGUgb2JqZWN0cy4KLQotCi1Vbmljb2RlIE9yZGluYWxzOgotLS0tLS0tLS0tLS0tLS0tLS0KLQotU2luY2UgVW5pY29kZSAzLjAgaGFzIGEgMzItYml0IG9yZGluYWwgY2hhcmFjdGVyIHNldCwgdGhlIGltcGxlbWVudGF0aW9uCi1zaG91bGQgcHJvdmlkZSAzMi1iaXQgYXdhcmUgb3JkaW5hbCBjb252ZXJzaW9uIEFQSXM6Ci0KLSAgb3JkKHVbOjFdKSAodGhpcyBpcyB0aGUgc3RhbmRhcmQgb3JkKCkgZXh0ZW5kZWQgdG8gd29yayB3aXRoIFVuaWNvZGUKLSAgICAgICAgICAgICAgb2JqZWN0cykKLSAgICAgICAgLS0+IFVuaWNvZGUgb3JkaW5hbCBudW1iZXIgKDMyLWJpdCkKLQotICB1bmljaHIoaSkgCi0gICAgICAgIC0tPiBVbmljb2RlIG9iamVjdCBmb3IgY2hhcmFjdGVyIGkgKHByb3ZpZGVkIGl0IGlzIDMyLWJpdCk7Ci0gICAgICAgICAgICBWYWx1ZUVycm9yIG90aGVyd2lzZQotCi1Cb3RoIEFQSXMgc2hvdWxkIGdvIGludG8gX19idWlsdGluc19fIGp1c3QgbGlrZSB0aGVpciBzdHJpbmcKLWNvdW50ZXJwYXJ0cyBvcmQoKSBhbmQgY2hyKCkuCi0KLU5vdGUgdGhhdCBVbmljb2RlIHByb3ZpZGVzIHNwYWNlIGZvciBwcml2YXRlIGVuY29kaW5ncy4gVXNhZ2Ugb2YgdGhlc2UKLWNhbiBjYXVzZSBkaWZmZXJlbnQgb3V0cHV0IHJlcHJlc2VudGF0aW9ucyBvbiBkaWZmZXJlbnQgbWFjaGluZXMuIFRoaXMKLXByb2JsZW0gaXMgbm90IGEgUHl0aG9uIG9yIFVuaWNvZGUgcHJvYmxlbSwgYnV0IGEgbWFjaGluZSBzZXR1cCBhbmQKLW1haW50ZW5hbmNlIG9uZS4KLQotCi1Db21wYXJpc29uICYgSGFzaCBWYWx1ZToKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Vbmljb2RlIG9iamVjdHMgc2hvdWxkIGNvbXBhcmUgZXF1YWwgdG8gb3RoZXIgb2JqZWN0cyBhZnRlciB0aGVzZQotb3RoZXIgb2JqZWN0cyBoYXZlIGJlZW4gY29lcmNlZCB0byBVbmljb2RlLiBGb3Igc3RyaW5ncyB0aGlzIG1lYW5zCi10aGF0IHRoZXkgYXJlIGludGVycHJldGVkIGFzIFVuaWNvZGUgc3RyaW5nIHVzaW5nIHRoZSA8ZGVmYXVsdAotZW5jb2Rpbmc+LgotCi1Vbmljb2RlIG9iamVjdHMgc2hvdWxkIHJldHVybiB0aGUgc2FtZSBoYXNoIHZhbHVlIGFzIHRoZWlyIEFTQ0lJCi1lcXVpdmFsZW50IHN0cmluZ3MuIFVuaWNvZGUgc3RyaW5ncyBob2xkaW5nIG5vbi1BU0NJSSB2YWx1ZXMgYXJlIG5vdAotZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgaGFzaCB2YWx1ZXMgYXMgdGhlIGRlZmF1bHQgZW5jb2RlZAotZXF1aXZhbGVudCBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0KLVdoZW4gY29tcGFyZWQgdXNpbmcgY21wKCkgKG9yIFB5T2JqZWN0X0NvbXBhcmUoKSkgdGhlIGltcGxlbWVudGF0aW9uCi1zaG91bGQgbWFzayBUeXBlRXJyb3JzIHJhaXNlZCBkdXJpbmcgdGhlIGNvbnZlcnNpb24gdG8gcmVtYWluIGluIHN5bmNoCi13aXRoIHRoZSBzdHJpbmcgYmVoYXZpb3IuIEFsbCBvdGhlciBlcnJvcnMgc3VjaCBhcyBWYWx1ZUVycm9ycyByYWlzZWQKLWR1cmluZyBjb2VyY2lvbiBvZiBzdHJpbmdzIHRvIFVuaWNvZGUgc2hvdWxkIG5vdCBiZSBtYXNrZWQgYW5kIHBhc3NlZAotdGhyb3VnaCB0byB0aGUgdXNlci4KLQotSW4gY29udGFpbm1lbnQgdGVzdHMgKCdhJyBpbiB1J2FiYycgYW5kIHUnYScgaW4gJ2FiYycpIGJvdGggc2lkZXMKLXNob3VsZCBiZSBjb2VyY2VkIHRvIFVuaWNvZGUgYmVmb3JlIGFwcGx5aW5nIHRoZSB0ZXN0LiBFcnJvcnMgb2NjdXJyaW5nCi1kdXJpbmcgY29lcmNpb24gKGUuZy4gTm9uZSBpbiB1J2FiYycpIHNob3VsZCBub3QgYmUgbWFza2VkLgotCi0KLUNvZXJjaW9uOgotLS0tLS0tLS0tCi0KLVVzaW5nIFB5dGhvbiBzdHJpbmdzIGFuZCBVbmljb2RlIG9iamVjdHMgdG8gZm9ybSBuZXcgb2JqZWN0cyBzaG91bGQKLWFsd2F5cyBjb2VyY2UgdG8gdGhlIG1vcmUgcHJlY2lzZSBmb3JtYXQsIGkuZS4gVW5pY29kZSBvYmplY3RzLgotCi0gIHUgKyBzIDo9IHUgKyB1bmljb2RlKHMpCi0KLSAgcyArIHUgOj0gdW5pY29kZShzKSArIHUKLQotQWxsIHN0cmluZyBtZXRob2RzIHNob3VsZCBkZWxlZ2F0ZSB0aGUgY2FsbCB0byBhbiBlcXVpdmFsZW50IFVuaWNvZGUKLW9iamVjdCBtZXRob2QgY2FsbCBieSBjb252ZXJ0aW5nIGFsbCBpbnZvbHZlZCBzdHJpbmdzIHRvIFVuaWNvZGUgYW5kCi10aGVuIGFwcGx5aW5nIHRoZSBhcmd1bWVudHMgdG8gdGhlIFVuaWNvZGUgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUsCi1lLmcuCi0KLSAgc3RyaW5nLmpvaW4oKHMsdSksc2VwKSA6PSAocyArIHNlcCkgKyB1Ci0KLSAgc2VwLmpvaW4oKHMsdSkpIDo9IChzICsgc2VwKSArIHUKLQotRm9yIGEgZGlzY3Vzc2lvbiBvZiAlLWZvcm1hdHRpbmcgdy9yIHRvIFVuaWNvZGUgb2JqZWN0cywgc2VlCi1Gb3JtYXR0aW5nIE1hcmtlcnMuCi0KLQotRXhjZXB0aW9uczoKLS0tLS0tLS0tLS0tCi0KLVVuaWNvZGVFcnJvciBpcyBkZWZpbmVkIGluIHRoZSBleGNlcHRpb25zIG1vZHVsZSBhcyBhIHN1YmNsYXNzIG9mCi1WYWx1ZUVycm9yLiBJdCBpcyBhdmFpbGFibGUgYXQgdGhlIEMgbGV2ZWwgdmlhIFB5RXhjX1VuaWNvZGVFcnJvci4KLUFsbCBleGNlcHRpb25zIHJlbGF0ZWQgdG8gVW5pY29kZSBlbmNvZGluZy9kZWNvZGluZyBzaG91bGQgYmUKLXN1YmNsYXNzZXMgb2YgVW5pY29kZUVycm9yLgotCi0KLUNvZGVjcyAoQ29kZXIvRGVjb2RlcnMpIExvb2t1cDoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQSBDb2RlYyAoc2VlIENvZGVjIEludGVyZmFjZSBEZWZpbml0aW9uKSBzZWFyY2ggcmVnaXN0cnkgc2hvdWxkIGJlCi1pbXBsZW1lbnRlZCBieSBhIG1vZHVsZSAiY29kZWNzIjoKLQotICBjb2RlY3MucmVnaXN0ZXIoc2VhcmNoX2Z1bmN0aW9uKQotCi1TZWFyY2ggZnVuY3Rpb25zIGFyZSBleHBlY3RlZCB0byB0YWtlIG9uZSBhcmd1bWVudCwgdGhlIGVuY29kaW5nIG5hbWUKLWluIGFsbCBsb3dlciBjYXNlIGxldHRlcnMgYW5kIHdpdGggaHlwaGVucyBhbmQgc3BhY2VzIGNvbnZlcnRlZCB0bwotdW5kZXJzY29yZXMsIGFuZCByZXR1cm4gYSB0dXBsZSBvZiBmdW5jdGlvbnMgKGVuY29kZXIsIGRlY29kZXIsCi1zdHJlYW1fcmVhZGVyLCBzdHJlYW1fd3JpdGVyKSB0YWtpbmcgdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6Ci0KLSAgZW5jb2RlciBhbmQgZGVjb2RlcjoKLQlUaGVzZSBtdXN0IGJlIGZ1bmN0aW9ucyBvciBtZXRob2RzIHdoaWNoIGhhdmUgdGhlIHNhbWUKLQlpbnRlcmZhY2UgYXMgdGhlIC5lbmNvZGUvLmRlY29kZSBtZXRob2RzIG9mIENvZGVjIGluc3RhbmNlcwotCShzZWUgQ29kZWMgSW50ZXJmYWNlKS4gVGhlIGZ1bmN0aW9ucy9tZXRob2RzIGFyZSBleHBlY3RlZCB0bwotCXdvcmsgaW4gYSBzdGF0ZWxlc3MgbW9kZS4KLQotICBzdHJlYW1fcmVhZGVyIGFuZCBzdHJlYW1fd3JpdGVyOgotCVRoZXNlIG5lZWQgdG8gYmUgZmFjdG9yeSBmdW5jdGlvbnMgd2l0aCB0aGUgZm9sbG93aW5nCi0JaW50ZXJmYWNlOgotCi0JICAgICAgICBmYWN0b3J5KHN0cmVhbSxlcnJvcnM9J3N0cmljdCcpCi0KLSAgICAgICAgVGhlIGZhY3RvcnkgZnVuY3Rpb25zIG11c3QgcmV0dXJuIG9iamVjdHMgcHJvdmlkaW5nCi0gICAgICAgIHRoZSBpbnRlcmZhY2VzIGRlZmluZWQgYnkgU3RyZWFtV3JpdGVyL1N0cmVhbVJlYWRlciByZXNwLgotICAgICAgICAoc2VlIENvZGVjIEludGVyZmFjZSkuIFN0cmVhbSBjb2RlY3MgY2FuIG1haW50YWluIHN0YXRlLgotCi0JUG9zc2libGUgdmFsdWVzIGZvciBlcnJvcnMgYXJlIGRlZmluZWQgaW4gdGhlIENvZGVjCi0Jc2VjdGlvbiBiZWxvdy4KLQotSW4gY2FzZSBhIHNlYXJjaCBmdW5jdGlvbiBjYW5ub3QgZmluZCBhIGdpdmVuIGVuY29kaW5nLCBpdCBzaG91bGQKLXJldHVybiBOb25lLgotCi1BbGlhc2luZyBzdXBwb3J0IGZvciBlbmNvZGluZ3MgaXMgbGVmdCB0byB0aGUgc2VhcmNoIGZ1bmN0aW9ucwotdG8gaW1wbGVtZW50LgotCi1UaGUgY29kZWNzIG1vZHVsZSB3aWxsIG1haW50YWluIGFuIGVuY29kaW5nIGNhY2hlIGZvciBwZXJmb3JtYW5jZQotcmVhc29ucy4gRW5jb2RpbmdzIGFyZSBmaXJzdCBsb29rZWQgdXAgaW4gdGhlIGNhY2hlLiBJZiBub3QgZm91bmQsIHRoZQotbGlzdCBvZiByZWdpc3RlcmVkIHNlYXJjaCBmdW5jdGlvbnMgaXMgc2Nhbm5lZC4gSWYgbm8gY29kZWNzIHR1cGxlIGlzCi1mb3VuZCwgYSBMb29rdXBFcnJvciBpcyByYWlzZWQuIE90aGVyd2lzZSwgdGhlIGNvZGVjcyB0dXBsZSBpcyBzdG9yZWQKLWluIHRoZSBjYWNoZSBhbmQgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KLQotVG8gcXVlcnkgdGhlIENvZGVjIGluc3RhbmNlIHRoZSBmb2xsb3dpbmcgQVBJIHNob3VsZCBiZSB1c2VkOgotCi0gIGNvZGVjcy5sb29rdXAoZW5jb2RpbmcpCi0KLVRoaXMgd2lsbCBlaXRoZXIgcmV0dXJuIHRoZSBmb3VuZCBjb2RlY3MgdHVwbGUgb3IgcmFpc2UgYSBMb29rdXBFcnJvci4KLQotCi1TdGFuZGFyZCBDb2RlY3M6Ci0tLS0tLS0tLS0tLS0tLS0tCi0KLVN0YW5kYXJkIGNvZGVjcyBzaG91bGQgbGl2ZSBpbnNpZGUgYW4gZW5jb2RpbmdzLyBwYWNrYWdlIGRpcmVjdG9yeSBpbiB0aGUKLVN0YW5kYXJkIFB5dGhvbiBDb2RlIExpYnJhcnkuIFRoZSBfX2luaXRfXy5weSBmaWxlIG9mIHRoYXQgZGlyZWN0b3J5IHNob3VsZAotaW5jbHVkZSBhIENvZGVjIExvb2t1cCBjb21wYXRpYmxlIHNlYXJjaCBmdW5jdGlvbiBpbXBsZW1lbnRpbmcgYSBsYXp5IG1vZHVsZQotYmFzZWQgY29kZWMgbG9va3VwLgotCi1QeXRob24gc2hvdWxkIHByb3ZpZGUgYSBmZXcgc3RhbmRhcmQgY29kZWNzIGZvciB0aGUgbW9zdCByZWxldmFudAotZW5jb2RpbmdzLCBlLmcuIAotCi0gICd1dGYtOCc6ICAgICAgICAgICAgICA4LWJpdCB2YXJpYWJsZSBsZW5ndGggZW5jb2RpbmcKLSAgJ3V0Zi0xNic6ICAgICAgICAgICAgIDE2LWJpdCB2YXJpYWJsZSBsZW5ndGggZW5jb2RpbmcgKGxpdHRsZS9iaWcgZW5kaWFuKQotICAndXRmLTE2LWxlJzogICAgICAgICAgdXRmLTE2IGJ1dCBleHBsaWNpdGx5IGxpdHRsZSBlbmRpYW4KLSAgJ3V0Zi0xNi1iZSc6ICAgICAgICAgIHV0Zi0xNiBidXQgZXhwbGljaXRseSBiaWcgZW5kaWFuCi0gICdhc2NpaSc6ICAgICAgICAgICAgICA3LWJpdCBBU0NJSSBjb2RlcGFnZQotICAnaXNvLTg4NTktMSc6ICAgICAgICAgSVNPIDg4NTktMSAoTGF0aW4gMSkgY29kZXBhZ2UKLSAgJ3VuaWNvZGUtZXNjYXBlJzogICAgIFNlZSBVbmljb2RlIENvbnN0cnVjdG9ycyBmb3IgYSBkZWZpbml0aW9uCi0gICdyYXctdW5pY29kZS1lc2NhcGUnOiBTZWUgVW5pY29kZSBDb25zdHJ1Y3RvcnMgZm9yIGEgZGVmaW5pdGlvbgotICAnbmF0aXZlJzogICAgICAgICAgICAgRHVtcCBvZiB0aGUgSW50ZXJuYWwgRm9ybWF0IHVzZWQgYnkgUHl0aG9uCi0KLUNvbW1vbiBhbGlhc2VzIHNob3VsZCBhbHNvIGJlIHByb3ZpZGVkIHBlciBkZWZhdWx0LCBlLmcuICAnbGF0aW4tMScKLWZvciAnaXNvLTg4NTktMScuCi0KLU5vdGU6ICd1dGYtMTYnIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB1c2luZyBhbmQgcmVxdWlyaW5nIGJ5dGUgb3JkZXIKLW1hcmtzIChCT00pIGZvciBmaWxlIGlucHV0L291dHB1dC4KLQotQWxsIG90aGVyIGVuY29kaW5ncyBzdWNoIGFzIHRoZSBDSksgb25lcyB0byBzdXBwb3J0IEFzaWFuIHNjcmlwdHMKLXNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzZXBhcmF0ZSBwYWNrYWdlcyB3aGljaCBkbyBub3QgZ2V0IGluY2x1ZGVkCi1pbiB0aGUgY29yZSBQeXRob24gZGlzdHJpYnV0aW9uIGFuZCBhcmUgbm90IGEgcGFydCBvZiB0aGlzIHByb3Bvc2FsLgotCi0KLUNvZGVjcyBJbnRlcmZhY2UgRGVmaW5pdGlvbjoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBiYXNlIGNsYXNzIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZSBtb2R1bGUKLSJjb2RlY3MiLiBUaGV5IHByb3ZpZGUgbm90IG9ubHkgdGVtcGxhdGVzIGZvciB1c2UgYnkgZW5jb2RpbmcgbW9kdWxlCi1pbXBsZW1lbnRvcnMsIGJ1dCBhbHNvIGRlZmluZSB0aGUgaW50ZXJmYWNlIHdoaWNoIGlzIGV4cGVjdGVkIGJ5IHRoZQotVW5pY29kZSBpbXBsZW1lbnRhdGlvbi4KLQotTm90ZSB0aGF0IHRoZSBDb2RlYyBJbnRlcmZhY2UgZGVmaW5lZCBoZXJlIGlzIHdlbGwgc3VpdGFibGUgZm9yIGEKLWxhcmdlciByYW5nZSBvZiBhcHBsaWNhdGlvbnMuIFRoZSBVbmljb2RlIGltcGxlbWVudGF0aW9uIGV4cGVjdHMKLVVuaWNvZGUgb2JqZWN0cyBvbiBpbnB1dCBmb3IgLmVuY29kZSgpIGFuZCAud3JpdGUoKSBhbmQgY2hhcmFjdGVyCi1idWZmZXIgY29tcGF0aWJsZSBvYmplY3RzIG9uIGlucHV0IGZvciAuZGVjb2RlKCkuIE91dHB1dCBvZiAuZW5jb2RlKCkKLWFuZCAucmVhZCgpIHNob3VsZCBiZSBhIFB5dGhvbiBzdHJpbmcgYW5kIC5kZWNvZGUoKSBtdXN0IHJldHVybiBhbgotVW5pY29kZSBvYmplY3QuCi0KLUZpcnN0LCB3ZSBoYXZlIHRoZSBzdGF0ZWxlc3MgZW5jb2RlcnMvZGVjb2RlcnMuIFRoZXNlIGRvIG5vdCB3b3JrIGluCi1jaHVua3MgYXMgdGhlIHN0cmVhbSBjb2RlY3MgKHNlZSBiZWxvdykgZG8sIGJlY2F1c2UgYWxsIGNvbXBvbmVudHMgYXJlCi1leHBlY3RlZCB0byBiZSBhdmFpbGFibGUgaW4gbWVtb3J5LgotCi1jbGFzcyBDb2RlYzoKLQotICAgICIiIiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIHN0YXRlbGVzcyBlbmNvZGVycy9kZWNvZGVycy4KLQotICAgICAgICBUaGUgLmVuY29kZSgpLy5kZWNvZGUoKSBtZXRob2RzIG1heSBpbXBsZW1lbnQgZGlmZmVyZW50IGVycm9yCi0gICAgICAgIGhhbmRsaW5nIHNjaGVtZXMgYnkgcHJvdmlkaW5nIHRoZSBlcnJvcnMgYXJndW1lbnQuIFRoZXNlCi0gICAgICAgIHN0cmluZyB2YWx1ZXMgYXJlIGRlZmluZWQ6Ci0KLSAgICAgICAgICdzdHJpY3QnIC0gcmFpc2UgYW4gZXJyb3IgKG9yIGEgc3ViY2xhc3MpCi0gICAgICAgICAnaWdub3JlJyAtIGlnbm9yZSB0aGUgY2hhcmFjdGVyIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0Ci0gICAgICAgICAncmVwbGFjZScgLSByZXBsYWNlIHdpdGggYSBzdWl0YWJsZSByZXBsYWNlbWVudCBjaGFyYWN0ZXI7Ci0gICAgICAgICAgICAgICAgICAgIFB5dGhvbiB3aWxsIHVzZSB0aGUgb2ZmaWNpYWwgVStGRkZEIFJFUExBQ0VNRU5UCi0gICAgICAgICAgICAgICAgICAgIENIQVJBQ1RFUiBmb3IgdGhlIGJ1aWx0aW4gVW5pY29kZSBjb2RlY3MuCi0KLSAgICAiIiIKLSAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgCi0gICAgICAgICIiIiBFbmNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0Ci0gICAgICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCi0KLSAgICAgICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KLSAgICAgICAgICAgICdzdHJpY3QnIGhhbmRsaW5nLgotCi0gICAgICAgICAgICBUaGUgbWV0aG9kIG1heSBub3Qgc3RvcmUgc3RhdGUgaW4gdGhlIENvZGVjIGluc3RhbmNlLiBVc2UKLSAgICAgICAgICAgIFN0cmVhbUNvZGVjIGZvciBjb2RlY3Mgd2hpY2ggaGF2ZSB0byBrZWVwIHN0YXRlIGluIG9yZGVyIHRvCi0gICAgICAgICAgICBtYWtlIGVuY29kaW5nL2RlY29kaW5nIGVmZmljaWVudC4KLQotICAgICAgICAiIiIKLQkuLi4KLQotICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgotCi0gICAgICAgICIiIiBEZWNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0Ci0gICAgICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCi0KLSAgICAgICAgICAgIGlucHV0IG11c3QgYmUgYW4gb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBiZl9nZXRyZWFkYnVmCi0gICAgICAgICAgICBidWZmZXIgc2xvdC4gUHl0aG9uIHN0cmluZ3MsIGJ1ZmZlciBvYmplY3RzIGFuZCBtZW1vcnkKLSAgICAgICAgICAgIG1hcHBlZCBmaWxlcyBhcmUgZXhhbXBsZXMgb2Ygb2JqZWN0cyBwcm92aWRpbmcgdGhpcyBzbG90LgotICAgICAgICAKLSAgICAgICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KLSAgICAgICAgICAgICdzdHJpY3QnIGhhbmRsaW5nLgotCi0gICAgICAgICAgICBUaGUgbWV0aG9kIG1heSBub3Qgc3RvcmUgc3RhdGUgaW4gdGhlIENvZGVjIGluc3RhbmNlLiBVc2UKLSAgICAgICAgICAgIFN0cmVhbUNvZGVjIGZvciBjb2RlY3Mgd2hpY2ggaGF2ZSB0byBrZWVwIHN0YXRlIGluIG9yZGVyIHRvCi0gICAgICAgICAgICBtYWtlIGVuY29kaW5nL2RlY29kaW5nIGVmZmljaWVudC4KLQotICAgICAgICAiIiIgCi0gICAgICAgIC4uLgotCi1TdHJlYW1Xcml0ZXIgYW5kIFN0cmVhbVJlYWRlciBkZWZpbmUgdGhlIGludGVyZmFjZSBmb3Igc3RhdGVmdWwKLWVuY29kZXJzL2RlY29kZXJzIHdoaWNoIHdvcmsgb24gc3RyZWFtcy4gVGhlc2UgYWxsb3cgcHJvY2Vzc2luZyBvZiB0aGUKLWRhdGEgaW4gY2h1bmtzIHRvIGVmZmljaWVudGx5IHVzZSBtZW1vcnkuIElmIHlvdSBoYXZlIGxhcmdlIHN0cmluZ3MgaW4KLW1lbW9yeSwgeW91IG1heSB3YW50IHRvIHdyYXAgdGhlbSB3aXRoIGNTdHJpbmdJTyBvYmplY3RzIGFuZCB0aGVuIHVzZQotdGhlc2UgY29kZWNzIG9uIHRoZW0gdG8gYmUgYWJsZSB0byBkbyBjaHVuayBwcm9jZXNzaW5nIGFzIHdlbGwsCi1lLmcuIHRvIHByb3ZpZGUgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIuCi0KLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZixzdHJlYW0sZXJyb3JzPSdzdHJpY3QnKToKLQotICAgICAgICAiIiIgQ3JlYXRlcyBhIFN0cmVhbVdyaXRlciBpbnN0YW5jZS4KLQotICAgICAgICAgICAgc3RyZWFtIG11c3QgYmUgYSBmaWxlLWxpa2Ugb2JqZWN0IG9wZW4gZm9yIHdyaXRpbmcKLSAgICAgICAgICAgIChiaW5hcnkpIGRhdGEuCi0KLSAgICAgICAgICAgIFRoZSBTdHJlYW1Xcml0ZXIgbWF5IGltcGxlbWVudCBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcKLSAgICAgICAgICAgIHNjaGVtZXMgYnkgcHJvdmlkaW5nIHRoZSBlcnJvcnMga2V5d29yZCBhcmd1bWVudC4gVGhlc2UKLSAgICAgICAgICAgIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQ6Ci0KLSAgICAgICAgICAgICAnc3RyaWN0JyAtIHJhaXNlIGEgVmFsdWVFcnJvciAob3IgYSBzdWJjbGFzcykKLSAgICAgICAgICAgICAnaWdub3JlJyAtIGlnbm9yZSB0aGUgY2hhcmFjdGVyIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0Ci0gICAgICAgICAgICAgJ3JlcGxhY2UnLSByZXBsYWNlIHdpdGggYSBzdWl0YWJsZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIKLQotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KLSAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKLQotICAgIGRlZiB3cml0ZShzZWxmLG9iamVjdCk6Ci0KLSAgICAgICAgIiIiIFdyaXRlcyB0aGUgb2JqZWN0J3MgY29udGVudHMgZW5jb2RlZCB0byBzZWxmLnN0cmVhbS4KLSAgICAgICAgIiIiCi0gICAgICAgIGRhdGEsIGNvbnN1bWVkID0gc2VsZi5lbmNvZGUob2JqZWN0LHNlbGYuZXJyb3JzKQotICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQotICAgICAgICAKLSAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBsaXN0KToKLQotICAgICAgICAiIiIgV3JpdGVzIHRoZSBjb25jYXRlbmF0ZWQgbGlzdCBvZiBzdHJpbmdzIHRvIHRoZSBzdHJlYW0KLSAgICAgICAgICAgIHVzaW5nIC53cml0ZSgpLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi53cml0ZSgnJy5qb2luKGxpc3QpKQotICAgICAgICAKLSAgICBkZWYgcmVzZXQoc2VsZik6Ci0KLSAgICAgICAgIiIiIEZsdXNoZXMgYW5kIHJlc2V0cyB0aGUgY29kZWMgYnVmZmVycyB1c2VkIGZvciBrZWVwaW5nIHN0YXRlLgotCi0gICAgICAgICAgICBDYWxsaW5nIHRoaXMgbWV0aG9kIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgZGF0YSBvbiB0aGUKLSAgICAgICAgICAgIG91dHB1dCBpcyBwdXQgaW50byBhIGNsZWFuIHN0YXRlLCB0aGF0IGFsbG93cyBhcHBlbmRpbmcKLSAgICAgICAgICAgIG9mIG5ldyBmcmVzaCBkYXRhIHdpdGhvdXQgaGF2aW5nIHRvIHJlc2NhbiB0aGUgd2hvbGUKLSAgICAgICAgICAgIHN0cmVhbSB0byByZWNvdmVyIHN0YXRlLgotCi0gICAgICAgICIiIgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgX19nZXRhdHRyX18oc2VsZixuYW1lLAotCi0gICAgICAgICAgICAgICAgICAgIGdldGF0dHI9Z2V0YXR0cik6Ci0KLSAgICAgICAgIiIiIEluaGVyaXQgYWxsIG90aGVyIG1ldGhvZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCi0gICAgICAgICIiIgotICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnN0cmVhbSxuYW1lKQotCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsc3RyZWFtLGVycm9ycz0nc3RyaWN0Jyk6Ci0KLSAgICAgICAgIiIiIENyZWF0ZXMgYSBTdHJlYW1SZWFkZXIgaW5zdGFuY2UuCi0KLSAgICAgICAgICAgIHN0cmVhbSBtdXN0IGJlIGEgZmlsZS1saWtlIG9iamVjdCBvcGVuIGZvciByZWFkaW5nCi0gICAgICAgICAgICAoYmluYXJ5KSBkYXRhLgotCi0gICAgICAgICAgICBUaGUgU3RyZWFtUmVhZGVyIG1heSBpbXBsZW1lbnQgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nCi0gICAgICAgICAgICBzY2hlbWVzIGJ5IHByb3ZpZGluZyB0aGUgZXJyb3JzIGtleXdvcmQgYXJndW1lbnQuIFRoZXNlCi0gICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBkZWZpbmVkOgotCi0gICAgICAgICAgICAgJ3N0cmljdCcgLSByYWlzZSBhIFZhbHVlRXJyb3IgKG9yIGEgc3ViY2xhc3MpCi0gICAgICAgICAgICAgJ2lnbm9yZScgLSBpZ25vcmUgdGhlIGNoYXJhY3RlciBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dAotICAgICAgICAgICAgICdyZXBsYWNlJy0gcmVwbGFjZSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyOwotCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQotICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycwotCi0gICAgZGVmIHJlYWQoc2VsZixzaXplPS0xKToKLQotICAgICAgICAiIiIgRGVjb2RlcyBkYXRhIGZyb20gdGhlIHN0cmVhbSBzZWxmLnN0cmVhbSBhbmQgcmV0dXJucyB0aGUKLSAgICAgICAgICAgIHJlc3VsdGluZyBvYmplY3QuCi0KLSAgICAgICAgICAgIHNpemUgaW5kaWNhdGVzIHRoZSBhcHByb3hpbWF0ZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0bwotICAgICAgICAgICAgcmVhZCBmcm9tIHRoZSBzdHJlYW0gZm9yIGRlY29kaW5nIHB1cnBvc2VzLiBUaGUgZGVjb2RlcgotICAgICAgICAgICAgY2FuIG1vZGlmeSB0aGlzIHNldHRpbmcgYXMgYXBwcm9wcmlhdGUuIFRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAtMSBpbmRpY2F0ZXMgdG8gcmVhZCBhbmQgZGVjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUuICBzaXplCi0gICAgICAgICAgICBpcyBpbnRlbmRlZCB0byBwcmV2ZW50IGhhdmluZyB0byBkZWNvZGUgaHVnZSBmaWxlcyBpbiBvbmUKLSAgICAgICAgICAgIHN0ZXAuCi0KLSAgICAgICAgICAgIFRoZSBtZXRob2Qgc2hvdWxkIHVzZSBhIGdyZWVkeSByZWFkIHN0cmF0ZWd5IG1lYW5pbmcgdGhhdAotICAgICAgICAgICAgaXQgc2hvdWxkIHJlYWQgYXMgbXVjaCBkYXRhIGFzIGlzIGFsbG93ZWQgd2l0aGluIHRoZQotICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiB0aGUgZW5jb2RpbmcgYW5kIHRoZSBnaXZlbiBzaXplLCBlLmcuICBpZgotICAgICAgICAgICAgb3B0aW9uYWwgZW5jb2RpbmcgZW5kaW5ncyBvciBzdGF0ZSBtYXJrZXJzIGFyZSBhdmFpbGFibGUKLSAgICAgICAgICAgIG9uIHRoZSBzdHJlYW0sIHRoZXNlIHNob3VsZCBiZSByZWFkIHRvby4KLQotICAgICAgICAiIiIKLSAgICAgICAgIyBVbnNsaWNlZCByZWFkaW5nOgotICAgICAgICBpZiBzaXplIDwgMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY29kZShzZWxmLnN0cmVhbS5yZWFkKCkpWzBdCi0gICAgICAgIAotICAgICAgICAjIFNsaWNlZCByZWFkaW5nOgotICAgICAgICByZWFkID0gc2VsZi5zdHJlYW0ucmVhZAotICAgICAgICBkZWNvZGUgPSBzZWxmLmRlY29kZQotICAgICAgICBkYXRhID0gcmVhZChzaXplKQotICAgICAgICBpID0gMAotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG9iamVjdCwgZGVjb2RlZGJ5dGVzID0gZGVjb2RlKGRhdGEpCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcix3aHk6Ci0gICAgICAgICAgICAgICAgIyBUaGlzIG1ldGhvZCBpcyBzbG93IGJ1dCBzaG91bGQgd29yayB1bmRlciBwcmV0dHkgbXVjaAotICAgICAgICAgICAgICAgICMgYWxsIGNvbmRpdGlvbnM7IGF0IG1vc3QgMTAgdHJpZXMgYXJlIG1hZGUKLSAgICAgICAgICAgICAgICBpID0gaSArIDEKLSAgICAgICAgICAgICAgICBuZXdkYXRhID0gcmVhZCgxKQotICAgICAgICAgICAgICAgIGlmIG5vdCBuZXdkYXRhIG9yIGkgPiAxMDoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSArIG5ld2RhdGEKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdAotCi0gICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9Tm9uZSk6Ci0KLSAgICAgICAgIiIiIFJlYWQgb25lIGxpbmUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGFuZCByZXR1cm4gdGhlCi0gICAgICAgICAgICBkZWNvZGVkIGRhdGEuCi0KLSAgICAgICAgICAgIE5vdGU6IFVubGlrZSB0aGUgLnJlYWRsaW5lcygpIG1ldGhvZCwgdGhpcyBtZXRob2QgaW5oZXJpdHMKLSAgICAgICAgICAgIHRoZSBsaW5lIGJyZWFraW5nIGtub3dsZWRnZSBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSdzCi0gICAgICAgICAgICAucmVhZGxpbmUoKSBtZXRob2QgLS0gdGhlcmUgaXMgY3VycmVudGx5IG5vIHN1cHBvcnQgZm9yCi0gICAgICAgICAgICBsaW5lIGJyZWFraW5nIHVzaW5nIHRoZSBjb2RlYyBkZWNvZGVyIGR1ZSB0byBsYWNrIG9mIGxpbmUKLSAgICAgICAgICAgIGJ1ZmZlcmluZy4gU3ViY2xhc3NlcyBzaG91bGQgaG93ZXZlciwgaWYgcG9zc2libGUsIHRyeSB0bwotICAgICAgICAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHVzaW5nIHRoZWlyIG93biBrbm93bGVkZ2Ugb2YgbGluZQotICAgICAgICAgICAgYnJlYWtpbmcuCi0KLSAgICAgICAgICAgIHNpemUsIGlmIGdpdmVuLCBpcyBwYXNzZWQgYXMgc2l6ZSBhcmd1bWVudCB0byB0aGUgc3RyZWFtJ3MKLSAgICAgICAgICAgIC5yZWFkbGluZSgpIG1ldGhvZC4KLSAgICAgICAgICAgIAotICAgICAgICAiIiIKLSAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgotICAgICAgICAgICAgbGluZSA9IHNlbGYuc3RyZWFtLnJlYWRsaW5lKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxpbmUgPSBzZWxmLnN0cmVhbS5yZWFkbGluZShzaXplKQotICAgICAgICByZXR1cm4gc2VsZi5kZWNvZGUobGluZSlbMF0KLQotICAgIGRlZiByZWFkbGluZXMoc2VsZiwgc2l6ZWhpbnQ9MCk6Ci0KLSAgICAgICAgIiIiIFJlYWQgYWxsIGxpbmVzIGF2YWlsYWJsZSBvbiB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICAgICAgICBhbmQgcmV0dXJuIHRoZW0gYXMgbGlzdCBvZiBsaW5lcy4KLQotICAgICAgICAgICAgTGluZSBicmVha3MgYXJlIGltcGxlbWVudGVkIHVzaW5nIHRoZSBjb2RlYydzIGRlY29kZXIKLSAgICAgICAgICAgIG1ldGhvZCBhbmQgYXJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IGVudHJpZXMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNpemVoaW50LCBpZiBnaXZlbiwgaXMgcGFzc2VkIGFzIHNpemUgYXJndW1lbnQgdG8gdGhlCi0gICAgICAgICAgICBzdHJlYW0ncyAucmVhZCgpIG1ldGhvZC4KLQotICAgICAgICAiIiIKLSAgICAgICAgaWYgc2l6ZWhpbnQgaXMgTm9uZToKLSAgICAgICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5yZWFkKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5yZWFkKHNpemVoaW50KQotICAgICAgICByZXR1cm4gc2VsZi5kZWNvZGUoZGF0YSlbMF0uc3BsaXRsaW5lcygxKQotCi0gICAgZGVmIHJlc2V0KHNlbGYpOgotCi0gICAgICAgICIiIiBSZXNldHMgdGhlIGNvZGVjIGJ1ZmZlcnMgdXNlZCBmb3Iga2VlcGluZyBzdGF0ZS4KLQotICAgICAgICAgICAgTm90ZSB0aGF0IG5vIHN0cmVhbSByZXBvc2l0aW9uaW5nIHNob3VsZCB0YWtlIHBsYWNlLgotICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGJlIGFibGUgdG8gcmVjb3ZlcgotICAgICAgICAgICAgZnJvbSBkZWNvZGluZyBlcnJvcnMuCi0KLSAgICAgICAgIiIiCi0gICAgICAgIHBhc3MKLQotICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLG5hbWUsCi0KLSAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cj1nZXRhdHRyKToKLQotICAgICAgICAiIiIgSW5oZXJpdCBhbGwgb3RoZXIgbWV0aG9kcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICAgICAgIiIiCi0gICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc3RyZWFtLG5hbWUpCi0KLQotU3RyZWFtIGNvZGVjIGltcGxlbWVudG9ycyBhcmUgZnJlZSB0byBjb21iaW5lIHRoZSBTdHJlYW1Xcml0ZXIgYW5kCi1TdHJlYW1SZWFkZXIgaW50ZXJmYWNlcyBpbnRvIG9uZSBjbGFzcy4gRXZlbiBjb21iaW5pbmcgYWxsIHRoZXNlIHdpdGgKLXRoZSBDb2RlYyBjbGFzcyBzaG91bGQgYmUgcG9zc2libGUuCi0KLUltcGxlbWVudG9ycyBhcmUgZnJlZSB0byBhZGQgYWRkaXRpb25hbCBtZXRob2RzIHRvIGVuaGFuY2UgdGhlIGNvZGVjCi1mdW5jdGlvbmFsaXR5IG9yIHByb3ZpZGUgZXh0cmEgc3RhdGUgaW5mb3JtYXRpb24gbmVlZGVkIGZvciB0aGVtIHRvCi13b3JrLiBUaGUgaW50ZXJuYWwgY29kZWMgaW1wbGVtZW50YXRpb24gd2lsbCBvbmx5IHVzZSB0aGUgYWJvdmUKLWludGVyZmFjZXMsIHRob3VnaC4KLQotSXQgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBVbmljb2RlIGltcGxlbWVudGF0aW9uIHRvIHVzZSB0aGVzZSBiYXNlCi1jbGFzc2VzLCBvbmx5IHRoZSBpbnRlcmZhY2VzIG11c3QgbWF0Y2g7IHRoaXMgYWxsb3dzIHdyaXRpbmcgQ29kZWNzIGFzCi1leHRlbnNpb24gdHlwZXMuCi0KLUFzIGd1aWRlbGluZSwgbGFyZ2UgbWFwcGluZyB0YWJsZXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIHVzaW5nIHN0YXRpYwotQyBkYXRhIGluIHNlcGFyYXRlIChzaGFyZWQpIGV4dGVuc2lvbiBtb2R1bGVzLiBUaGF0IHdheSBtdWx0aXBsZQotcHJvY2Vzc2VzIGNhbiBzaGFyZSB0aGUgc2FtZSBkYXRhLgotCi1BIHRvb2wgdG8gYXV0by1jb252ZXJ0IFVuaWNvZGUgbWFwcGluZyBmaWxlcyB0byBtYXBwaW5nIG1vZHVsZXMgc2hvdWxkIGJlCi1wcm92aWRlZCB0byBzaW1wbGlmeSBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIG1hcHBpbmdzIChzZWUgUmVmZXJlbmNlcykuCi0KLQotV2hpdGVzcGFjZToKLS0tLS0tLS0tLS0tCi0KLVRoZSAuc3BsaXQoKSBtZXRob2Qgd2lsbCBoYXZlIHRvIGtub3cgYWJvdXQgd2hhdCBpcyBjb25zaWRlcmVkCi13aGl0ZXNwYWNlIGluIFVuaWNvZGUuCi0KLQotQ2FzZSBDb252ZXJzaW9uOgotLS0tLS0tLS0tLS0tLS0tLQotCi1DYXNlIGNvbnZlcnNpb24gaXMgcmF0aGVyIGNvbXBsaWNhdGVkIHdpdGggVW5pY29kZSBkYXRhLCBzaW5jZSB0aGVyZQotYXJlIG1hbnkgZGlmZmVyZW50IGNvbmRpdGlvbnMgdG8gcmVzcGVjdC4gU2VlCi0KLSAgaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL3JlcG9ydHMvdHIxMy8gCi0KLWZvciBzb21lIGd1aWRlbGluZXMgb24gaW1wbGVtZW50aW5nIGNhc2UgY29udmVyc2lvbi4KLQotRm9yIFB5dGhvbiwgd2Ugc2hvdWxkIG9ubHkgaW1wbGVtZW50IHRoZSAxLTEgY29udmVyc2lvbnMgaW5jbHVkZWQgaW4KLVVuaWNvZGUuIExvY2FsZSBkZXBlbmRlbnQgYW5kIG90aGVyIHNwZWNpYWwgY2FzZSBjb252ZXJzaW9ucyAoc2VlIHRoZQotVW5pY29kZSBzdGFuZGFyZCBmaWxlIFNwZWNpYWxDYXNpbmcudHh0KSBzaG91bGQgYmUgbGVmdCB0byB1c2VyIGxhbmQKLXJvdXRpbmVzIGFuZCBub3QgZ28gaW50byB0aGUgY29yZSBpbnRlcnByZXRlci4KLQotVGhlIG1ldGhvZHMgLmNhcGl0YWxpemUoKSBhbmQgLmlzY2FwaXRhbGl6ZWQoKSBzaG91bGQgZm9sbG93IHRoZSBjYXNlCi1tYXBwaW5nIGFsZ29yaXRobSBkZWZpbmVkIGluIHRoZSBhYm92ZSB0ZWNobmljYWwgcmVwb3J0IGFzIGNsb3NlbHkgYXMKLXBvc3NpYmxlLgotCi0KLUxpbmUgQnJlYWtzOgotLS0tLS0tLS0tLS0tCi0KLUxpbmUgYnJlYWtpbmcgc2hvdWxkIGJlIGRvbmUgZm9yIGFsbCBVbmljb2RlIGNoYXJhY3RlcnMgaGF2aW5nIHRoZSBCCi1wcm9wZXJ0eSBhcyB3ZWxsIGFzIHRoZSBjb21iaW5hdGlvbnMgQ1JMRiwgQ1IsIExGIChpbnRlcnByZXRlZCBpbiB0aGF0Ci1vcmRlcikgYW5kIG90aGVyIHNwZWNpYWwgbGluZSBzZXBhcmF0b3JzIGRlZmluZWQgYnkgdGhlIHN0YW5kYXJkLgotCi1UaGUgVW5pY29kZSB0eXBlIHNob3VsZCBwcm92aWRlIGEgLnNwbGl0bGluZXMoKSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhCi1saXN0IG9mIGxpbmVzIGFjY29yZGluZyB0byB0aGUgYWJvdmUgc3BlY2lmaWNhdGlvbi4gU2VlIFVuaWNvZGUKLU1ldGhvZHMuCi0KLQotVW5pY29kZSBDaGFyYWN0ZXIgUHJvcGVydGllczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUEgc2VwYXJhdGUgbW9kdWxlICJ1bmljb2RlZGF0YSIgc2hvdWxkIHByb3ZpZGUgYSBjb21wYWN0IGludGVyZmFjZSB0bwotYWxsIFVuaWNvZGUgY2hhcmFjdGVyIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQncwotVW5pY29kZURhdGEudHh0IGZpbGUuCi0KLUFtb25nIG90aGVyIHRoaW5ncywgdGhlc2UgcHJvcGVydGllcyBwcm92aWRlIHdheXMgdG8gcmVjb2duaXplCi1udW1iZXJzLCBkaWdpdHMsIHNwYWNlcywgd2hpdGVzcGFjZSwgZXRjLgotCi1TaW5jZSB0aGlzIG1vZHVsZSB3aWxsIGhhdmUgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gYWxsIFVuaWNvZGUKLWNoYXJhY3RlcnMsIGl0IHdpbGwgZXZlbnR1YWxseSBoYXZlIHRvIGNvbnRhaW4gdGhlIGRhdGEgZnJvbQotVW5pY29kZURhdGEudHh0IHdoaWNoIHRha2VzIHVwIGFyb3VuZCA2MDBrQi4gRm9yIHRoaXMgcmVhc29uLCB0aGUgZGF0YQotc2hvdWxkIGJlIHN0b3JlZCBpbiBzdGF0aWMgQyBkYXRhLiBUaGlzIGVuYWJsZXMgY29tcGlsYXRpb24gYXMgc2hhcmVkCi1tb2R1bGUgd2hpY2ggdGhlIHVuZGVybHlpbmcgT1MgY2FuIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcyAodW5saWtlCi1ub3JtYWwgUHl0aG9uIGNvZGUgbW9kdWxlcykuCi0KLVRoZXJlIHNob3VsZCBiZSBhIHN0YW5kYXJkIFB5dGhvbiBpbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyB0aGlzIGluZm9ybWF0aW9uCi1zbyB0aGF0IG90aGVyIGltcGxlbWVudG9ycyBjYW4gcGx1ZyBpbiB0aGVpciBvd24gcG9zc2libHkgZW5oYW5jZWQgdmVyc2lvbnMsCi1lLmcuIG9uZXMgdGhhdCBkbyBkZWNvbXByZXNzaW5nIG9mIHRoZSBkYXRhIG9uLXRoZS1mbHkuCi0KLQotUHJpdmF0ZSBDb2RlIFBvaW50IEFyZWFzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TdXBwb3J0IGZvciB0aGVzZSBpcyBsZWZ0IHRvIHVzZXIgbGFuZCBDb2RlY3MgYW5kIG5vdCBleHBsaWNpdGx5Ci1pbnRlZ3JhdGVkIGludG8gdGhlIGNvcmUuIE5vdGUgdGhhdCBkdWUgdG8gdGhlIEludGVybmFsIEZvcm1hdCBiZWluZwotaW1wbGVtZW50ZWQsIG9ubHkgdGhlIGFyZWEgYmV0d2VlbiBcdUUwMDAgYW5kIFx1RjhGRiBpcyB1c2FibGUgZm9yCi1wcml2YXRlIGVuY29kaW5ncy4KLQotCi1JbnRlcm5hbCBGb3JtYXQ6Ci0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBpbnRlcm5hbCBmb3JtYXQgZm9yIFVuaWNvZGUgb2JqZWN0cyBzaG91bGQgdXNlIGEgUHl0aG9uIHNwZWNpZmljCi1maXhlZCBmb3JtYXQgPFB5dGhvblVuaWNvZGU+IGltcGxlbWVudGVkIGFzICd1bnNpZ25lZCBzaG9ydCcgKG9yCi1hbm90aGVyIHVuc2lnbmVkIG51bWVyaWMgdHlwZSBoYXZpbmcgMTYgYml0cykuIEJ5dGUgb3JkZXIgaXMgcGxhdGZvcm0KLWRlcGVuZGVudC4KLQotVGhpcyBmb3JtYXQgd2lsbCBob2xkIFVURi0xNiBlbmNvZGluZ3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgVW5pY29kZQotb3JkaW5hbHMuIFRoZSBQeXRob24gVW5pY29kZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGFkZHJlc3MgdGhlc2UgdmFsdWVzCi1hcyBpZiB0aGV5IHdlcmUgVUNTLTIgdmFsdWVzLiBVQ1MtMiBhbmQgVVRGLTE2IGFyZSB0aGUgc2FtZSBmb3IgYWxsCi1jdXJyZW50bHkgZGVmaW5lZCBVbmljb2RlIGNoYXJhY3RlciBwb2ludHMuIFVURi0xNiB3aXRob3V0IHN1cnJvZ2F0ZXMKLXByb3ZpZGVzIGFjY2VzcyB0byBhYm91dCA2NGsgY2hhcmFjdGVycyBhbmQgY292ZXJzIGFsbCBjaGFyYWN0ZXJzIGluCi10aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChCTVApIG9mIFVuaWNvZGUuCi0KLUl0IGlzIHRoZSBDb2RlYydzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhIHRoZXkgcGFzcyB0bwotdGhlIFVuaWNvZGUgb2JqZWN0IGNvbnN0cnVjdG9yIHJlc3BlY3RzIHRoaXMgYXNzdW1wdGlvbi4gVGhlCi1jb25zdHJ1Y3RvciBkb2VzIG5vdCBjaGVjayB0aGUgZGF0YSBmb3IgVW5pY29kZSBjb21wbGlhbmNlIG9yIHVzZSBvZgotc3Vycm9nYXRlcy4KLQotRnV0dXJlIGltcGxlbWVudGF0aW9ucyBjYW4gZXh0ZW5kIHRoZSAzMiBiaXQgcmVzdHJpY3Rpb24gdG8gdGhlIGZ1bGwKLXNldCBvZiBhbGwgVVRGLTE2IGFkZHJlc3NhYmxlIGNoYXJhY3RlcnMgKGFyb3VuZCAxTSBjaGFyYWN0ZXJzKS4KLQotVGhlIFVuaWNvZGUgQVBJIHNob3VsZCBwcm92aWRlIGludGVyZmFjZSByb3V0aW5lcyBmcm9tIDxQeXRob25Vbmljb2RlPgotdG8gdGhlIGNvbXBpbGVyJ3Mgd2NoYXJfdCB3aGljaCBjYW4gYmUgMTYgb3IgMzIgYml0IGRlcGVuZGluZyBvbiB0aGUKLWNvbXBpbGVyL2xpYmMvcGxhdGZvcm0gYmVpbmcgdXNlZC4KLQotVW5pY29kZSBvYmplY3RzIHNob3VsZCBoYXZlIGEgcG9pbnRlciB0byBhIGNhY2hlZCBQeXRob24gc3RyaW5nIG9iamVjdAotPGRlZmVuYz4gaG9sZGluZyB0aGUgb2JqZWN0J3MgdmFsdWUgdXNpbmcgdGhlIDxkZWZhdWx0IGVuY29kaW5nPi4KLVRoaXMgaXMgbmVlZGVkIGZvciBwZXJmb3JtYW5jZSBhbmQgaW50ZXJuYWwgcGFyc2luZyAoc2VlIEludGVybmFsCi1Bcmd1bWVudCBQYXJzaW5nKSByZWFzb25zLiBUaGUgYnVmZmVyIGlzIGZpbGxlZCB3aGVuIHRoZSBmaXJzdAotY29udmVyc2lvbiByZXF1ZXN0IHRvIHRoZSA8ZGVmYXVsdCBlbmNvZGluZz4gaXMgaXNzdWVkIG9uIHRoZSBvYmplY3QuCi0KLUludGVybmluZyBpcyBub3QgbmVlZGVkIChmb3Igbm93KSwgc2luY2UgUHl0aG9uIGlkZW50aWZpZXJzIGFyZQotZGVmaW5lZCBhcyBiZWluZyBBU0NJSSBvbmx5LgotCi1jb2RlY3MuQk9NIHNob3VsZCByZXR1cm4gdGhlIGJ5dGUgb3JkZXIgbWFyayAoQk9NKSBmb3IgdGhlIGZvcm1hdAotdXNlZCBpbnRlcm5hbGx5LiBUaGUgY29kZWNzIG1vZHVsZSBzaG91bGQgcHJvdmlkZSB0aGUgZm9sbG93aW5nCi1hZGRpdGlvbmFsIGNvbnN0YW50cyBmb3IgY29udmVuaWVuY2UgYW5kIHJlZmVyZW5jZSAoY29kZWNzLkJPTSB3aWxsCi1laXRoZXIgYmUgQk9NX0JFIG9yIEJPTV9MRSBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtKToKLQotICBCT01fQkU6ICdcMzc2XDM3NycgCi0gICAgKGNvcnJlc3BvbmRzIHRvIFVuaWNvZGUgVSswMDAwRkVGRiBpbiBVVEYtMTYgb24gYmlnIGVuZGlhbgotICAgICBwbGF0Zm9ybXMgPT0gWkVSTyBXSURUSCBOTy1CUkVBSyBTUEFDRSkKLQotICBCT01fTEU6ICdcMzc3XDM3NicgCi0gICAgKGNvcnJlc3BvbmRzIHRvIFVuaWNvZGUgVSswMDAwRkZGRSBpbiBVVEYtMTYgb24gbGl0dGxlIGVuZGlhbgotICAgICBwbGF0Zm9ybXMgPT0gZGVmaW5lZCBhcyBiZWluZyBhbiBpbGxlZ2FsIFVuaWNvZGUgY2hhcmFjdGVyKQotCi0gIEJPTTRfQkU6ICdcMDAwXDAwMFwzNzZcMzc3JwotICAgIChjb3JyZXNwb25kcyB0byBVbmljb2RlIFUrMDAwMEZFRkYgaW4gVUNTLTQpCi0KLSAgQk9NNF9MRTogJ1wzNzdcMzc2XDAwMFwwMDAnCi0gICAgKGNvcnJlc3BvbmRzIHRvIFVuaWNvZGUgVSswMDAwRkZGRSBpbiBVQ1MtNCkKLQotTm90ZSB0aGF0IFVuaWNvZGUgc2VlcyBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIgYXMgYmVpbmcgImNvcnJlY3QiLiBUaGUKLXN3YXBwZWQgb3JkZXIgaXMgdGFrZW4gdG8gYmUgYW4gaW5kaWNhdG9yIGZvciBhICJ3cm9uZyIgZm9ybWF0LCBoZW5jZQotdGhlIGlsbGVnYWwgY2hhcmFjdGVyIGRlZmluaXRpb24uCi0KLVRoZSBjb25maWd1cmUgc2NyaXB0IHNob3VsZCBwcm92aWRlIGFpZCBpbiBkZWNpZGluZyB3aGV0aGVyIFB5dGhvbiBjYW4KLXVzZSB0aGUgbmF0aXZlIHdjaGFyX3QgdHlwZSBvciBub3QgKGl0IGhhcyB0byBiZSBhIDE2LWJpdCB1bnNpZ25lZAotdHlwZSkuCi0KLQotQnVmZmVyIEludGVyZmFjZToKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUltcGxlbWVudCB0aGUgYnVmZmVyIGludGVyZmFjZSB1c2luZyB0aGUgPGRlZmVuYz4gUHl0aG9uIHN0cmluZyBvYmplY3QKLWFzIGJhc2lzIGZvciBiZl9nZXRjaGFyYnVmIGFuZCB0aGUgaW50ZXJuYWwgYnVmZmVyIGZvcgotYmZfZ2V0cmVhZGJ1Zi4gSWYgYmZfZ2V0Y2hhcmJ1ZiBpcyByZXF1ZXN0ZWQgYW5kIHRoZSA8ZGVmZW5jPiBvYmplY3QKLWRvZXMgbm90IHlldCBleGlzdCwgaXQgaXMgY3JlYXRlZCBmaXJzdC4KLQotTm90ZSB0aGF0IGFzIHNwZWNpYWwgY2FzZSwgdGhlIHBhcnNlciBtYXJrZXIgInMjIiB3aWxsIG5vdCByZXR1cm4gcmF3Ci1Vbmljb2RlIFVURi0xNiBkYXRhICh3aGljaCB0aGUgYmZfZ2V0cmVhZGJ1ZiByZXR1cm5zKSwgYnV0IGluc3RlYWQKLXRyaWVzIHRvIGVuY29kZSB0aGUgVW5pY29kZSBvYmplY3QgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcgYW5kIHRoZW4KLXJldHVybnMgYSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9iamVjdCAob3IgcmFpc2VzIGFuCi1leGNlcHRpb24gaW4gY2FzZSB0aGUgY29udmVyc2lvbiBmYWlscykuIFRoaXMgd2FzIGRvbmUgaW4gb3JkZXIgdG8KLXByZXZlbnQgYWNjaWRlbnRlbHkgd3JpdGluZyBiaW5hcnkgZGF0YSB0byBhbiBvdXRwdXQgc3RyZWFtIHdoaWNoIHRoZQotb3RoZXIgZW5kIG1pZ2h0IG5vdCByZWNvZ25pemUuCi0KLVRoaXMgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgYmVpbmcgYWJsZSB0byB3cml0ZSB0byBvdXRwdXQgc3RyZWFtcyAod2hpY2gKLXR5cGljYWxseSB1c2UgdGhpcyBpbnRlcmZhY2UpIHdpdGhvdXQgYWRkaXRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZQotZW5jb2RpbmcgdG8gdXNlLgotCi1JZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHJlYWQgYnVmZmVyIGludGVyZmFjZSBvZiBVbmljb2RlIG9iamVjdHMsCi11c2UgdGhlIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcigpIGludGVyZmFjZS4KLQotVGhlIGludGVybmFsIGZvcm1hdCBjYW4gYWxzbyBiZSBhY2Nlc3NlZCB1c2luZyB0aGUgJ3VuaWNvZGUtaW50ZXJuYWwnCi1jb2RlYywgZS5nLiB2aWEgdS5lbmNvZGUoJ3VuaWNvZGUtaW50ZXJuYWwnKS4KLQotCi1QaWNrbGUvTWFyc2hhbGxpbmc6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNob3VsZCBoYXZlIG5hdGl2ZSBVbmljb2RlIG9iamVjdCBzdXBwb3J0LiBUaGUgb2JqZWN0cyBzaG91bGQgYmUKLWVuY29kZWQgdXNpbmcgcGxhdGZvcm0gaW5kZXBlbmRlbnQgZW5jb2RpbmdzLgotCi1NYXJzaGFsIHNob3VsZCB1c2UgVVRGLTggYW5kIFBpY2tsZSBzaG91bGQgZWl0aGVyIGNob29zZQotUmF3LVVuaWNvZGUtRXNjYXBlIChpbiB0ZXh0IG1vZGUpIG9yIFVURi04IChpbiBiaW5hcnkgbW9kZSkgYXMKLWVuY29kaW5nLiBVc2luZyBVVEYtOCBpbnN0ZWFkIG9mIFVURi0xNiBoYXMgdGhlIGFkdmFudGFnZSBvZgotZWxpbWluYXRpbmcgdGhlIG5lZWQgdG8gc3RvcmUgYSBCT00gbWFyay4KLQotCi1SZWd1bGFyIEV4cHJlc3Npb25zOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU2VjcmV0IExhYnMgQUIgaXMgd29ya2luZyBvbiBhIFVuaWNvZGUtYXdhcmUgcmVndWxhciBleHByZXNzaW9uCi1tYWNoaW5lcnkuICBJdCB3b3JrcyBvbiBwbGFpbiA4LWJpdCwgVUNTLTIsIGFuZCAob3B0aW9uYWxseSkgVUNTLTQKLWludGVybmFsIGNoYXJhY3RlciBidWZmZXJzLgotCi1BbHNvIHNlZQotCi0gICAgICAgIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTgvCi0KLWZvciBzb21lIHJlbWFya3Mgb24gaG93IHRvIHRyZWF0IFVuaWNvZGUgUkVzLgotCi0KLUZvcm1hdHRpbmcgTWFya2VyczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRm9ybWF0IG1hcmtlcnMgYXJlIHVzZWQgaW4gUHl0aG9uIGZvcm1hdCBzdHJpbmdzLiBJZiBQeXRob24gc3RyaW5ncwotYXJlIHVzZWQgYXMgZm9ybWF0IHN0cmluZ3MsIHRoZSBmb2xsb3dpbmcgaW50ZXJwcmV0YXRpb25zIHNob3VsZCBiZSBpbgotZWZmZWN0OgotCi0gICclcyc6ICAgICAgICAgICAgICAgICBGb3IgVW5pY29kZSBvYmplY3RzIHRoaXMgd2lsbCBjYXVzZSBjb2VyY2lvbiBvZiB0aGUKLQkJCXdob2xlIGZvcm1hdCBzdHJpbmcgdG8gVW5pY29kZS4gTm90ZSB0aGF0Ci0JCQl5b3Ugc2hvdWxkIHVzZSBhIFVuaWNvZGUgZm9ybWF0IHN0cmluZyB0byBzdGFydAotCQkJd2l0aCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KLQotSW4gY2FzZSB0aGUgZm9ybWF0IHN0cmluZyBpcyBhbiBVbmljb2RlIG9iamVjdCwgYWxsIHBhcmFtZXRlcnMgYXJlIGNvZXJjZWQKLXRvIFVuaWNvZGUgZmlyc3QgYW5kIHRoZW4gcHV0IHRvZ2V0aGVyIGFuZCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQKLXN0cmluZy4gTnVtYmVycyBhcmUgZmlyc3QgY29udmVydGVkIHRvIHN0cmluZ3MgYW5kIHRoZW4gdG8gVW5pY29kZS4KLQotICAnJXMnOgkJCVB5dGhvbiBzdHJpbmdzIGFyZSBpbnRlcnByZXRlZCBhcyBVbmljb2RlCi0JCQlzdHJpbmcgdXNpbmcgdGhlIDxkZWZhdWx0IGVuY29kaW5nPi4gVW5pY29kZQotCQkJb2JqZWN0cyBhcmUgdGFrZW4gYXMgaXMuCi0KLUFsbCBvdGhlciBzdHJpbmcgZm9ybWF0dGVycyBzaG91bGQgd29yayBhY2NvcmRpbmdseS4KLQotRXhhbXBsZToKLQotdSIlcyAlcyIgJSAodSJhYmMiLCAiYWJjIikgID09ICB1ImFiYyBhYmMiCi0KLQotSW50ZXJuYWwgQXJndW1lbnQgUGFyc2luZzoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZXNlIG1hcmtlcnMgYXJlIHVzZWQgYnkgdGhlIFB5QXJnX1BhcnNlVHVwbGUoKSBBUElzOgotCi0gICJVIjogIENoZWNrIGZvciBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdAotCi0gICJzIjogIEZvciBVbmljb2RlIG9iamVjdHM6IHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCdzCi0JPGRlZmVuYz4gYnVmZmVyICh3aGljaCB1c2VzIHRoZSA8ZGVmYXVsdCBlbmNvZGluZz4pLgotCi0gICJzIyI6IEFjY2VzcyB0byB0aGUgZGVmYXVsdCBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIFVuaWNvZGUgb2JqZWN0Ci0gICAgICAgIChzZWUgQnVmZmVyIEludGVyZmFjZSk7IG5vdGUgdGhhdCB0aGUgbGVuZ3RoIHJlbGF0ZXMgdG8gdGhlIGxlbmd0aAotCW9mIHRoZSBkZWZhdWx0IGVuY29kZWQgc3RyaW5nIHJhdGhlciB0aGFuIHRoZSBVbmljb2RlIG9iamVjdCBsZW5ndGguCi0KLSAgInQjIjogU2FtZSBhcyAicyMiLgotCi0gICJlcyI6IAotCVRha2VzIHR3byBwYXJhbWV0ZXJzOiBlbmNvZGluZyAoY29uc3QgY2hhciAqKSBhbmQKLQlidWZmZXIgKGNoYXIgKiopLiAKLQotCVRoZSBpbnB1dCBvYmplY3QgaXMgZmlyc3QgY29lcmNlZCB0byBVbmljb2RlIGluIHRoZSB1c3VhbCB3YXkKLQlhbmQgdGhlbiBlbmNvZGVkIGludG8gYSBzdHJpbmcgdXNpbmcgdGhlIGdpdmVuIGVuY29kaW5nLgotCi0JT24gb3V0cHV0LCBhIGJ1ZmZlciBvZiB0aGUgbmVlZGVkIHNpemUgaXMgYWxsb2NhdGVkIGFuZAotCXJldHVybmVkIHRocm91Z2ggKmJ1ZmZlciBhcyBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nLgotCVRoZSBlbmNvZGVkIG1heSBub3QgY29udGFpbiBlbWJlZGRlZCBOVUxMIGNoYXJhY3RlcnMuCi0JVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBQeU1lbV9GcmVlKCkKLQl0byBmcmVlIHRoZSBhbGxvY2F0ZWQgKmJ1ZmZlciBhZnRlciB1c2FnZS4KLQotICAiZXMjIjoKLQlUYWtlcyB0aHJlZSBwYXJhbWV0ZXJzOiBlbmNvZGluZyAoY29uc3QgY2hhciAqKSwKLQlidWZmZXIgKGNoYXIgKiopIGFuZCBidWZmZXJfbGVuIChpbnQgKikuCi0JCi0JVGhlIGlucHV0IG9iamVjdCBpcyBmaXJzdCBjb2VyY2VkIHRvIFVuaWNvZGUgaW4gdGhlIHVzdWFsIHdheQotCWFuZCB0aGVuIGVuY29kZWQgaW50byBhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4gZW5jb2RpbmcuCi0KLQlJZiAqYnVmZmVyIGlzIG5vbi1OVUxMLCAqYnVmZmVyX2xlbiBtdXN0IGJlIHNldCB0byBzaXplb2YoYnVmZmVyKQotCW9uIGlucHV0LiBPdXRwdXQgaXMgdGhlbiBjb3BpZWQgdG8gKmJ1ZmZlci4KLQotCUlmICpidWZmZXIgaXMgTlVMTCwgYSBidWZmZXIgb2YgdGhlIG5lZWRlZCBzaXplIGlzCi0JYWxsb2NhdGVkIGFuZCBvdXRwdXQgY29waWVkIGludG8gaXQuICpidWZmZXIgaXMgdGhlbgotCXVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkgYXJlYS4KLQlUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIFB5TWVtX0ZyZWUoKQotCXRvIGZyZWUgdGhlIGFsbG9jYXRlZCAqYnVmZmVyIGFmdGVyIHVzYWdlLgotCi0JSW4gYm90aCBjYXNlcyAqYnVmZmVyX2xlbiBpcyB1cGRhdGVkIHRvIHRoZSBudW1iZXIgb2YKLQljaGFyYWN0ZXJzIHdyaXR0ZW4gKGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMTC1ieXRlKS4KLQlUaGUgb3V0cHV0IGJ1ZmZlciBpcyBhc3N1cmVkIHRvIGJlIE5VTEwtdGVybWluYXRlZC4KLQotRXhhbXBsZXM6Ci0KLVVzaW5nICJlcyMiIHdpdGggYXV0by1hbGxvY2F0aW9uOgotCi0gICAgc3RhdGljIFB5T2JqZWN0ICoKLSAgICB0ZXN0X3BhcnNlcihQeU9iamVjdCAqc2VsZiwKLQkJUHlPYmplY3QgKmFyZ3MpCi0gICAgewotCVB5T2JqZWN0ICpzdHI7Ci0JY29uc3QgY2hhciAqZW5jb2RpbmcgPSAibGF0aW4tMSI7Ci0JY2hhciAqYnVmZmVyID0gTlVMTDsKLQlpbnQgYnVmZmVyX2xlbiA9IDA7Ci0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImVzIzp0ZXN0X3BhcnNlciIsCi0JCQkgICAgICBlbmNvZGluZywgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pKQotCSAgICByZXR1cm4gTlVMTDsKLQlpZiAoIWJ1ZmZlcikgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgImJ1ZmZlciBpcyBOVUxMIik7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLQlzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsIGJ1ZmZlcl9sZW4pOwotCVB5TWVtX0ZyZWUoYnVmZmVyKTsKLQlyZXR1cm4gc3RyOwotICAgIH0KLQotVXNpbmcgImVzIiB3aXRoIGF1dG8tYWxsb2NhdGlvbiByZXR1cm5pbmcgYSBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nOiAgICAKLSAgICAKLSAgICBzdGF0aWMgUHlPYmplY3QgKgotICAgIHRlc3RfcGFyc2VyKFB5T2JqZWN0ICpzZWxmLAotCQlQeU9iamVjdCAqYXJncykKLSAgICB7Ci0JUHlPYmplY3QgKnN0cjsKLQljb25zdCBjaGFyICplbmNvZGluZyA9ICJsYXRpbi0xIjsKLQljaGFyICpidWZmZXIgPSBOVUxMOwotCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJlczp0ZXN0X3BhcnNlciIsCi0JCQkgICAgICBlbmNvZGluZywgJmJ1ZmZlcikpCi0JICAgIHJldHVybiBOVUxMOwotCWlmICghYnVmZmVyKSB7Ci0JICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSAgICAiYnVmZmVyIGlzIE5VTEwiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCXN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKLQlQeU1lbV9GcmVlKGJ1ZmZlcik7Ci0JcmV0dXJuIHN0cjsKLSAgICB9Ci0KLVVzaW5nICJlcyMiIHdpdGggYSBwcmUtYWxsb2NhdGVkIGJ1ZmZlcjoKLSAgICAKLSAgICBzdGF0aWMgUHlPYmplY3QgKgotICAgIHRlc3RfcGFyc2VyKFB5T2JqZWN0ICpzZWxmLAotCQlQeU9iamVjdCAqYXJncykKLSAgICB7Ci0JUHlPYmplY3QgKnN0cjsKLQljb25zdCBjaGFyICplbmNvZGluZyA9ICJsYXRpbi0xIjsKLQljaGFyIF9idWZmZXJbMTBdOwotCWNoYXIgKmJ1ZmZlciA9IF9idWZmZXI7Ci0JaW50IGJ1ZmZlcl9sZW4gPSBzaXplb2YoX2J1ZmZlcik7Ci0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImVzIzp0ZXN0X3BhcnNlciIsCi0JCQkgICAgICBlbmNvZGluZywgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pKQotCSAgICByZXR1cm4gTlVMTDsKLQlpZiAoIWJ1ZmZlcikgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgImJ1ZmZlciBpcyBOVUxMIik7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLQlzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsIGJ1ZmZlcl9sZW4pOwotCXJldHVybiBzdHI7Ci0gICAgfQotCi0KLUZpbGUvU3RyZWFtIE91dHB1dDoKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU2luY2UgZmlsZS53cml0ZShvYmplY3QpIGFuZCBtb3N0IG90aGVyIHN0cmVhbSB3cml0ZXJzIHVzZSB0aGUgInMjIiBvcgotInQjIiBhcmd1bWVudCBwYXJzaW5nIG1hcmtlciBmb3IgcXVlcnlpbmcgdGhlIGRhdGEgdG8gd3JpdGUsIHRoZQotZGVmYXVsdCBlbmNvZGVkIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBVbmljb2RlIG9iamVjdCB3aWxsIGJlIHdyaXR0ZW4KLXRvIHRoZSBzdHJlYW1zIChzZWUgQnVmZmVyIEludGVyZmFjZSkuCi0KLUZvciBleHBsaWNpdCBoYW5kbGluZyBvZiBmaWxlcyB1c2luZyBVbmljb2RlLCB0aGUgc3RhbmRhcmQgc3RyZWFtCi1jb2RlY3MgYXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGNvZGVjcyBtb2R1bGUgc2hvdWxkIGJlIHVzZWQuCi0KLVRoZSBjb2RlY3MgbW9kdWxlIHNob3VsZCBwcm92aWRlIGEgc2hvcnQtY3V0IG9wZW4oZmlsZW5hbWUsbW9kZSxlbmNvZGluZykKLWF2YWlsYWJsZSB3aGljaCBhbHNvIGFzc3VyZXMgdGhhdCBtb2RlIGNvbnRhaW5zIHRoZSAnYicgY2hhcmFjdGVyIHdoZW4KLW5lZWRlZC4KLQotCi1GaWxlL1N0cmVhbSBJbnB1dDoKLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Pbmx5IHRoZSB1c2VyIGtub3dzIHdoYXQgZW5jb2RpbmcgdGhlIGlucHV0IGRhdGEgdXNlcywgc28gbm8gc3BlY2lhbAotbWFnaWMgaXMgYXBwbGllZC4gVGhlIHVzZXIgd2lsbCBoYXZlIHRvIGV4cGxpY2l0bHkgY29udmVydCB0aGUgc3RyaW5nCi1kYXRhIHRvIFVuaWNvZGUgb2JqZWN0cyBhcyBuZWVkZWQgb3IgdXNlIHRoZSBmaWxlIHdyYXBwZXJzIGRlZmluZWQgaW4KLXRoZSBjb2RlY3MgbW9kdWxlIChzZWUgRmlsZS9TdHJlYW0gT3V0cHV0KS4KLQotCi1Vbmljb2RlIE1ldGhvZHMgJiBBdHRyaWJ1dGVzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQWxsIFB5dGhvbiBzdHJpbmcgbWV0aG9kcywgcGx1czoKLQotICAuZW5jb2RlKFtlbmNvZGluZz08ZGVmYXVsdCBlbmNvZGluZz5dWyxlcnJvcnM9InN0cmljdCJdKSAKLSAgICAgLS0+IHNlZSBVbmljb2RlIE91dHB1dAotCi0gIC5zcGxpdGxpbmVzKFtpbmNsdWRlX2JyZWFrcz0wXSkKLSAgICAgLS0+IGJyZWFrcyB0aGUgVW5pY29kZSBzdHJpbmcgaW50byBhIGxpc3Qgb2YgKFVuaWNvZGUpIGxpbmVzOwotICAgICAgICAgcmV0dXJucyB0aGUgbGluZXMgd2l0aCBsaW5lIGJyZWFrcyBpbmNsdWRlZCwgaWYgaW5jbHVkZV9icmVha3MKLSAgICAgICAgIGlzIHRydWUuIFNlZSBMaW5lIEJyZWFrcyBmb3IgYSBzcGVjaWZpY2F0aW9uIG9mIGhvdyBsaW5lIGJyZWFraW5nCi0gICAgICAgICBpcyBkb25lLgotCi0KLUNvZGUgQmFzZToKLS0tLS0tLS0tLS0KLQotV2Ugc2hvdWxkIHVzZSBGcmVkcmlrIEx1bmRoJ3MgVW5pY29kZSBvYmplY3QgaW1wbGVtZW50YXRpb24gYXMgYmFzaXMuCi1JdCBhbHJlYWR5IGltcGxlbWVudHMgbW9zdCBvZiB0aGUgc3RyaW5nIG1ldGhvZHMgbmVlZGVkIGFuZCBwcm92aWRlcyBhCi13ZWxsIHdyaXR0ZW4gY29kZSBiYXNlIHdoaWNoIHdlIGNhbiBidWlsZCB1cG9uLgotCi1UaGUgb2JqZWN0IHNoYXJpbmcgaW1wbGVtZW50ZWQgaW4gRnJlZHJpaydzIGltcGxlbWVudGF0aW9uIHNob3VsZAotYmUgZHJvcHBlZC4KLQotCi1UZXN0IENhc2VzOgotLS0tLS0tLS0tLS0KLQotVGVzdCBjYXNlcyBzaG91bGQgZm9sbG93IHRob3NlIGluIExpYi90ZXN0L3Rlc3Rfc3RyaW5nLnB5IGFuZCBpbmNsdWRlCi1hZGRpdGlvbmFsIGNoZWNrcyBmb3IgdGhlIENvZGVjIFJlZ2lzdHJ5IGFuZCB0aGUgU3RhbmRhcmQgQ29kZWNzLgotCi0KLVJlZmVyZW5jZXM6Ci0tLS0tLS0tLS0tLQotCi1Vbmljb2RlIENvbnNvcnRpdW06Ci0gICAgICAgIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvCi0KLVVuaWNvZGUgRkFROgotICAgICAgICBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvZmFxLwotCi1Vbmljb2RlIDMuMDoKLSAgICAgICAgaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL3N0YW5kYXJkL3ZlcnNpb25zL1VuaWNvZGUzLjAuaHRtbAotCi1Vbmljb2RlLVRlY2hSZXBvcnRzOgotICAgICAgICBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvcmVwb3J0cy90ZWNocmVwb3J0cy5odG1sCi0KLVVuaWNvZGUtTWFwcGluZ3M6Ci0gICAgICAgIGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvCi0KLUludHJvZHVjdGlvbiB0byBVbmljb2RlIChhIGxpdHRsZSBvdXRkYXRlZCBieSBzdGlsbCBuaWNlIHRvIHJlYWQpOgotICAgICAgICBodHRwOi8vd3d3Lm5hZGEua3RoLnNlL2kxOG4vdWNzL3VuaWNvZGUtaXNvMTA2NDYtb3ZpZXcuaHRtbAotCi1Gb3IgY29tcGFyaXNvbjoKLQlJbnRyb2R1Y2luZyBVbmljb2RlIHRvIEVDTUFTY3JpcHQgKGFrYSBKYXZhU2NyaXB0KSAtLQotCWh0dHA6Ly93d3ctNC5pYm0uY29tL3NvZnR3YXJlL2RldmVsb3Blci9saWJyYXJ5L2ludGVybmF0aW9uYWxpemF0aW9uLXN1cHBvcnQuaHRtbAotCi1JQU5BIENoYXJhY3RlciBTZXQgTmFtZXM6Ci0JZnRwOi8vZnRwLmlzaS5lZHUvaW4tbm90ZXMvaWFuYS9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0cwotCi1EaXNjdXNzaW9uIG9mIFVURi04IGFuZCBVbmljb2RlIHN1cHBvcnQgZm9yIFBPU0lYIGFuZCBMaW51eDoKLQlodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdW5pY29kZS5odG1sCi0KLUVuY29kaW5nczoKLQotICAgIE92ZXJ2aWV3OgotICAgICAgICAgICAgaHR0cDovL2N6eWJvcnJhLmNvbS91dGYvCi0KLSAgICBVVEMtMjoKLSAgICAgICAgICAgIGh0dHA6Ly93d3cudWF6b25lLmNvbS9tdWx0aWxpbmcvdW5pY29kZS91Y3MyLmh0bWwKLQotICAgIFVURi03OgotICAgICAgICAgICAgRGVmaW5lZCBpbiBSRkMyMTUyLCBlLmcuCi0gICAgICAgICAgICBodHRwOi8vd3d3LnVhem9uZS5jb20vbXVsdGlsaW5nL21sLWRvY3MvcmZjMjE1Mi50eHQKLQotICAgIFVURi04OgotICAgICAgICAgICAgRGVmaW5lZCBpbiBSRkMyMjc5LCBlLmcuCi0gICAgICAgICAgICBodHRwOi8vaW5mby5pbnRlcm5ldC5pc2kuZWR1L2luLW5vdGVzL3JmYy9maWxlcy9yZmMyMjc5LnR4dAotCi0gICAgVVRGLTE2OgotICAgICAgICAgICAgaHR0cDovL3d3dy51YXpvbmUuY29tL211bHRpbGluZy91bmljb2RlL3dnMm4xMDM1Lmh0bWwKLQotCi1IaXN0b3J5IG9mIHRoaXMgUHJvcG9zYWw6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0xLjc6IEFkZGVkIG5vdGUgYWJvdXQgdGhlIGNoYW5nZWQgYmVoYXZpb3VyIG9mICJzIyIuCi0xLjY6IENoYW5nZWQgPGRlZmVuY3N0cj4gdG8gPGRlZmVuYz4gc2luY2UgdGhpcyBpcyB0aGUgbmFtZSB1c2VkIGluIHRoZQotICAgICBpbXBsZW1lbnRhdGlvbi4gQWRkZWQgbm90ZXMgYWJvdXQgdGhlIHVzYWdlIG9mIDxkZWZlbmM+IGluIHRoZQotICAgICBidWZmZXIgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24uCi0xLjU6IEFkZGVkIG5vdGVzIGFib3V0IHNldHRpbmcgdGhlIDxkZWZhdWx0IGVuY29kaW5nPi4gRml4ZWQgc29tZQotICAgICB0eXBvcyAodGhhbmtzIHRvIEFuZHJldyBLdWNobGluZykuIENoYW5nZWQgPGRlZmVuY3N0cj4gdG8gPHV0ZjhzdHI+LgotMS40OiBBZGRlZCBub3RlIGFib3V0IG1peGVkIHR5cGUgY29tcGFyaXNvbnMgYW5kIGNvbnRhaW5zIHRlc3RzLgotICAgICBDaGFuZ2VkIHRyZWF0aW5nIG9mIFVuaWNvZGUgb2JqZWN0cyBpbiBmb3JtYXQgc3RyaW5ncyAoaWYgdXNlZAotICAgICB3aXRoICclcycgJSB1IHRoZXkgd2lsbCBub3cgY2F1c2UgdGhlIGZvcm1hdCBzdHJpbmcgdG8gYmUKLSAgICAgY29lcmNlZCB0byBVbmljb2RlLCB0aHVzIHByb2R1Y2luZyBhIFVuaWNvZGUgb2JqZWN0IG9uIHJldHVybikuCi0gICAgIEFkZGVkIGxpbmsgdG8gSUFOQSBjaGFyc2V0IG5hbWVzICh0aGFua3MgdG8gTGFycyBNYXJpdXMgR2Fyc2hvbCkuCi0gICAgIEFkZGVkIG5ldyBjb2RlYyBtZXRob2RzIC5yZWFkbGluZSgpLCAucmVhZGxpbmVzKCkgYW5kIC53cml0ZWxpbmVzKCkuCi0xLjM6IEFkZGVkIG5ldyAiZXMiIGFuZCAiZXMjIiBwYXJzZXIgbWFya2VycwotMS4yOiBSZW1vdmVkIFBPRCBhYm91dCBjb2RlY3Mub3BlbigpCi0xLjE6IEFkZGVkIG5vdGUgYWJvdXQgY29tcGFyaXNvbnMgYW5kIGhhc2ggdmFsdWVzLiBBZGRlZCBub3RlIGFib3V0Ci0gICAgIGNhc2UgbWFwcGluZyBhbGdvcml0aG1zLiBDaGFuZ2VkIHN0cmVhbSBjb2RlY3MgLnJlYWQoKSBhbmQKLSAgICAgLndyaXRlKCkgbWV0aG9kIHRvIG1hdGNoIHRoZSBzdGFuZGFyZCBmaWxlLWxpa2Ugb2JqZWN0IG1ldGhvZHMKLSAgICAgKGJ5dGVzIGNvbnN1bWVkIGluZm9ybWF0aW9uIGlzIG5vIGxvbmdlciByZXR1cm5lZCBieSB0aGUgbWV0aG9kcykKLTEuMDogY2hhbmdlZCBlbmNvZGUgQ29kZWMgbWV0aG9kIHRvIGJlIHN5bW1ldHJpYyB0byB0aGUgZGVjb2RlIG1ldGhvZAotICAgICAodGhleSBib3RoIHJldHVybiAob2JqZWN0LCBkYXRhIGNvbnN1bWVkKSBub3cgYW5kIHRodXMgYmVjb21lCi0gICAgIGludGVyY2hhbmdlYWJsZSk7IHJlbW92ZWQgX19pbml0X18gbWV0aG9kIG9mIENvZGVjIGNsYXNzICh0aGUKLSAgICAgbWV0aG9kcyBhcmUgc3RhdGVsZXNzKSBhbmQgbW92ZWQgdGhlIGVycm9ycyBhcmd1bWVudCBkb3duIHRvIHRoZQotICAgICBtZXRob2RzOyBtYWRlIHRoZSBDb2RlYyBkZXNpZ24gbW9yZSBnZW5lcmljIHcvciB0byB0eXBlIG9mIGlucHV0Ci0gICAgIGFuZCBvdXRwdXQgb2JqZWN0czsgY2hhbmdlZCBTdHJlYW1Xcml0ZXIuZmx1c2ggdG8gU3RyZWFtV3JpdGVyLnJlc2V0Ci0gICAgIGluIG9yZGVyIHRvIGF2b2lkIG92ZXJyaWRpbmcgdGhlIHN0cmVhbSdzIC5mbHVzaCgpIG1ldGhvZDsKLSAgICAgcmVuYW1lZCAuYnJlYWtsaW5lcygpIHRvIC5zcGxpdGxpbmVzKCk7IHJlbmFtZWQgdGhlIG1vZHVsZSB1bmljb2RlYwotICAgICB0byBjb2RlY3M7IG1vZGlmaWVkIHRoZSBGaWxlIEkvTyBzZWN0aW9uIHRvIHJlZmVyIHRvIHRoZSBzdHJlYW0gY29kZWNzLgotMC45OiBjaGFuZ2VkIGVycm9ycyBrZXl3b3JkIGFyZ3VtZW50IGRlZmluaXRpb247IGFkZGVkICdyZXBsYWNlJyBlcnJvcgotICAgICBoYW5kbGluZzsgY2hhbmdlZCB0aGUgY29kZWMgQVBJcyB0byBhY2NlcHQgYnVmZmVyIGxpa2Ugb2JqZWN0cyBvbgotICAgICBpbnB1dDsgc29tZSBtaW5vciB0eXBvIGZpeGVzOyBhZGRlZCBXaGl0ZXNwYWNlIHNlY3Rpb24gYW5kCi0gICAgIGluY2x1ZGVkIHJlZmVyZW5jZXMgZm9yIFVuaWNvZGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgdGhlIHdoaXRlc3BhY2UKLSAgICAgYW5kIHRoZSBsaW5lIGJyZWFrIGNoYXJhY3RlcmlzdGljOyBhZGRlZCBub3RlIHRoYXQgc2VhcmNoIGZ1bmN0aW9ucwotICAgICBjYW4gZXhwZWN0IGxvd2VyLWNhc2UgZW5jb2RpbmcgbmFtZXM7IGRyb3BwZWQgc2xpY2luZyBhbmQgb2Zmc2V0cwotICAgICBpbiB0aGUgY29kZWMgQVBJcwotMC44OiBhZGRlZCBlbmNvZGluZ3MgcGFja2FnZSBhbmQgcmF3IHVuaWNvZGUgZXNjYXBlIGVuY29kaW5nOyB1bnRhYmlmaWVkCi0gICAgIHRoZSBwcm9wb3NhbDsgYWRkZWQgbm90ZXMgb24gVW5pY29kZSBmb3JtYXQgc3RyaW5nczsgYWRkZWQKLSAgICAgLmJyZWFrbGluZXMoKSBtZXRob2QKLTAuNzogYWRkZWQgYSB3aG9sZSBuZXcgc2V0IG9mIGNvZGVjIEFQSXM7IGFkZGVkIGEgZGlmZmVyZW50IGVuY29kZXIKLSAgICAgbG9va3VwIHNjaGVtZTsgZml4ZWQgc29tZSBuYW1lcwotMC42OiBjaGFuZ2VkICJzIyIgdG8gInQjIjsgY2hhbmdlZCA8ZGVmZW5jYnVmPiB0byA8ZGVmZW5jc3RyPiBob2xkaW5nCi0gICAgIGEgcmVhbCBQeXRob24gc3RyaW5nIG9iamVjdDsgY2hhbmdlZCBCdWZmZXIgSW50ZXJmYWNlIHRvIGRlbGVnYXRlCi0gICAgIHJlcXVlc3RzIHRvIDxkZWZlbmNzdHI+J3MgYnVmZmVyIGludGVyZmFjZTsgcmVtb3ZlZCB0aGUgZXhwbGljaXQKLSAgICAgcmVmZXJlbmNlIHRvIHRoZSB1bmljb2RlYy5jb2RlY3MgZGljdGlvbmFyeSAodGhlIG1vZHVsZSBjYW4gaW1wbGVtZW50Ci0gICAgIHRoaXMgaW4gd2F5IGZpdCBmb3IgdGhlIHB1cnBvc2UpOyByZW1vdmVkIHRoZSBzZXR0YWJsZSBkZWZhdWx0Ci0gICAgIGVuY29kaW5nOyBtb3ZlIFVuaWNvZGVFcnJvciBmcm9tIHVuaWNvZGVjIHRvIGV4Y2VwdGlvbnM7ICJzIyIKLSAgICAgbm90IHJldHVybnMgdGhlIGludGVybmFsIGRhdGE7IHBhc3NlZCB0aGUgVUNTLTIvVVRGLTE2IGNoZWNraW5nCi0gICAgIGZyb20gdGhlIFVuaWNvZGUgY29uc3RydWN0b3IgdG8gdGhlIENvZGVjcwotMC41OiBtb3ZlZCBzeXMuYm9tIHRvIHVuaWNvZGVjLkJPTTsgYWRkZWQgc2VjdGlvbnMgb24gY2FzZSBtYXBwaW5nLAotICAgICBwcml2YXRlIHVzZSBlbmNvZGluZ3MgYW5kIFVuaWNvZGUgY2hhcmFjdGVyIHByb3BlcnRpZXMKLTAuNDogYWRkZWQgQ29kZWMgaW50ZXJmYWNlLCBub3RlcyBvbiAlLWZvcm1hdHRpbmcsIGNoYW5nZWQgc29tZSBlbmNvZGluZwotICAgICBkZXRhaWxzLCBhZGRlZCBjb21tZW50cyBvbiBzdHJlYW0gd3JhcHBlcnMsIGZpeGVkIHNvbWUgZGlzY3Vzc2lvbgotICAgICBwb2ludHMgKG1vc3QgaW1wb3J0YW50OiBJbnRlcm5hbCBGb3JtYXQpLCBjbGFyaWZpZWQgdGhlIAotICAgICAndW5pY29kZS1lc2NhcGUnIGVuY29kaW5nLCBhZGRlZCBlbmNvZGluZyByZWZlcmVuY2VzCi0wLjM6IGFkZGVkIHJlZmVyZW5jZXMsIGNvbW1lbnRzIG9uIGNvZGVjIG1vZHVsZXMsIHRoZSBpbnRlcm5hbCBmb3JtYXQsCi0gICAgIGJmX2dldGNoYXJidWZmZXIgYW5kIHRoZSBSRSBlbmdpbmU7IGFkZGVkICd1bmljb2RlLWVzY2FwZScgZW5jb2RpbmcKLSAgICAgcHJvcG9zZWQgYnkgVGltIFBldGVycyBhbmQgZml4ZWQgcmVwcih1KSBhY2NvcmRpbmdseQotMC4yOiBpbnRlZ3JhdGVkIEd1aWRvJ3Mgc3VnZ2VzdGlvbnMsIGFkZGVkIHN0cmVhbSBjb2RlY3MgYW5kIGZpbGUKLSAgICAgd3JhcHBpbmcKLTAuMTogZmlyc3QgdmVyc2lvbgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Xcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZywgMTk5OS0yMDAwLCBtYWxAbGVtYnVyZy5jb20KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistQmFycnkK